mongo sharding:确定密钥将解析为哪个分片/主机

时间:2012-01-16 23:14:25

标签: mongodb

有没有办法在mongo中访问分片解析算法?我知道db.printShardingStatus(),但这要求我编写自己的逻辑来解决问题。我希望有类似的东西:

db.collection.runCommand( { getShardsvr : "my-key" } );
> {"ok" : 1 , "shardsvr" : "hostname"}

我猜这是mongos路线时的作用。

对于上下文,我将大量数据流式传输到mongo中。有数据收集器使用EmMachine将数据流传输到预处理器机器,这些机器进行一些数据清理然后插入本地mongod。我想做的是对于每个数据,收集器将遵循分片策略并将其流式传输到相应的预处理器机器。触发器将完成相同的事情,但mongo没有它们AFAIK。

3 个答案:

答案 0 :(得分:3)

找到最直接的方式。分片信息存储在配置db中(令人惊讶的是,没有找到太多关于此的文档)。要检索块信息,请使用:

mongos> use config
switched to db config
mongos> db.chunks.find()

旁注

我通过打印printShardStatus函数来解决这个问题:

> print( db.printShardingStatus )
function (verbose) {
    printShardingStatus(this.getSiblingDB("config"), verbose);
}

答案 1 :(得分:2)

所以简短的回答是是的,这是可能的,但我不知道你会找到你正在寻找的命令。

MongoDB分片非常简单。配置数据库包含键范围,这些键范围指向正确的主机。配置数据库实际上只是常规数据库,您可以直接从shell或驱动程序连接到这些数据库。 (它们通常在不同的默认端口上运行以避免意外连接)。

因此,您只需查看可用范围即可轻松查找主机。在您的密钥在范围内之前,逻辑并不比for循环复杂。

有关手动控制分片look here的详细信息。这将提供对正在发生的事情的一些了解。

请注意,上述所有建议均为“保修无效”。 mongos(路由器)和配置数据库背后的整个概念是抽象这种复杂性。通过做你正在做的事情,你将不得不“深入了解”。

答案 2 :(得分:0)

查找哪个分片是一段数据的好方法是使用:explain()shell helper。

它将显示哪个碎片是您的密钥。