アプリケーションまたはカスタマー別のデータのセグメント化
シャーディングされたクラスターでは、 シャードキー に基づきシャーディングされたデータの ゾーン を作成できます。各ゾーンはクラスター内の 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.disableBalancing()
を使用します。
sh.disableBalancing("chat.message")
バランサー プロセスが現在実行中かどうかを確認するには、 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()
を実行して確認できます。