すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB for MongoDB:ApsaraDB for MongoDB バランサー(balancer)の管理

最終更新日:Jun 13, 2024

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 のアクティブタイムウィンドウの設定

  1. mongo shellを使用したApsaraDB for MongoDBシャードクラスターインスタンスへの接続

  2. mongosノードに接続した後、mongoシェルで次のコマンドを実行して、configデータベースに切り替えます。

    設定の使用
  3. 次のコマンドを実行して、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 の有効化

シャーディングを設定した場合、バランサーは、バランサーを有効にした後、シャードノード間のバランシング手順をすぐに開始できます。 バランシングはインスタンスのリソースを占有します。 そのため、ピーク時間外に操作を実行することを推奨します。

  1. mongo shellを使用したApsaraDB for MongoDBシャードクラスターインスタンスへの接続

  2. mongosノードに接続した後、mongoシェルで次のコマンドを実行して、configデータベースに切り替えます。

    設定の使用
  3. 次のコマンドを実行して、balancer を有効にします。

    sh.setBalancerState(true)

balancer の無効化

デフォルトでは、balancerは有効になっています。 バランサーを一時的に無効にするには、次の手順を実行します。

説明

balancerを無効にすると、シャードノード間でデータのバランスが取れなくなります。 これにより、データスキューが発生する可能性があります。

  1. mongo shellを使用したApsaraDB for MongoDBシャードクラスターインスタンスへの接続

  2. mongosノードに接続した後、mongoシェルで次のコマンドを実行して、configデータベースに切り替えます。

    設定の使用
  3. 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() 」をご参照ください。

  4. 前の手順でこのコマンドの出力が返されないことを確認したら、次のコマンドを実行してバランサーを無効にします。

    sh.stopBalancer()