1

MongoDB のレプリカとディストリビューションをテストするために使用するテスト環境に 4 台のサーバーがあります。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} );

私は何を間違っていますか?

4

2 に答える 2

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 に答える
0

mongos プロセスを介してノードに接続すると、すべてにデータが含まれているように見えます。出力から、すべてのデータがすべてのノードで利用できるようには見えません。RepSetA は 2 つのチャンクを保持し、RepSetB には何も含めないでください。これは、mongos ではなくノードに直接接続することで確認できます。
ちなみに、MongoDB の ObjectId を _id (シャード キー) として使用している場合は、別のキーでシャードすることを検討してください。これにより、キーが単調に変化するため、すべての挿入が 1 つのノードに行われることになります。

于 2012-06-12T07:24:42.813 に答える