0

シャーディング キーが UUID (16 進文字列) であるコレクションがあります。コレクションは膨大です: 8 億 1,200 万のドキュメント、2 つのシャードに約 9,600 のチャンクがあります。何らかの理由で、UUID の代わりにシャーディング キー フィールドに整数を持つドキュメントを最初に保存しました。後でそれらを完全に削除しましたが、今ではすべてのドキュメントが UUID によって分割されています。しかし、私は現在、チャンクの配布に関する問題に直面しています。UUID ではなく整数のドキュメントがありましたが、バランサーはこれらのドキュメントに対して約 2700 のチャンクを作成し、それらすべてを 1 つのシャードに残しました。これらのドキュメントをすべて削除しても、チャンクは削除されず、空のままで、現在は UUID しか使用していないため、常に空のままです。バランサーは、ドキュメントの数やサイズではなく、シャードごとのチャンク数に基づいてチャンクを分散するため、シャードの 1 つは別のシャードの 3 倍のディスク容量を必要とします。

--- Sharding Status ---
db.click chunks:
    set1    4863
    set2    4784    // 2717 of them are empty

set1> db.click.count()
191488373

set2> db.click.count()
621237120

ここで悲しいことに、mongodb はチャンクを手動で削除またはマージするコマンドを提供していません。私の主な質問は、空のチャンクを取り除くためにこの作業を行うにはどうすればよいかということです:

  1. バランサーを停止します。各構成サーバーに接続し、空のチャンクの範囲から削除し、最初の空でないチャンクの先頭で終了するようにスライスをconfig.chunks修正します。minKeyバランサーを起動します。危険に思えますが、私が見る限りconfig.chunks、チャンク情報が保存される唯一の場所です。

  2. バランサーを停止します。新しい mongod インスタンスを開始し、それを 3 番目のシャードとして接続します。すべての空のチャンクをこの新しいシャードに手動で移動し、完全にシャットダウンします。バランサーを起動します。確かではありませんが、シャーディング キーに整数値を再度使用しない限り、すべてのクエリが正常に実行されるはずです。

4

2 に答える 2

0

これを読んで、空のチャンクがスペースを占有していると考える人もいるかもしれません。そうではありません-チャンク自体はスペースを占有しません-それらはシャードキーの論理範囲です。

ただし、シャード間のチャンク バランシングは、各チャンクのサイズではなく、チャンクの数に基づいています。

このチケットにあなたの声を追加することをお勧めします: https://jira.mongodb.org/browse/SERVER-2487

于 2013-03-16T21:18:20.747 に答える