シャーディングされたクラスターでは、 シャードキー に基づきシャーディングされたデータの ゾーン を作成できます。各ゾーンはクラスター内の 1 つまたは複数のシャードに関連付けることができ、 シャードは任意の数のゾーンに関連付けることができます。 MongoDB はバランスの取れたクラスター内で、ゾーンによってカバーされるチャンクをそのゾーンに関連付けられているシャードのみに移行します。
Tip
空のコレクションまたは存在しないコレクションをシャーディングする前にゾーンとゾーン範囲を定義することで、シャード コレクション操作は定義されたゾーン範囲のチャンクと、シャードキー値の全範囲をカバーする追加のチャンクを作成し、初期化を実行しますゾーン範囲に基づく チャンク分散 。 このように初期チャンクを作成して分散することで、ゾーン シャーディングの設定を迅速に行うことができます。 初期分散後、バランサーは今後のチャンク分散を管理します。
例については、「 空または存在しないコレクションのゾーンとゾーン範囲の事前定義」を参照してください。
このチュートリアルでは、ゾーン を使用してデータをセグメント化する方法を説明します。
次のシナリオを検討して、アプリケーションまたはカスタマーごとにデータをセグメント化する必要があります。
複数のアプリケーションを処理するデータベース
複数のカスタマーをサポートするデータベース
アプリケーションまたはカスタマー データの範囲またはサブセットを分離する必要があるデータベース
アプリケーションまたはカスタマー データの範囲またはサブセットに対するリソース割り当てが必要なデータベース
この図では、 ゾーン を使用してアプリケーションまたはカスタマーに基づいてデータをセグメント化するシャーディングされたクラスターが示されています。 これにより、特定のシャードにデータを分離できます。 さらに、各シャードには、そのシャードに保存されているデータのパフォーマンス要件に合わせて特定のハードウェアを割り当てることができます。
Scenario
アプリケーションは、 clientフィールドとともにユーザーのスコアを追跡し、 usersコレクションの下のgamifyデータベースにスコアを保存します。 データセグメンテーションを可能にするには、 clientの可能な値ごとに独自のゾーンが必要です。 また、管理者は、パフォーマンスとコストの点で、 clientに関連付けられた各シャードのハードウェアを最適化することもできます。
次のドキュメントは、2 人のユーザーの部分的なビューを表します。
{ "_id" : ObjectId("56f08c447fe58b2e96f595fa"), "client" : "robot", "userid" : 123, "high_score" : 181, ..., } { "_id" : ObjectId("56f08c447fe58b2e96f595fb"), "client" : "fruitos", "userid" : 456, "high_score" : 210, ..., }
シャードキー
usersコレクションは、 { client : 1, userid : 1 }複合インデックスをシャードキーとして使用します。
各ドキュメントのclientフィールドを使用すると、個別のクライアント値ごとにゾーンを作成できます。
useridフィールドは、 countryと比較して、シャードキーに対して高濃度で低頻度のコンポーネントを提供します。
シャードキーの選択に関する一般的な手順については、「シャードキーの選択」を参照してください。
アーキテクチャ
アプリケーションでは、特定のclientに関連付けられたゾーンにシャードを追加する必要があります。
シャーディングされたクラスターの配置は現在、4 つのシャードで構成されています。
Zones
このアプリケーションには、2 つのクライアント ゾーンがあります。
- ロボット クライアント("robot")
- このゾーンは、
client : robotであるすべてのドキュメントを表します。 - FlutOS クライアント("flutos")
- このゾーンは、
client : fruitosであるすべてのドキュメントを表します。
書込み操作
ゾーンでは、挿入または更新されたドキュメントが設定されたゾーンと一致する場合、そのゾーン内のシャードにのみ書込むことができます。
MongoDB は、設定されたゾーンに一致しないドキュメントをクラスター内の任意のシャードに書込むことができます。
注意
上記の動作では、クラスターが定常状態で、設定されたゾーンを違反するチャンクがない状態である必要があります。 詳細については、バランサーの次のセクションを参照してください。
読み取り操作
MongoDB は、クエリに少なくともclientフィールドが含まれている場合、クエリを特定のシャードにルーティングできます。
たとえば、MongoDB は次のクエリでターゲット読み取り操作を試行できます。
chatDB = db.getSiblingDB("gamify") chatDB.users.find( { "client" : "robot" , "userid" : "123" } )
clientフィールドがないクエリは、ブロードキャスト操作を実行します。
バランサー
バランサーは、設定された ゾーン に従ってチャンクを適切なシャードに移行します。 移行するまで、シャードには設定されたゾーンに違反するチャンクが含まれる可能性があります。 バランシングが完了すると、シャードには、割り当てられたゾーンに違反しない範囲のチャンクのみが含まれるようになります。
ゾーンまたはゾーン範囲を追加または削除すると、チャンクの移行が発生する可能性があります。 データセットのサイズと、ゾーンまたはゾーン範囲が影響するチャンクの数によっては、これらの移行がクラスターのパフォーマンスに影響を与える可能性があります。 特定のスケジュールされた 中に バランサー Windowsを実行することを検討してください。スケジュール ウィンドウの設定方法については、「 バランシング ウィンドウのスケジュール」を参照してください。
セキュリティ
自己管理型配置で ロールベースのアクセス制御 を使用して実行されているシャーディングされたクラスターの場合は、 adminデータベースで少なくともclusterManagerロールを持つユーザーとして認証します。
手順
mongos続行するには、ターゲットの シャーディングされたクラスター に関連付けられている に接続する必要があります。シャードに直接接続してゾーンまたはゾーン範囲を作成することはできません。
バランサーを無効にする
新しいゾーンの構成中に移行が行われないように、シャーディングされたシャーディングされたクラスター全体でバランサーを無効にする必要があります。
sh.stopBalancer()クラスターのバランサーを停止するには、 を使用します。
sh.stopBalancer()
バランサー プロセスが現在実行中かどうかを確認するには、 sh.isBalancerRunning()を使用します。 現在のバランシング ラウンドが完了するまで待ってから続行します。
各シャードを適切なゾーンに追加する
robotゾーンにshard0000を追加する。
sh.addShardTag("shard0000", "robot")
robotゾーンにshard0001を追加する。
sh.addShardTag("shard0001", "robot")
fruitosゾーンにshard0002を追加する。
sh.addShardTag("shard0002", "fruitos")
fruitosゾーンにshard0003を追加する。
sh.addShardTag("shard0003", "fruitos")
sh.status()を実行して、シャーディングされたクラスターに構成されたゾーンを確認します。
各ゾーンの範囲を定義する
robotクライアントの範囲を定義し、 sh.addTagRange()メソッドを使用してrobotゾーンに関連付けます。
このメソッドには次のものが必要です。
ターゲット コレクションの完全な名前空間
範囲の下限(包括的)
範囲の排他的上限
ゾーンの名前
sh.addTagRange( "gamify.users", { "client" : "robot", "userid" : MinKey }, { "client" : "robot", "userid" : MaxKey }, "robot" )
fruitosクライアントの範囲を定義し、 sh.addTagRange()メソッドを使用してfruitosゾーンに関連付けます。
このメソッドには次のものが必要です。
ターゲット コレクションの完全な名前空間
範囲の下限(包括的)
範囲の排他的上限
ゾーンの名前
sh.addTagRange( "gamify.users", { "client" : "fruitos", "userid" : MinKey }, { "client" : "fruitos", "userid" : MaxKey }, "fruitos" )
MinKeyとMaxKeyの値は比較用の特別な値として予約されています。 MinKeyは常に他のすべての値よりも低いとみなされ、 MaxKeyは常に他のすべての値よりも高い値として比較されます。 構成された範囲では、各clientのすべてのユーザーがキャプチャされます。
バランサーを有効にする
バランサーを再度有効にしてクラスターのバランスを再調整します。
バランサーを起動するには、コレクションの名前空間を指定してsh.enableBalancing()を使用します。
sh.enableBalancing("chat.message")
バランサー プロセスが現在実行中かどうかを確認するには、 sh.isBalancerRunning()を使用します。
変更を確認する
次回バランサーが実行されると、構成されたゾーンに従ってシャード全体にデータが移行されます。
バランシングが完了すると、 robotゾーンのシャードにはclient : robotを持つドキュメントのみが含まれ、 fruitosゾーンのシャードにはclient : fruitosを持つドキュメントのみが含まれます。
チャンク分布は、 sh.status()を実行して確認できます。