2010-09-10 46 views
5

我遇到了mongo中似乎是一個簡單的碎片設置的問題。Mongo sharding無法拆分碎片之間的大集合

我有兩個碎片,一個mongos實例,一個配置服務器設置是這樣的:

機A - 10.0.44.16 - 配置服務器,mongos
機器B - 10.0.44.10 - 碎片1
計算機C - 10.0.44.11 - 碎片2

我有一個叫做「種子」收集具有片鍵「SeedType」,這是一個領域,存在於集合中的每個文檔,包含四位一體值(看看下面的分片狀態)。其中兩個值具有比另外兩個值大得多的條目(其中兩個具有784,000條記錄,其中兩條具有約5,000條記錄)。

我期待看到的行爲是,使用InventoryPOS的'Seeds'集合中的記錄將在一個碎片上結束,而使用InventoryOnHand的記錄將在另一個碎片上結束。

但是,似乎兩個較大分片鍵的所有記錄都在主分片上結束。

這裏是我的分片狀態文本(爲了清楚起見移除其他集合):

--- Sharding Status --- 
    sharding version: { "_id" : 1, "version" : 3 } 
    shards: 
     { "_id" : "shard0000", "host" : "10.44.0.11:27019" } 
     { "_id" : "shard0001", "host" : "10.44.0.10:27017" } 
    databases: 
     { "_id" : "admin", "partitioned" : false, "primary" : "config" } 
     { "_id" : "TimMulti", "partitioned" : true, "primary" : "shard0001" } 
       TimMulti.Seeds chunks: 
         { "SeedType" : { $minKey : 1 } } -->> { "SeedType" : "PBI.AnalyticsServer.KPI" } on : shard0000 { "t" : 2000, "i" : 0 } 
         { "SeedType" : "PBI.AnalyticsServer.KPI" } -->> { "SeedType" : "PBI.Retail.InventoryOnHand" } on : shard0001 { "t" : 2000, "i" : 7 } 
         { "SeedType" : "PBI.Retail.InventoryOnHand" } -->> { "SeedType" : "PBI.Retail.InventoryPOS" } on : shard0001 { "t" : 2000, "i" : 8 } 
         { "SeedType" : "PBI.Retail.InventoryPOS" } -->> { "SeedType" : "PBI.Retail.SKU" } on : shard0001 { "t" : 2000, "i" : 9 } 
         { "SeedType" : "PBI.Retail.SKU" } -->> { "SeedType" : { $maxKey : 1 } } on : shard0001 { "t" : 2000, "i" : 10 }

難道我做錯了什麼?

半無關的問題:

什麼是原子轉移從一個集合到另一個對象,而不會阻塞整個蒙戈服務的最佳方式?

由於提前, -Tim

回答

6

拆分真的並不意味着使用這種方式。你應該選擇帶有一些變化的分片鍵(或者創建一個複合分片鍵),這樣MongoDB可以製作合理大小的塊。分片的一點是你的應用程序不必知道你的數據在哪裏。

如果你想手動分片,你應該這樣做:啓動未鏈接的MongoDB服務器並自行從客戶端路由事物。最後,如果您真的致力於此設置,您可以自己遷移塊(有一個moveChunk命令)。

平衡器根據內存中映射的內存大小(運行serverStatus並查看「映射」字段)來移動塊。可能需要一段時間,MongoDB不希望你的數據在生產環境中飛行,所以它非常保守。

半無關的答案:你不能用分片自動完成它(eval在多個服務器間不是原子的)。你必須做一個findOne,插入,刪除。