ロケーションによるデータのセグメント化
シャーディングされたクラスターでは、 シャードキー に基づきシャーディングされたデータの ゾーン を作成できます。各ゾーンはクラスター内の 1 つまたは複数のシャードに関連付けることができ、 シャードは任意の数のゾーンに関連付けることができます。 MongoDB はバランスの取れたクラスター内で、ゾーンによってカバーされるチャンクをそのゾーンに関連付けられているシャードのみに移行します。
Tip
空のコレクションまたは存在しないコレクションをシャーディングする前にゾーンとゾーン範囲を定義することで、シャード コレクション操作は定義されたゾーン範囲のチャンクと、シャードキー値の全範囲をカバーする追加のチャンクを作成し、初期化を実行しますゾーン範囲に基づく チャンク分散 。 このように初期チャンクを作成して分散することで、ゾーン シャーディングの設定を迅速に行うことができます。 初期分散後、バランサーは今後のチャンク分散を管理します。
例については、「 空または存在しないコレクションのゾーンとゾーン範囲の事前定義」を参照してください。
このチュートリアルでは、ゾーンを使用して、地理的領域に基づいてデータをセグメント化します。
以下に、地理的領域ごとにデータをセグメント化するユースケースの例を示します。
ユーザー データを国ごとにセグメント化する必要があるアプリケーション
国ごとにリソースを割り当てなければならないデータベース
以下の図では、地理的ゾーンを使用してデータセグメンテーション要件を管理し満たすシャーディングされたクラスターが示されています。
Scenario
金融チャット アプリケーションはメッセージをログに記録し、発信元ユーザーの国を追跡します。 アプリケーションは、 messages
コレクションの下にある chat
データベースにログを保存します。 チャットには、国のユーザー向けに読み取りおよび書込みリクエストを提供するために、国ごとにセグメント化する必要がある情報が含まれています。 リソースを共有するために、国のグループに同じゾーンを割り当てることができます。
アプリケーションには現在、米国、英国、ドキュメントのユーザーが存在します。 country
フィールドは、 ISO3166 -1 Alma-2 に基づいてユーザーの国を表します 2 文字の国コード。
次のドキュメントは、3 つのチャット メッセージの部分的なビューを表します。
{ "_id" : ObjectId("56f08c447fe58b2e96f595fa"), "country" : "US", "userid" : 123, "message" : "Hello there", ..., } { "_id" : ObjectId("56f08c447fe58b2e96f595fb"), "country" : "UK", "userid" : 456, "message" : "Good Morning" ..., } { "_id" : ObjectId("56f08c447fe58b2e96f595fc"), "country" : "DE", "userid" : 789, "message" : "Guten Tag" ..., }
シャードキー
messages
コレクションは、 { country : 1, userid : 1 }
複合インデックスをシャードキーとして使用します。
各ドキュメントのcountry
フィールドを使用すると、個別の国の値ごとにゾーンを作成できます。
userid
フィールドは、 country
と比較して、シャードキーに対して高濃度で低頻度のコンポーネントを提供します。
シャードキーの選択に関する一般的な手順については、「シャードキーの選択」を参照してください。
アーキテクチャ
このシャーディングされたクラスターは、ヨーロッパとヨーロッパの 2 つのデータセンターにシャードがあります。
Zones
このアプリケーションでは、データセンターごとに 1 つのゾーンが必要です。
EU
- 欧州のデータセンターこのデータセンターに配置されたシャードは
EU
ゾーンに割り当てられます。ローカルの読み取りと書き込みに
EU
データセンターを使用するそれぞれの国に対して、EU
ゾーンのゾーン範囲を次のように作成します。下限
{ "country" : <country>, "userid" : MinKey }
の上限
{ "country" : <country>, "userid" : MaxKey }
NA
- 北部米国データセンターこのデータセンターに配置されたシャードは
NA
ゾーンに割り当てられます。ローカルの読み取りと書き込みに
NA
データセンターを使用するそれぞれの国に対して、NA
ゾーンのゾーン範囲を次のように作成します。下限
{ "country" : <country>, "userid" : MinKey }
の上限
{ "country" : <country>, "userid" : MaxKey }
書込み操作
ゾーンでは、挿入または更新されたドキュメントが設定されたゾーンと一致する場合、そのゾーン内のシャードにのみ書込むことができます。
MongoDB は、設定されたゾーンに一致しないドキュメントをクラスター内の任意のシャードに書込むことができます。
注意
上記の動作では、クラスターが定常状態で、設定されたゾーンを違反するチャンクがない状態である必要があります。 詳細については、バランサーの次のセクションを参照してください。
読み取り操作
MongoDB は、クエリに少なくともcountry
フィールドが含まれている場合、クエリを特定のシャードにルーティングできます。
たとえば、MongoDB は次のクエリでターゲット読み取り操作を試行できます。
chatDB = db.getSiblingDB("chat") chatDB.messages.find( { "country" : "UK" , "userid" : "123" } )
country
フィールドがないクエリは、ブロードキャスト操作を実行します。
バランサー
バランサーは、設定された ゾーン に従ってチャンクを適切なシャードに移行します。 移行するまで、シャードには設定されたゾーンに違反するチャンクが含まれる可能性があります。 バランシングが完了すると、シャードには、割り当てられたゾーンに違反しない範囲のチャンクのみが含まれるようになります。
ゾーンまたはゾーン範囲を追加または削除すると、チャンクの移行が発生する可能性があります。 データセットのサイズと、ゾーンまたはゾーン範囲が影響するチャンクの数によっては、これらの移行がクラスターのパフォーマンスに影響を与える可能性があります。 特定のスケジュールされた 中に バランサー Windowsを実行することを検討してください。スケジュール ウィンドウの設定方法については、「 バランシング ウィンドウのスケジュール」を参照してください。
セキュリティ
自己管理型配置で ロールベースのアクセス制御 を使用して実行されているシャーディングされたクラスターの場合は、 admin
データベースで少なくともclusterManager
ロールを持つユーザーとして認証します。
手順
ゾーンとゾーン範囲を作成するには、 mongos
に接続する必要があります。 シャードに直接接続してゾーンまたはゾーン範囲を作成することはできません。
バランサーを無効にする(任意)
パフォーマンスへの影響を軽減するために、シャーディングされたシャーディングされたクラスター全体でバランサーを無効にして、新しいゾーンの構成中に移行が行われないようにすることができます。
sh.stopBalancer()
クラスターのバランサーを停止するには、 を使用します。
sh.stopBalancer()
バランサー プロセスが現在実行中かどうかを確認するには、 sh.isBalancerRunning()
を使用します。 現在のバランシング ラウンドが完了するまで待ってから続行します。
各シャードを適切なゾーンに追加する
北部米国データセンターの各シャードをNA
ゾーンに追加します。
sh.addShardTag(<shard name>, "NA")
ヨーロッパ データセンター内の各シャードをEU
ゾーンに追加します。
sh.addShardTag(<shard name>, "EU")
任意のシャードに割り当てられたゾーンは、 sh.status()
を実行して確認できます。
各ゾーンの範囲を定義する
country : US
のシャードキー値の場合は、シャードキー範囲を定義し、 sh.addTagRange()
メソッドを使用してそれをNA
ゾーンに関連付けます。 このメソッドには次のものが必要です。
ターゲット コレクションの完全な名前空間。
範囲の下限を含みます。
範囲の排他的上限。
ゾーンの名前。
sh.addTagRange( "chat.messages", { "country" : "US", "userid" : MinKey }, { "country" : "US", "userid" : MaxKey }, "NA" )
country : UK
のシャードキー値の場合は、シャードキー範囲を定義し、 sh.addTagRange()
メソッドを使用してそれをEU
ゾーンに関連付けます。 このメソッドには次のものが必要です。
ターゲット コレクションの完全な名前空間。
範囲の下限を含みます。
範囲の排他的上限。
ゾーンの名前。
sh.addTagRange( "chat.messages", { "country" : "UK", "userid" : MinKey }, { "country" : "UK", "userid" : MaxKey }, "EU" )
country : DE
のシャードキー値の場合は、シャードキー範囲を定義し、 sh.addTagRange()
メソッドを使用してそれをEU
ゾーンに関連付けます。 このメソッドには次のものが必要です。
ターゲット コレクションの完全な名前空間。
範囲の下限を含みます。
範囲の排他的上限。
ゾーンの名前。
sh.addTagRange( "chat.messages", { "country" : "DE", "userid" : MinKey }, { "country" : "DE", "userid" : MaxKey }, "EU" )
MinKey
とMaxKey
の値は比較用の特別な値として予約されています。 MinKey
は常に他のすべての値よりも低いとみなされ、 MaxKey
は常に他のすべての値よりも高い値として比較されます。 構成された範囲では、各device
のすべてのユーザーがキャプチャされます。
country : UK
とcountry : DE
の両方がEU
ゾーンに割り当てられています。 これにより、 country
の値としてUK
またはDE
のいずれかのドキュメントがEU データセンターに関連付けられます。
バランサーを有効にする(任意)
以前の手順でバランサーが無効になっている場合は、この手順の完了時にバランサーを再度有効にしてクラスターを再バランスさせます。
バランサーを起動するには、コレクションの名前空間を指定してsh.enableBalancing()
を使用します。
sh.enableBalancing("chat.message")
バランサー プロセスが現在実行中かどうかを確認するには、 sh.isBalancerRunning()
を使用します。
変更を確認する
次回バランサーが実行されると、必要に応じてチャンクが分割され、チャンクは構成されたゾーンに従ってシャード全体に移行されます。
バランシングが完了すると、次のことを行います。
NA
ゾーンのシャードにはcountry : US
のドキュメントのみを含める必要があり、EU
ゾーン内のシャードには、country : UK
またはcountry : DE
を持つドキュメントのみを含める必要があります。
US
、 UK
、またはDE
以外のcountry
の値を持つドキュメントは、クラスター内の任意のシャードに存在できます。
チャンク配布を確認するには、 sh.status()
を実行します。
ゾーンの更新
アプリケーションでは、次の更新が必要です。
country : UK
を持つドキュメントは新しいUK
データセンターに関連付けられる必要があります。EU
データセンター内のすべてのデータを移行する必要がありますチャット アプリケーションがメキシコのユーザーをサポートするようになりました。
country : MX
を含むドキュメントは、NA
データセンターにルーティングする必要があります。
ゾーン範囲を更新するには、次の手順を実行します。
バランサーを無効にする(任意)
パフォーマンスへの影響を軽減するために、シャーディングされたシャーディングされたクラスター全体でバランサーを無効にして、新しいゾーンの構成または古いゾーンの削除中に移行が行われないようにすることができます。
sh.stopBalancer()
クラスターのバランサーを停止するには、 を使用します。
sh.stopBalancer()
バランサー プロセスが現在実行中かどうかを確認するには、 sh.isBalancerRunning()
を使用します。 現在のバランシング ラウンドが完了するまで待ってから続行します。
新しいUK
ゾーンを追加する
UK
データセンターの各シャードをUK
ゾーンに追加します。
sh.addShardTag("<shard name>", "UK")
任意のシャードに割り当てられたゾーンは、 sh.status()
を実行して確認できます。
古いゾーン範囲を削除
sh.removeTagRange()
メソッドを使用して、 UK
国に関連付けられた古いゾーン範囲を削除します。 このメソッドには次のものが必要です。
ターゲット コレクションの完全な名前空間。
範囲の下限を含みます。
範囲の排他的上限。
sh.removeTagRange( "chat.messages", { "country" : "UK", "userid" : MinKey }, { "country" : "UK", "userid" : MaxKey } )
新しいゾーン範囲の追加
country : UK
のシャードキー値の場合は、シャードキー範囲を定義し、 sh.addTagRange()
メソッドを使用してそれをUK
ゾーンに関連付けます。 このメソッドには次のものが必要です。
ターゲット コレクションの完全な名前空間。
範囲の下限を含みます。
範囲の排他的上限。
ゾーンの名前。
sh.addTagRange( "chat.message", { "country" : "UK", "userid" : MinKey }, { "country" : "UK", "userid" : MaxKey }, "UK" )
country : MX
のシャードキー値の場合は、シャードキー範囲を定義し、 sh.addTagRange()
メソッドを使用してそれをNA
ゾーンに関連付けます。 このメソッドには次のものが必要です。
ターゲット コレクションの完全な名前空間。
範囲の下限を含みます。
範囲の排他的上限。
ゾーンの名前。
sh.addTagRange( "chat.messages", { "country" : "MX", "userid" : MinKey }, { "country" : "MX", "userid" : MaxKey }, "NA" )
MinKey
とMaxKey
の値は比較用の特別な値として予約されています。 MinKey
は常に他のすべての値よりも低いとみなされ、 MaxKey
は常に他のすべての値よりも高い値として比較されます。 これにより、2 つの範囲がuserid
の可能な値空間全体をキャプチャするようになります。
バランサーを有効にする(任意)
以前の手順でバランサーが無効になっている場合は、この手順の完了時にバランサーを再度有効にしてクラスターを再バランスさせます。
バランサーを起動するには、コレクションの名前空間を指定してsh.enableBalancing()
を使用します。
sh.enableBalancing("chat.messages")
バランサー プロセスが現在実行中かどうかを確認するには、 sh.isBalancerRunning()
を使用します。
変更を確認する
次回バランサーが実行されると、必要に応じてチャンクが分割され、チャンクは構成されたゾーンに従ってシャード全体に移行されます。
バランシング前:
EU
ゾーンのシャードにはcountry : DE
またはcountry : UK
のドキュメントのみが含まれ、country : MX
がシャーディングされたクラスター内の任意のシャードに保存できるドキュメント。
バランシング後:
EU
ゾーン内のシャードにはcountry : DE
のドキュメントのみが含まれますUK
ゾーン内のシャードにはcountry : UK
のドキュメントのみが含まれ、NA
ゾーン内のシャードには、country : US
またはcountry : MX
のドキュメントのみが含まれます。
US
、 MX
、 UK
、またはDE
以外のcountry
の値を持つドキュメントは、クラスター内の任意のシャードに存在できます。
チャンク配布を確認するには、 sh.status()
を実行します。