ゾーンを使用したコレクションの配布
項目一覧
シャーディングされたクラスターでは、 シャードキー に基づきシャーディングされたデータの ゾーン を作成できます。各ゾーンはクラスター内の 1 つまたは複数のシャードに関連付けることができ、 シャードは任意の数のゾーンに関連付けることができます。 MongoDB はバランスの取れたクラスター内で、ゾーンによってカバーされるチャンクをそのゾーンに関連付けられているシャードのみに移行します。
ゾーン シャーディングを使用して、シャーディングされたクラスター全体にコレクションを分散し、各コレクションのデータを保存するシャードを指定できます。 物理リソースや使用可能なメモリなどのシャード プロパティに基づいてコレクションを分散し、各コレクションがそのデータに最適なシャードに保存されるようにします。
前提条件
Atlas の サンプル データ セット からの映画データを含むコレクションを使用します。
シャーディングされたクラスター を配置します。 このチュートリアルでは、3 つのシャードを持つシャーディングされたクラスターを使用します。
mongos
に接続します。 シャードに直接接続してゾーンまたはゾーン範囲を作成することはできません。admin
データベースで少なくともclusterManager
ロールを持つユーザーとして認証します。 ユーザー権限を表示するには、db.getUser()
メソッドを使用します。
Scenario
2 つのシャーディングされたコレクションを含むshardDistributionDB
というデータベースがあります。
bigData
、大量のデータが含まれます。manyIndexes
は、多数の大きなインデックスを含みます。
各コレクションをシャードのサブセットに制限し、各コレクションがシャードの異なる物理リソースを使用できるようにする場合。
アーキテクチャ
シャーディングされたクラスターには 3 つのシャードがあります。 各シャードには固有の物理リソースがあります。
シャード名 | 物理リソース |
---|---|
| 大メモリ容量 |
| 高速フラッシュ ストレージ |
| 大メモリ容量と高速フラッシュ ストレージ |
Zones
物理リソースに基づいてコレクションを分散するには、 シャード ゾーン を使用します。 シャード ゾーンは、コレクションをシャードの特定のサブセットに関連付けます。これにより、コレクションのデータを保存するシャードが制限されます。 この例では、2 つのシャード ゾーンが必要です。
ゾーン名 | 説明 | このゾーンのコレクション |
---|---|---|
| メモリ容量が大きいサーバー。 | 大きなインデックスを持つコレクションなど、より多くのメモリを必要とするコレクションは、 |
| 高速ストレージ速度のためのフラッシュドライブを備えたサーバー。 | 高速データ取得を必要とする大規模なコレクションは、 |
シャードキー
このチュートリアルでは、各コレクションのシャードに使用するシャードキーは{ _id: "hashed" }
です。 コレクションをシャードする前に、 シャード ゾーン を構成します。 その結果、各コレクションのデータは、対応するゾーン内のシャードにのみ存在します。
ハッシュされたシャーディングでは、ゾーンを設定する前にコレクションをシャーディングする場合、シャーディングが有効になっているときに MongoDB はすべてのシャード間で均等にチャンクを割り当てます。 つまり、チャンクのデータを処理するのに適していないシャードに、チャンクが一時的に割り当てられる場合があります。
バランサー
バランサーは、設定された ゾーン に基づいて、チャンクを適切なシャードに移行します。 バランシングが完了すると、シャードには、割り当てられたゾーンと一致する範囲を持つチャンクのみが含まれます。
重要
パフォーマンス
ゾーンまたはゾーン範囲を追加、削除、または変更すると、チャンクの移行が発生する可能性があります。 データセットのサイズと、ゾーンまたはゾーン範囲が影響するチャンクの数によっては、これらの移行がクラスターのパフォーマンスに影響を与える可能性があります。 特定のスケジュールされたWindows中にバランサーを実行することを検討してください。 スケジュール ウィンドウを設定する方法については、「バランシング ウィンドウのスケジュール 」を参照してください。
手順
シャード ゾーンを構成し、シャードの物理リソースに基づいてコレクションを配布するには、次の手順に従います。
各シャードを適切なゾーンに追加します。
各ゾーンのシャードを構成するには、 addShardToZone
コマンドを使用します。
shard0
とshard2
をHI_RAM
ゾーンに追加する。
sh.addShardToZone("shard0", "HI_RAM") sh.addShardToZone("shard2", "HI_RAM")
shard1
とshard2
をFLASH
ゾーンに追加する。
sh.addShardToZone("shard1", "FLASH") sh.addShardToZone("shard2", "FLASH")
関連するコレクションにゾーン範囲を追加します。
シャードキーの範囲をゾーンに関連付けるには、 sh.updateZoneKeyRange()
を使用します。
このシナリオでは、コレクション内のすべてのドキュメントを適切なゾーンに関連付けます。 すべてのコレクション ドキュメントをゾーンに関連付けるには、次のゾーン範囲を指定します。
下限
{ "_id" : MinKey }
の上限
{ "_id" : MaxKey }
bigData
コレクションに、以下を設定します。
sh.updateZoneKeyRange( "shardDistributionDB.bigData", { "_id" : MinKey }, { "_id" : MaxKey }, "FLASH" )
manyIndexes
コレクションに、以下を設定します。
sh.updateZoneKeyRange( "shardDistributionDB.manyIndexes", { "_id" : MinKey }, { "_id" : MaxKey }, "HI_RAM" )
コレクションをシャーディングします。
両方のコレクション( bigData
とmanyIndexes
)をシャードするには、 { _id: "hashed" }
のシャードキーを指定します。
次のコマンドを実行します。
sh.shardCollection( "shardDistributionDB.bigData", { _id: "hashed" } ) sh.shardCollection( "shardDistributionDB.manyIndexes", { _id: "hashed" } )
変更を確認します。
チャンク分散とシャード ゾーンを表示するには、 sh.status()
メソッドを使用します。
sh.status()
次回バランサーが実行されると、必要に応じて チャンク が分割され、構成された ゾーン に従って、チャンクがシャード全体に移行されます。 バランサーが完了するまでの時間は、シャードの数、使用可能なメモリ、 IOPSなどのいくつかの要因によって異なります。
バランシングが完了すると、次のことを行います。
manyIndexes
コレクション内のドキュメントのチャンクはshard0
とshard2
に存在bigData
コレクション内のドキュメントのチャンクはshard1
とshard2
に存在します。
詳細
シャーディングとバランシングの詳細については、次のページを参照してください。