ApsaraDB for MongoDBシャードクラスターインスタンスにシャードを追加または削除したり、データを移行したりする場合は、balancerのアクティブな時間ウィンドウを変更するか、balancerを有効にするか無効にするかを指定する必要があります。 このトピックでは、バランサーを管理する方法について説明します。
機能の説明
balancerは、シャードクラスタインスタンス内のシャードノード間でデータのバランスを取ることができます。 バランサーの動作原理は、ApsaraDB for MongoDBインスタンスのバージョンによって異なります。
MongoDB 5.0以前のバージョン
balancerは、シャードクラスタインスタンス内の各シャードノードのチャンク数を監視します。 シャードノード上のチャンクの数が指定されたデータ移行しきい値に達すると、バランサーはシャードノード (moveChunk) 上のチャンクを他のシャードノードに移行して、すべてのシャードノードにわたるチャンクの分散のバランスを取ります。 データ移行のしきい値は、インスタンスのバージョンによって異なります。 次の表に、インスタンスバージョンごとのデータ移行のしきい値を示します。
データベースエンジンのバージョン
データ移行のしきい値
MongoDB 3.2 (廃止)
チャンクの総数が20未満の場合、データ移行しきい値は2です。
チャンクの総数が20〜80の場合、データ移行のしきい値は4です。
チャンクの総数が80以上の場合、データ移行しきい値は8です。
MongoDB 3.4 (廃止)
MongoDB 4.0
デフォルトのデータ移行しきい値は2です。
チャンクの総数が20未満の場合、または以前に移行されたチャンクの総数が20未満の場合、データ移行しきい値は1です。
MongoDB 4.2
MongoDB 4.4
MongoDB 5.0
データ移行しきい値は1です。
MongoDB 6.0
ジャンボチャンクが存在すると、次の問題が発生する可能性があります。各シャードノードのチャンク数は同じですが、各シャードノードのスペース使用量は異なります。 この問題を解決するために、balancerは、ApsaraDB for MongoDB 6.0以降のシャードクラスターインスタンスの各シャードノードの同じコレクション内のデータサイズを監視します。 同じコレクション内の2つのシャードノード間のデータサイズの差が384 MB (チャンクサイズの3倍) を超える場合、バランサーはデータをシャードタグごとに分割し、データを別のシャードノード (moveRange) に移行します。
データのバランスが取れているかどうかを判断するには、
getShardDistribution()
コマンドを実行して、コレクション内のデータの分布を表示します。 チャンクの論理的な概念に焦点を当てるのではなく、コレクションのデータサイズのみに焦点を当てる必要があります。
使用上の注意
balancerは、シャードクラスタインスタンスに対してのみサポートされます。
デフォルトでは、balancerは有効になっています。 balancer を有効にする方法については、 balancer の有効化をご参照ください。
デフォルトでは、バランサーのアクティブな時間枠は24時間です。 balancerがチャンクを移行すると、データベースのパフォーマンスが低下することがあります。 チャンクの移行がビジネスに与える影響を回避するために、balancerのアクティブな時間枠をオフピーク時間に変更することを推奨します。 アクティブな時間ウィンドウを設定する方法の詳細については、「balancerのアクティブなウィンドウの設定」をご参照ください。
このトピックの例では、mongoシェルを使用してバランサーを管理します。 他のクライアントツールがバランサーと返された情報を管理するために使用するメソッドは、これらの例とは異なる場合があります。
balancer のアクティブタイムウィンドウの設定
mongosノードに接続した後、mongoシェルで次のコマンドを実行して、configデータベースに切り替えます。
設定の使用
次のコマンドを実行して、balancer のアクティブタイムウィンドウを設定します。
db.settings.update( { _id: "balancer" }, { $set: { activeWindow : { start : "<start-time>", stop : "<stop-time>" } } }, {upsert: true} )
説明<start-time>
: アクティブな時間ウィンドウの開始時刻。 時間をHH:MM形式で指定します。 HH値は00〜23の範囲であり、MM値は00〜59の範囲である。 この形式は、インスタンスがデプロイされているリージョンのローカル時間を示します。<stop-time>
: アクティブな時間ウィンドウの終了時間。 時間をHH:MM形式で指定します。 HH値は00〜23の範囲であり、MM値は00〜59の範囲である。 この形式は、インスタンスがデプロイされているリージョンのローカル時間を示します。
たとえば、バランサーのアクティブな時間枠を毎日午前1時から午前3時に変更する必要があります。 サンプルコマンド:
db.settings.update( { _id: "balancer" }, { $set: { activeWindow : { start : "01:00" 、stop : "03:00" } } } 、 {upsert: true} )
設定が完了したら、
sh.status()
コマンドを実行して、balancerのアクティブな時間ウィンドウを表示できます。 サンプル結果:
関連する操作: バランサーを常に [実行中] 状態にする場合は、次のコマンドを実行して、アクティブな時間ウィンドウの設定を削除します。
db.settings.update({ _id : "balancer" }, { $unset : { activeWindow : true } })
balancer の有効化
シャーディングを設定した場合、バランサーは、バランサーを有効にした後、シャードノード間のバランシング手順をすぐに開始できます。 バランシングはインスタンスのリソースを占有します。 そのため、ピーク時間外に操作を実行することを推奨します。
mongosノードに接続した後、mongoシェルで次のコマンドを実行して、configデータベースに切り替えます。
設定の使用
次のコマンドを実行して、balancer を有効にします。
sh.setBalancerState(true)
balancer の無効化
デフォルトでは、balancerは有効になっています。 バランサーを一時的に無効にするには、次の手順を実行します。
balancerを無効にすると、シャードノード間でデータのバランスが取れなくなります。 これにより、データスキューが発生する可能性があります。
mongosノードに接続した後、mongoシェルで次のコマンドを実行して、configデータベースに切り替えます。
設定の使用
sh.isBalancerRunning()
コマンドを実行して、balancerの実行ステータスを表示します。sh.isBalancerRunning()
コマンドは、mongoシェルクライアントのバージョンに基づいてブール値またはマップ値を返します。Boolean
値falseが返された場合、balancerはタスクを実行しません。 この場合、バランサーを無効にすることができます。
値trueが返された場合、balancerはチャンク移行タスクを実行します。 この場合、balancerを無効にすることはできません。 DDL 操作を実行すると、データの不整合が発生する可能性があります。
地図
{ モード: 'full' 、 inBalancerRound: false、 numBalancerRounds: ロング ("1143") 、 ok: 1, '$clusterTime': { clusterTime: タイムスタンプ ({ t: 1639753724, i: 3 }) 、 署名: { ハッシュ: バイナリ (Buffer.from("0000000000000000000000000000000000000000", "hex"), 0), keyId: ロング ("0") } }, operationTime: タイムスタンプ ({ t: 1639753724, i: 3 }) }
inBalancerRoundパラメーターがfalseに設定されている場合、balancerはタスクを実行しません。 この場合、バランサーを無効にすることができます。
inBalancerRoundパラメーターがtrueに設定されている場合、balancerはチャンク移行タスクを実行します。 この場合、balancerを無効にすることはできません。 DDL 操作を実行すると、データの不整合が発生する可能性があります。
sh.isBalancerRunning()
コマンドの詳細については、「sh.isBalancerRunning() 」をご参照ください。前の手順でこのコマンドの出力が返されないことを確認したら、次のコマンドを実行してバランサーを無効にします。
sh.stopBalancer()