6

mongoでの単純なシャーディング設定のように見える問題が発生しています。

2つのシャード、1つのmongosインスタンス、および1つの構成サーバーを次のように設定しています。

マシンA-10.0.44.16-構成サーバー、mongos
マシンB-10.0.44.10-シャード1
マシンC-10.0.44.11-シャード2

コレクション内のすべてのドキュメントに存在し、4つの値のいずれかを含むフィールドであるシャードキー「SeedType」を持つ「Seeds」というコレクションがあります(以下のシャーディングステータスを確認してください)。値のうちの2つには、他の2つよりも大幅に多くのエントリがあります(2つにはそれぞれ784,000のレコードがあり、2つには約5,000のレコードがあります)。

私が期待している動作は、InventoryPOSを使用した「Seeds」コレクションのレコードが一方のシャードに配置され、InventoryOnHandを使用したレコードがもう一方のシャードに配置されることです。

ただし、2つの大きなシャードキーの両方のすべてのレコードがプライマリシャードに配置されるようです。

これが私のシャーディングステータステキストです(わかりやすくするために他のコレクションは削除されています):

---シャーディングステータス---
  シャーディングバージョン:{"_id":1、 "バージョン":3}
  破片:
      {"_id": "shard0000"、 "host": "10.44.0.11:27019"}
      {"_id": "shard0001"、 "host": "10.44.0.10:27017"}
  データベース:
        {"_id": "admin"、 "partitioned":false、 "primary": "config"}
        {"_id": "TimMulti"、 "partitioned":true、 "primary": "shard0001"}
                TimMulti.Seedsチャンク:
                        {"SeedType":{$ minKey:1}}->> {"SeedType": "PBI.AnalyticsServer.KPI"} on:shard0000 {"t":2000、 "i":0}
                        {"SeedType": "PBI.AnalyticsServer.KPI"}->> {"SeedType": "PBI.Retail.InventoryOnHand"} on:shard0001 {"t":2000、 "i":7}
                        {"SeedType": "PBI.Retail.InventoryOnHand"}->> {"SeedType": "PBI.Retail.InventoryPOS"} on:shard0001 {"t":2000、 "i":8}
                        {"SeedType": "PBI.Retail.InventoryPOS"}->> {"SeedType": "PBI.Retail.SKU"} on:shard0001 {"t":2000、 "i":9}
                        {"SeedType": "PBI.Retail.SKU"}->> {"SeedType":{$ maxKey:1}} on:shard0001 {"t":2000、 "i":10}

私は何か間違ったことをしていますか?

半無関係な質問:

mongoサービス全体をブロックせずに、あるコレクションから別のコレクションにオブジェクトをアトミックに転送するための最良の方法は何ですか?

よろしくお願いします、-Tim

4

1 に答える 1

6

シャーディングは、実際にはこのように使用するためのものではありません。MongoDB が適切なサイズのチャンクを作成できるように、いくつかのバリエーションを持つシャード キーを選択する (または複合シャード キーを作成する) 必要があります。シャーディングのポイントの 1 つは、アプリケーションがデータの場所を知る必要がないことです。

手動で分割する場合は、リンクされていない MongoDB サーバーを起動し、クライアント側から自分でルーティングする必要があります。

最後に、このセットアップに専念している場合は、自分でチャンクを移行できます (moveChunk コマンドがあります)。

バランサーは、メモリにマップされている量に基づいてチャンクを移動します (serverStatus を実行し、「マップされた」フィールドを確認します)。しばらく時間がかかる場合があります。MongoDB は本番環境でデータが飛び交うことを望んでいないため、かなり保守的です。

ほぼ無関係な答え: シャーディングを使用してアトミックに行うことはできません (eval は複数のサーバー間でアトミックではありません)。findOne、挿入、削除を行う必要があります。

于 2010-09-10T21:04:47.763 に答える