今回は「MongoDBのシャードクラスタバランサー」についてまとめます。
概要
MongoDB のバランサーはバックグランドでシャーディングサーバー間でチャンク数が均等になるよう平準化を行います。 平準化はシャードクラスタ内の「最もチャンクが多いシャードのチャンク数」と「最もチャンクが少ないシャードのチャンク数」の差(平準化基準)が一定値を超えたときに開始されます。 平準化処理自体は MongoDB の利用側から見ると透過的ですが、性能劣化するのでいくつか動作制限があります。
平準化基準
平準化操作がシャードクラスタに及ぼす影響を最小限にするため、バランサーは以下の閾値を超えたときだけ平準化操作を行います。 閾値とは「"チャンクが最も多いシャード" と "チャンクが最も少ないシャード" のチャンク数の差」です。
チャンク数 | 閾値 |
---|---|
20未満 | 2 |
20~79 | 4 |
80以上 | 8 |
平準化時の動作制限
バランサーの平準化操作(チャンクの移動)は利用している側(ユーザーまたはアプリケーション)から見ると透過的ですが、チャンク移動中は性能劣化する可能性があります。 MongoDBではできるだけ性能劣化を防ぐため、平準化操作には以下のような制限が設けられています。
- 1度に実施できるチャンクの移動は1つだけ。
ただし、MongoDB 3.4 以降ではシャード n 台の場合、 n/2 (切り捨て) まで同時に実行できる。 - 平準化基準を満たしたときだけチャンクの移動を実行。
平準化プロセスは設定サーバーのレプリカセット内のプライマリサーバーで実行されます。
平準化プロセス
バランサーは以下の手順でチャンクをシャードサーバー間で移動させます。
-
バランサーは
moveChunk
コマンドを移動元シャードサーバーへ送信します。 -
チャンク移動元シャードサーバーはチャンクの移動を開始します。
チャンクへの書き込みは移動元シャードサーバーで受け付けます。 -
チャンク移動先シャードサーバーでは、移動元シャードサーバーに存在して移動先シャードサーバーに存在しないインデックスを構築します。
-
移動先シャードサーバーは移動元シャードサーバーにドキュメントの移動要求を行い、チャンクの移動を開始します。
-
チャンク内のすべてのドキュメントを移動後、移動先シャードサーバーは同期処理を実行して、ドキュメント移動中に発生した変更操作を反映します。
-
すべての同期が終わると、移動元シャードサーバーは設定サーバーへ接続してチャンクの保存場所を保存したメタデータを更新します。
-
メタデータ更新後、移動元シャードサーバーのチャンクに接続中のカーソルがなければチャンクを削除します。
今回は「MongoDBのバランサー」についてまとめました。 参考になったでしょうか? 本記事がお役に立っていると嬉しいです!!
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!