MongoDB将数据复制到所有分片

时间:2012-06-12 07:15:42

标签: mongodb sharding replicate

我在测试环境中有4台服务器用于测试MongoDB副本和分发: RepSetA保存RepSetA1和RepSetA2。 RepSetB保存RepSetB1和RepSetB2。 所有服务器都充当路由器,RepSetA1充当单个配置服务器。

我有一个“播放器”数据(10,000条记录,该对象包含“Id”和“名称”字段),我希望它在副本集之间进行分片(或分发),并在服务器之间进行克隆在同一副本集中。所以,仅举一个简单的例子: 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} );

我做错了什么?

2 个答案:

答案 0 :(得分:0)

如果通过mongos进程连接到节点,它看起来都包含数据。从您的输出中,看起来所有节点上的所有数据都不可用。 RepSetA包含2个块,RepSetB应该不包含任何块。您可以通过直接连接节点而不是通过mongos来验证这一点 顺便说一句,如果您使用MongoDBs ObjectId作为_id(分片键),请考虑在另一个键上进行分片,因为这将导致所有插入在密钥更改为单调时成为一个节点。

答案 1 :(得分:0)

这很好。它并未显示所有数据都在所有服务器上。输出显示GamesDB.Player的所有块(数据)都在shard 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