シャーディング キーが 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 はチャンクを手動で削除またはマージするコマンドを提供していません。私の主な質問は、空のチャンクを取り除くためにこの作業を行うにはどうすればよいかということです:
バランサーを停止します。各構成サーバーに接続し、空のチャンクの範囲から削除し、最初の空でないチャンクの先頭で終了するようにスライスを
config.chunks
修正します。minKey
バランサーを起動します。危険に思えますが、私が見る限りconfig.chunks
、チャンク情報が保存される唯一の場所です。バランサーを停止します。新しい mongod インスタンスを開始し、それを 3 番目のシャードとして接続します。すべての空のチャンクをこの新しいシャードに手動で移動し、完全にシャットダウンします。バランサーを起動します。確かではありませんが、シャーディング キーに整数値を再度使用しない限り、すべてのクエリが正常に実行されるはずです。