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

ApsaraDB for MongoDB:シャードのパフォーマンスを最大化するためのシャードの構成

最終更新日:Sep 25, 2024

シャードクラスターインスタンスの各コレクションにシャーディングを設定して、インスタンス内のシャードのストレージスペースを最大限に活用し、これらのシャードのコンピューティングパフォーマンスを最大化できます。

背景情報

コレクションがシャードされていない場合、コレクション内のすべてのデータは同じシャードノードに格納されます。 この場合、他のシャードのストレージスペースを完全に使用することができず、これらのシャードのコンピューティングパフォーマンスが低下します。

前提条件

インスタンスはシャードクラスタインスタンスです。

使用上の注意

  • シャーディング後、構成済みのシャードキーを変更または削除することはできません。

  • シャーディングを設定した後、バランサーは指定された条件を満たす既存のデータをシャードし、インスタンスのリソースを消費します。 そのため、ピーク時間外に操作を実行することを推奨します。

    説明

    シャーディングを設定する前に、バランサーの有効期間をオフピーク時間に制限するアクティブな時間枠を設定できます。 詳細については、「balancerのアクティブな時間ウィンドウの設定」をご参照ください。

  • シャードキーの選択は、シャードクラスタインスタンスのパフォーマンスに影響します。 シャードキーを選択する方法の詳細については、 シャードキー をご参照ください。

シャーディング戦略

シャーディング戦略

説明

シナリオ

レンジシャーディング

MongoDBは、データをシャードキー値によって決まる連続した範囲に分割します。 各チャンクは、連続するデータ範囲を表す。

  • 利点: mongosは、要求されているデータをすばやく見つけて、要求をターゲットシャードに転送できます。

  • 短所: データがシャード間で不均一に分散され、読み取りと書き込みのホットシャードと書き込みの不均一な広がりが発生する可能性があります。

シャードキー値は単調に増加または減少しません。 シャードキーは、カーディナリティが大きく、頻度が低い。 範囲ベースのクエリが必要です。

ハッシュシャーディング

MongoDBは、1つのフィールドのハッシュ値をインデックス値として計算し、ハッシュ値の範囲に基づいてデータをチャンクに分割します。

  • 利点: データをシャード間で均等に分散できるため、書き込みの均一な広がりが保証されます。

  • 短所: この戦略は、クエリ中に読み取り要求をすべてのシャードに分散する必要があるため、範囲ベースのクエリには適用できません。

シャードキー値は単調に増加または減少します。 シャードキーは、カーディナリティが大きく、頻度が低い。 データ書き込みはランダムにシャードに分散されます。 データは高いランダム性で読み出されます。

上記の2つのシャーディング戦略に加えて、複合シャードキーを設定することもできます。 たとえば、カーディナリティの低いキーと単調に増加するキーの両方を設定します。 詳細については、「シャードキーの選択」をご参照ください。

手順

次の手順では、例として mongodbtest という名前のデータベースと customer という名前のコレクションを使用します。

  1. mongo shellを使用してApsaraDB for MongoDBシャードクラスターインスタンスに接続します

  2. シャーディングするコレクションが存在するデータベースのシャーディングを有効にします。

    重要

    インスタンスがMongoDB 6.0以降を実行する場合は、この手順をスキップします。 詳細については、「sh.enableSharding() 」をご参照ください。

    sh.enableSharding("<database>")

    <database>: データベースの名前。

    例:

    sh.enableSharding("mongodbtest")
    説明

    sh.status() コマンドを実行して、シャーディングが有効になっているかどうかを確認できます。

  3. シャードキーフィールドにインデックスを作成します。

    db.<collection>.createIndex(<keyPatterns>,<options>)

    上記のコマンドのパラメータ:

    • <collection>: コレクションの名前。

    • <keyPatterns>: インデックス作成に使用されるフィールドとインデックスタイプ。

      一般的なインデックスタイプは次のとおりです。

      • 1: 昇順インデックス

      • -1: 降順インデックス

      • "hashed": ハッシュインデックス

    • <options>: オプションのパラメーター。 詳細については、「db.collection.createIndex() 」をご参照ください。 このフィールドはこの例では使用されません。

    昇順インデックスを作成するためのサンプルコマンド:

    db.customer.createIndex({name:1})

    ハッシュインデックスを作成するためのサンプルコマンド:

    db.customer.createIndex({name:"hashed"})
  4. コレクションの分割を設定します。

    sh.shardCollection("<database>.<collection>",{ "<key>":<value> } ) 

    上記のコマンドのパラメータ:

    • <database>: データベースの名前。

    • <collection>: コレクションの名前。

    • <key>: MongoDBがデータのシャードに使用するシャードキー。

    • <value>

      • 1: レンジドシャーディング。 この戦略は、シャードキーに基づく効率的な範囲ベースのクエリをサポートします。

      • "hashed": ハッシュされたシャーディング。 この戦略は、データ書き込みをシャード間で均等に分散します。

    レンジドシャーディングを設定するためのサンプルコマンド:

    sh.shardCollection("mongodbtest.customer",{"name":1})

    ハッシュシャーディングを設定するためのサンプルコマンド:

    sh.shardCollection("mongodbtest.customer",{"name":"hashed"})

次のステップ

インスタンスが実行され、しばらくデータが書き込まれた後、mongo shellでsh.status() コマンドを実行して、シャード間のデータ分布を表示できます。

db.stats() コマンドを実行して、各シャードに保存されているデータのサイズを表示することもできます。