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

ApsaraDB for MongoDB:シャードのパフォーマンスを最大化するためのデータシャーディングの設定

最終更新日:Nov 09, 2025

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

背景情報

コレクションがシャーディングされていない場合、そのすべてのデータは単一のシャードノードに保存されます。これにより、他のシャードノードがストレージとコンピューティングに完全には活用されなくなります。

前提条件

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

使用上の注意

  • シャードキーを変更する MongoDB の機能は、バージョンごとに改善されています。

    • バージョン 4.4 より前: シャードキーが設定されると、変更または削除することはできません

    • バージョン 4.4 以降: refineCollectionShardKey コマンドを使用して、サフィックスフィールドを追加することでシャードキーを改良できます。

    • バージョン 5.0 以降: reshardCollection コマンドが導入されました。このコマンドを使用すると、コレクションのシャードキーを完全に変更できます。

  • データシャーディングを設定すると、バランサーは基準を満たすデータを分割します。この操作はインスタンスのリソースを消費するため、オフピーク時に実行する必要があります。

    説明

    データシャーディングを設定する前に、バランサーのアクティブウィンドウを設定して、バランサーがオフピーク時に実行されるようにすることができます。詳細については、「バランサーのアクティブウィンドウを設定する」をご参照ください。

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

シャーディング戦略

シャーディング戦略

説明

シナリオ

範囲シャーディング

MongoDB は、シャードキーの値の範囲に基づいてデータをチャンクに分割します。各チャンクには、特定の範囲内のデータが含まれます。

  • 利点: Mongos はリクエストされたデータを迅速に特定し、リクエストを正しいシャードノードに転送できます。

  • 欠点: データがシャード間で不均等に分散される可能性があります。これにより、読み取りおよび書き込みのホットスポットが発生し、書き込みの分散が提供されません。

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

ハッシュシャーディング

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

  • 利点: データをシャードノード間でより均等に分散できます。これにより、書き込みの分散が提供されます。

  • 欠点: この戦略は範囲クエリには適していません。範囲クエリ中、読み取りリクエストはすべてのシャードノードに送信される必要があります。

シャードキーの値は単調に増加または減少します。シャードキーはカーディナリティが高く、周波数が低いです。データ書き込みはランダムに分散される必要があります。データ読み取りは非常にランダムです。

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

手順

このトピックでは、`mongodbtest` データベースと `customer` コレクションを例として使用します。

  1. mongo シェルを使用してシャードクラスターインスタンスにログオンする

  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 シェルで sh.status() コマンドを実行して、シャードノード間のデータ分布を表示できます。

また、db.stats() コマンドを実行して、各シャードノード上のデータベースのデータストレージを表示することもできます。