シャードを既存のクラスターに追加すると、シャードされたコレクションごとにチャンク数が最も少ないシャードが自動的に作成されます。つまり、バランスが取れるまで、(チャンクの数が最も多いシャードからの) 移行のデフォルトのターゲットになります。ただし、各シャード プライマリ (移行を担当する) は、一度に 1 つの移行にしか参加できません。そのため、特に負荷がかかっている場合は、バランスを取るのに時間がかかります。
移行自体に関しては、現在のクラスターで既に移行が見られるため、その影響を判断する方法です。ログで最近の移行を表示するか、変更ログ (最新の移行/分割などを含む 10 MB の上限付きコレクション) を確認できます。
// connect to a mongos, switch to the config DB
use config
// look at the changelog
db.changelog.find()
どのような操作が行われるかという点では、チャンクを移動するには:
- そのチャンクを構成するドキュメントは、まだソース シャードにない場合は、ソース シャードのメモリに読み込む必要があります (かなり標準的な読み込み)。
- 次に、宛先シャードに送信されます (かなり標準的な挿入/書き込み)。
- 最後に、メタ データが更新された後、それらはソース シャードから削除されます。
ステップ 3 は削除であり、ソース シャードでの書き込みロックが必要ですが、非常に高速である必要があります。ドキュメントは移行によって既にメモリ内にあります。
移行の頻度を上げることのもう 1 つの影響は、シャード バージョンがより頻繁に更新されることです。特に、メジャー シャード バージョンが更新されます (チャンクからシャードへのマッピングが最新になるようにするため)。
つまり、設定を更新してシャード バージョンを更新する必要がある mongos に関するメッセージがログに記録されます。Map/Reduce や findAndModify などの長時間実行される操作を開始する前に、 flushRouterConfig コマンドを実行することもお勧めします。
シャードの使用率が低い期間がある場合、移行がより迅速に行われることがわかります。また、重大な影響に気付いた場合は、バランサー ウィンドウオプションを使用して、特定の時間にのみバランシングを実行することを検討することもできます。