有没有办法在mongo中访问分片解析算法?我知道db.printShardingStatus()
,但这要求我编写自己的逻辑来解决问题。我希望有类似的东西:
db.collection.runCommand( { getShardsvr : "my-key" } );
> {"ok" : 1 , "shardsvr" : "hostname"}
我猜这是mongos路线时的作用。
对于上下文,我将大量数据流式传输到mongo中。有数据收集器使用EmMachine将数据流传输到预处理器机器,这些机器进行一些数据清理然后插入本地mongod。我想做的是对于每个数据,收集器将遵循分片策略并将其流式传输到相应的预处理器机器。触发器将完成相同的事情,但mongo没有它们AFAIK。
答案 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。
它将显示哪个碎片是您的密钥。