1

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

我有一个“播放器”数据(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} );

我究竟做错了什么?

4

2 回答 2

0

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

于 2012-06-12T07:24:42.813 回答
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

于 2012-06-12T08:00:37.750 回答