2012-01-16 64 views
2

有沒有辦法在mongo中訪問分片分辨率算法?我知道db.printShardingStatus(),但這需要我寫我自己的邏輯來挖掘關鍵。我希望有這樣的事情:mongo sharding:確定哪個分片/主機會解析爲

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

我猜這是mongos在路由時做的事情。

對於上下文,我將很大數量的數據傳輸到mongo中。有數據採集器使用EmMachine將數據流式傳輸到預處理器機器,後者執行一些數據清理,然後插入本地mongod。我想要做的是對於每一條數據,收集器都將遵循分片策略並將其傳送到相應的預處理器機器。觸發器會完成同樣的事情,但mongo沒有AFAIK。

回答

2

所以簡短的回答是是的,這是可能的,但我不知道你會找到你要找的命令。

MongoDB sharding非常簡單。配置數據庫包含密鑰範圍,這些密鑰範圍指向正確的主機。配置數據庫實際上只是普通的數據庫,您可以直接從外殼或驅動程序連接到這些數據庫。 (它們通常運行在不同的默認端口上以避免意外連接)。

因此,您只需查看可用範圍即可輕鬆查找主機。邏輯不會比for循環更復雜,直到您的密鑰在範圍內。

有關手動控制分片look here細節。這將提供一些有關正在發生的事情的信息。

請注意,以上所有建議均爲「保修無效」。 mongos(路由器)和配置數據庫背後的全部概念是要抽象出這種複雜性。通過做你正在做的事情,你將不得不「看看引擎蓋下」。

0

一個好辦法找到哪個碎片是一個數據是使用:解釋()外殼幫手。

它將顯示在哪個分片是您的密鑰。

+0

這是最直接的方式。謝謝! – phillee 2012-01-19 14:16:01

3

找到最直接的方法。分片信息存儲在配置數據庫(令人驚訝的是,沒有找到這方面的文檔)。要檢索塊信息,使用方法:

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

旁註

我想通了這一點通過打印printShardStatus功能:

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