1

Mongo は、タグ対応シャード データベースの新しく更新されたドキュメントを正しいシャードに移動しますか?

MongoDb ver.で以下の設定をしています。2.4.6 で C# ドライバー 1.8.3 を使用すると、タグ対応シャーディングの更新シナリオで期待される結果が返されませんでした。次のシナリオを確認し、MongoDb でこれが可能かどうかをお知らせください。

実験用に次の設定を行いました。

//use the default 'test' database
db = db.getSiblingDB('test');`

//Add shards
sh.addShard( "shard0001.local:27017" );
sh.addShard( "shard0002.local:27017" );

//Enable sharding for the database,
sh.enableSharding("test");

//Enable sharding for a collection,
sh.shardCollection("test.persons", { "countryCode": 1, "_id": 1 } );

//Add shard tags,
sh.addShardTag("shard0001", "USA");
sh.addShardTag("shard0002", "JPN");

//Tag shard key ranges, 
sh.addTagRange("test.persons", { countryCode: 0 }, { countryCode: 1 }, "USA");
sh.addTagRange("test.persons", { countryCode: 1 }, { countryCode: 2 }, "JPN");

次に、初期データ作成のために次のスクリプトを実行します。

//MongoDB sharding test,
db = db.getSiblingDB('test')

//Load data
//USA: countryCode 0
//JPN: countryCode 1

for (var i=0; i < 1000, i++) {
    db.persons.insert( { name: "USA-" + i, countryCode: 0 } )
          db.persons.insert( { name: "JPN-" + i, countryCode: 1 } )

この時点で、各シャードに 1000 レコード、shard0001 に USA 国コードに 1000 レコード、shard0002 に JPN に 1000 レコードがあります。

C# から、次の擬似コードが得られます。

collection.insert( 1 document of countryCode=0)
collection.insert( 1 document of countryCode=1)

実行すると、各シャードに 1001 個のドキュメントがあり、これまでのところ問題ありません。

次に、shard0001 の 1 つのドキュメントを、countryCode=0 から countryCode=1 に _id で更新しました。しかし、JPNシャード(shard0002)に1002レコード、USAシャード(shard0001)に1001レコードという結果になりました。Mongos は、新しい countryCode 1 に基づいて更新を shard0002 にルーティングして挿入を実行し、shard0001 のドキュメントを更新していないようです。したがって、2 つの異なるシャードに同じ _id の 2 つのドキュメントがあります。

mongo が shard0001 の実際のドキュメントを更新すると予想していましたが、countryCode を 0 から 1 に変更すると、そのドキュメントが代わりに shard0002 に移動することに気付きました。Mongo はこれを自動的に行いますか?

ドキュメント レコードを shard0001 から手動で削除できることはわかっていますが、これを自分で手動で行う必要はありますか?

4

1 に答える 1

0

キー範囲の割り当てに関するドキュメントを確認すると、次の通知があります。タグ. 定義された範囲をオーバーラップしたり、同じ範囲に複数回タグを付けたりすることはできません. "理由は、バックグラウンドでmongodbが分割を作成して、その特定のタグのキー範囲にのみ関連するチャンクを作成し、この方法に従って移動できるようにするためです.タグ付け。したがって、タグによって定義された配置は、次の 2 つの手順で保証されます。

  • エンジンは、1 つのシャード タグ専用のキー範囲を持つチャンクを持つように分割します
  • バランシング ラウンドのチャンクは、現在のシャード タグ マッピングに従って配置/移動されます。

mongos インスタンス経由ではなく、そこに直接接続されているシャードの側からドキュメントの数を確認したと思います。 バグであるかどうかにかかわらず、最終的に 2 つのドキュメントが作成されましたが、シャード キー マッピングが原因で、キー範囲ベースの配置により、mongos を介してそれらの 1 つにしかアクセスできません。自動的に削除されない場合は、間違いなくバグであり、対処する必要があります。現在の場所からジラを確認できません。テストを設定し、結果をご連絡します。これは、説明されている動作を誤解していたためです。

save コマンドを使用して更新を実行したというコメントとこのドキュメントに基づいて、状況はドキュメントを

{国コード:0 _id:x}

新しいものである組み合わせ (以前は {countrycode:1 _id:x} でした) _id は別のドキュメント (古いもの) と同じであり、新しいドキュメントは別のシャードに存在します (これは、タグ付けは国コードに基づいています)、_id フィールドの一意性は特定のシャードおよびコレクション内でのみ保証されるため、問題なく挿入されます。異なるシャードで _id がシャード キーでない場合、または複合シャード キーの最初のキーでない場合、_id フィールドの値がグローバルに一意であるという保証はありません。基本的に、生成されたときに一意である可能性が最も高くなりますが、提案時に同じ _id を指定して更新の種類の動作を実行するという状況にもかかわらずです。

あなたの質問に答えるには:この状況があなたにとって予期されていない場合は、古いドキュメントを削除して新しいドキュメントを作成するか、古いドキュメントを削除済みとしてマークする必要があります(フラグなどを使用して処理します)アプリケーション側で)、後で削除されたドキュメントを探し、必要に応じて実際に削除します (スペースが不足した場合)。

于 2013-10-15T09:31:27.460 に答える