ApsaraDB for MongoDB のシャードクラスターインスタンスにおいて、バランサーはシャードノード間でデータを均等に分散します。このトピックでは、バランサーのステータス確認、アクティブ時間ウィンドウのスケジュール設定、およびバランサーの有効化/無効化の方法について説明します。
このトピックのすべての例では mongo シェルを使用します。コマンドおよび出力は、他のクライアントツールでは異なる場合があります。
仕組み
バランサーはシャードノード間のデータ分布を監視し、自動的にデータを移行してバランスを維持します。その動作はデータベースエンジンバージョンによって異なります。
MongoDB 5.0 以前
バランサーは各シャードノード上のチャンク数を追跡します。シャードノード間の差が移行のしきい値に達すると、バランサーはチャンクを移行 (moveChunk) してクラスターのバランスを再調整します。
| データベースエンジンバージョン | 移行のしきい値 |
|---|---|
| MongoDB 4.2、4.4、5.0 | 1 |
| MongoDB 3.4 (提供終了)、MongoDB 4.0 | デフォルト: 2。合計チャンク数が 20 未満、または以前に移行されたチャンク数が 20 未満の場合、1 に減少します。 |
| MongoDB 3.2 (提供終了) | 合計チャンク数 < 20: しきい値は 2。合計チャンク数 20~80: しきい値は 4。合計チャンク数 >= 80: しきい値は 8。 |
MongoDB 6.0
バランサーはチャンク数をカウントする代わりに、各シャードノード上のコレクションごとのデータサイズを監視します。同じコレクション内で 2 つのシャードノード間のデータサイズの差が 384 MB (デフォルトのチャンクサイズの 3 倍) を超えると、バランサーはシャードタグによってデータを分割し、moveRange を使用して移行します。
データが均等に分散されているかを確認するには、getShardDistribution() を実行し、チャンク数ではなくデータサイズに注目してください。
注意事項
バランサーはシャードクラスターインスタンスでのみサポートされます。
デフォルトでは、バランサーは有効になっており、アクティブ時間ウィンドウは 24 時間 (常時実行) に設定されています。
チャンクの移行はインスタンスのリソースを消費し、データベースのパフォーマンスを低下させる可能性があります。オフピーク時間にアクティブ時間ウィンドウをスケジュールすることを推奨します。
バランサーのステータスの確認
バランサーを無効にする前に、移行タスクがアクティブに実行されているかどうかを確認してください。
次のコマンドを実行します:
sh.isBalancerRunning()戻り値の型に基づいて結果を解釈します: Map の戻り値 一部の mongo シェルバージョンは Map オブジェクトを返します。
inBalancerRoundフィールドを確認してください。詳細については、「sh.isBalancerRunning()」をご参照ください。ブール値の戻り値
値 意味 falseバランサーはアイドル状態です。バランサーを無効にできます。 trueバランサーはチャンクを移行中です。データ不整合の原因となる可能性があるため、無効にしないでください。 inBalancerRoundの値意味 falseバランサーはアイドル状態です。バランサーを無効にできます。 trueバランサーはチャンクを移行中です。データ不整合の原因となる可能性があるため、無効にしないでください。 { mode: 'full', inBalancerRound: false, numBalancerRounds: Long("1143"), ok: 1, '$clusterTime': { clusterTime: Timestamp({ t: 1639753724, i: 3 }), signature: { hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0), keyId: Long("0") } }, operationTime: Timestamp({ t: 1639753724, i: 3 }) }
アクティブ時間ウィンドウの設定
業務時間中のパフォーマンスへの影響を避けるため、特定の時間帯にのみバランサーが実行されるようにスケジュールします。
config データベースに切り替えます:
use configアクティブ時間ウィンドウを設定します。プレースホルダーを実際の値に置き換えてください。例: バランサーが毎日 01:00 から 03:00 まで実行されるようにスケジュールします:
説明時刻は、インスタンスがデプロイされているリージョンのローカルタイムゾーンを使用します。
プレースホルダー 説明 フォーマット <start-time>アクティブ時間ウィンドウの開始時刻 HH:MM (HH: 00~23, MM: 00~59) <stop-time>アクティブ時間ウィンドウの終了時刻 HH:MM (HH: 00~23, MM: 00~59) db.settings.update( { _id: "balancer" }, { $set: { activeWindow : { start : "<start-time>", stop : "<stop-time>" } } }, { upsert: true } )db.settings.update( { _id: "balancer" }, { $set: { activeWindow : { start : "01:00", stop : "03:00" } } }, { upsert: true } )sh.status()を実行して構成を確認します。出力にはアクティブ時間ウィンドウが含まれます:
アクティブ時間ウィンドウの削除
24 時間の継続的なバランシングに戻すには、アクティブ時間ウィンドウを削除します:
db.settings.update({ _id : "balancer" }, { $unset : { activeWindow : true } })バランサーの有効化
バランサーを有効にすると、シャーディングが構成されている場合、すぐにデータのバランシングを開始します。これによりインスタンスのリソースが消費されます。この操作はオフピーク時間に実行してください。
config データベースに切り替えます:
use configバランサーを有効にします:
sh.setBalancerState(true)
バランサーの無効化
バランサーを無効にすると、バランサーはシャードノード間でデータをバランシングしなくなります。これにより、データスキューが発生する可能性があります。
config データベースに切り替えます:
use configバランサーがアクティブにデータを移行しているかどうかを確認します。戻り値の解釈の詳細については、「バランサーのステータスの確認」をご参照ください。
結果が
false(Map の戻り値の場合はinBalancerRound: false) の場合、次のステップに進みます。結果が
true(またはinBalancerRound: true) の場合は、現在の移行が完了するまで待ってから続行してください。移行中にバランサーを無効にすると、データ不整合が発生する可能性があります。
sh.isBalancerRunning()バランサーがアイドル状態であることを確認した後、無効にします:
sh.stopBalancer()