2012-06-12 53 views
1

我在用於測試MongoDB副本和分發的測試環境中有4個服務器: RepSetA包含RepSetA1和RepSetA2。 RepSetB保存RepSetB1和RepSetB2。 所有服務器充當路由器,RepSetA1充當單個配置服務器。MongoDB將數據複製到所有分片

我有一個「播放器」數據(10,000條記錄,該對象包含一個「Id」和「Name」字段),我希望它在副本集之間被分片(或分佈),並克隆服務器在同一副本集中。所以,只是一個簡單的例子: Player1-5000:存在於RepSetA1和RepSetA2中,但不存在於RepSetB1和RepSetB2中。 Player5000-10000:存在於RepSetB1和RepSetB2中,但不存在於RepSetA1和RepSetA2中。

我得到的是所有4個服務器中的所有玩家。

如果我打印了分片狀態,我得到如下:

mongos> db.printShardingStatus(); 

--- Sharding Status --- 
    sharding version: { "_id" : 1, "version" : 3 } 
    shards: 

     { "_id" : "RepSetA", "host" : "RepSetA/MongoRepSetA1:27018,MongoRepSetA2:27018" } 
     { "_id" : "RepSetB", "host" : "RepSetB/MongoRepSetB1:27018,MongoRepSetB2:27018" } 
    databases: 
     { "_id" : "admin", "partitioned" : false, "primary" : "config" } 
     { "_id" : "GamesDB", "partitioned" : true, "primary" : "RepSetA" } 
       GamesDB.Player chunks: 
           RepSetA 2 
         { "_id" : { $minKey : 1 } } -->> { "_id" : 0 } on : RepSetA { "t" : 1000, "i" : 1 } 
         { "_id" : 0 } -->> { "_id" : { $maxKey : 1 } } on : RepSetA { "t" : 1000, "i" : 2 } 
     { "_id" : "test", "partitioned" : false, "primary" : "RepSetB" } 
     { "_id" : "EOO", "partitioned" : false, "primary" : "RepSetB" } 

我用下面的命令來構建碎片:

db.adminCommand({ addShard : "RepSetA/MongoRepSetA1:27018,MongoRepSetA2:27018" }) 
db.adminCommand({ addShard : "RepSetB/MongoRepSetB1:27018,MongoRepSetB2:27018" }) 
db.runCommand({ enablesharding : "GamesDB" }); 
db.runCommand({ shardcollection : "GamesDB.Player", key : { _id :1 } , unique : true}); 

我在做什麼錯?

+0

您是如何查詢哪些玩家存在於哪個分片上的? –

+0

使用MongoVue GUI,甚至嘗試連接到特定的服務器並執行「db.Player.find()。limit(100);」 – nirpi

回答

0

如果通過mongos進程連接到節點,它看起來將全部包含數據。從你的輸出看,它看起來並不像所有節點上都有可用的數據。 RepSetA包含2個塊,RepSetB包含none。您可以通過直接連接您的節點而不是通過mongos來驗證。
順便說一句,如果您使用MongoDB的ObjectId作爲_id(分片鍵),考慮在另一個鍵上分片,因爲這將導致所有的插入被製作爲一個節點,因爲鍵變爲單調。

+0

如果我使用MongoVue或Mongo.exe直接連接它們,我仍然可以在RepSetA1和RepSetB1(它們位於不同的副本集)上看到相同的記錄。 – nirpi

+0

正如gregor和我指出的那樣,數據被正確地分片並且不被複制到所有節點。你有沒有連接到RepSetB,而不是意外地連接到RepSetA?你使用什麼版本?我可以想象的唯一的事情是,可能導致這種現象的原因是mongo.exe和MongoGUI自動連接到mongos而不是mongod。無論如何,我非常懷疑,這是事實。 RepSetA和RepSetB實際上指向不同的IP /服務器?也許這些指向相同,所以它看起來像你有RepSetA和RepSetB,而只有RepSetA。 – philnate

+0

我試着查詢RepSetA(MongoRepSetA1和MongoRepSetA2)的服務器 - 它包含10,000條插入記錄,同樣10,000條記錄也出現在RepSetB(MongoRepSetB1和MongoRepSetB2)的服務器中。我仔細檢查了一切。我正在使用最新的Mongo版本(mongodb-win32-x86_64-2.0.5)。順便說一句,我剛剛嘗試使用MongoVue刪除MongoRepSetA1中的一條記錄,並將其從所有其他節點中刪除。 – nirpi

0

這很好。它並不顯示所有數據都在所有服務器上。輸出顯示GamesDB.Player的所有塊(數據)是對碎片RepSetA

GamesDB.Player chunks: 
          RepSetA 2 
        { "_id" : { $minKey : 1 } } -->> { "_id" : 0 } on : RepSetA { "t" : 1000, "i" : 1 } 
        { "_id" : 0 } -->> { "_id" : { $maxKey : 1 } } on : RepSetA { "t" : 1000, "i" : 2 } 

這意味着平衡器還沒有開始平衡你的塊。平衡器僅在有8個區塊差異時纔會啓動。 http://www.mongodb.org/display/DOCS/Sharding+Administration#ShardingAdministration-Balancing

您可以通過手動分割塊強制平衡(如果你想) http://www.mongodb.org/display/DOCS/Splitting+Shard+Chunks

或者,如果你想看到平衡就可以更快地減少塊大小。 http://www.mongodb.org/display/DOCS/Sharding+Administration#ShardingAdministration-ChunkSizeConsiderations

+0

看起來不錯,但是如果使用MongoVue或Mongo.exe直接連接它們,我會在RepSetA1和RepSetB1(位於不同的副本集)中看到相同的記錄。 – nirpi

相關問題