Docs Menu
Docs Home
/
MongoDBマニュアル
/ /

ロケーションによるデータのセグメント化

項目一覧

  • Scenario
  • 手順

シャーディングされたクラスターでは、 シャードキー に基づきシャーディングされたデータの ゾーン を作成できます。各ゾーンはクラスター内の 1 つまたは複数のシャードに関連付けることができ、 シャードは任意の数のゾーンに関連付けることができます。 MongoDB はバランスの取れたクラスター内で、ゾーンによってカバーされるチャンクをそのゾーンに関連付けられているシャードのみに移行します。

Tip

空のコレクションまたは存在しないコレクションをシャーディングする前にゾーンとゾーン範囲を定義することで、シャード コレクション操作は定義されたゾーン範囲のチャンクと、シャードキー値の全範囲をカバーする追加のチャンクを作成し、初期化を実行しますゾーン範囲に基づく チャンク分散 。 このように初期チャンクを作成して分散することで、ゾーン シャーディングの設定を迅速に行うことができます。 初期分散後、バランサーは今後のチャンク分散を管理します。

例については、「 空または存在しないコレクションのゾーンとゾーン範囲の事前定義」を参照してください。

このチュートリアルでは、ゾーンを使用して、地理的領域に基づいてデータをセグメント化します。

以下に、地理的領域ごとにデータをセグメント化するユースケースの例を示します。

  • ユーザー データを国ごとにセグメント化する必要があるアプリケーション

  • 国ごとにリソースを割り当てなければならないデータベース

以下の図では、地理的ゾーンを使用してデータセグメンテーション要件を管理し満たすシャーディングされたクラスターが示されています。

ゾーンに基づく地理的分散図

金融チャット アプリケーションはメッセージをログに記録し、発信元ユーザーの国を追跡します。 アプリケーションは、 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 つのデータセンターにシャードがあります。

地理アーキテクチャ分散をサポートするために使用されるゾーンの図

このアプリケーションでは、データセンターごとに 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 }

注意

MinKeyMaxKeyの値は比較用の特別な値です

ゾーンでは、挿入または更新されたドキュメントが設定されたゾーンと一致する場合、そのゾーン内のシャードにのみ書込むことができます。

MongoDB は、設定されたゾーンに一致しないドキュメントをクラスター内の任意のシャードに書込むことができます。

注意

上記の動作では、クラスターが定常状態で、設定されたゾーンを違反するチャンクがない状態である必要があります。 詳細については、バランサーの次のセクションを参照してください。

MongoDB は、クエリに少なくともcountryフィールドが含まれている場合、クエリを特定のシャードにルーティングできます。

たとえば、MongoDB は次のクエリでターゲット読み取り操作を試行できます。

chatDB = db.getSiblingDB("chat")
chatDB.messages.find( { "country" : "UK" , "userid" : "123" } )

countryフィールドがないクエリは、ブロードキャスト操作を実行します。

バランサーは、設定された ゾーン に従ってチャンクを適切なシャードに移行します。 移行するまで、シャードには設定されたゾーンに違反するチャンクが含まれる可能性があります。 バランシングが完了すると、シャードには、割り当てられたゾーンに違反しない範囲のチャンクのみが含まれるようになります。

ゾーンまたはゾーン範囲を追加または削除すると、チャンクの移行が発生する可能性があります。 データセットのサイズと、ゾーンまたはゾーン範囲が影響するチャンクの数によっては、これらの移行がクラスターのパフォーマンスに影響を与える可能性があります。 特定のスケジュールされた 中に バランサー Windowsを実行することを検討してください。スケジュール ウィンドウの設定方法については、「 バランシング ウィンドウのスケジュール」を参照してください。

自己管理型配置で ロールベースのアクセス制御 を使用して実行されているシャーディングされたクラスターの場合は、 adminデータベースで少なくともclusterManagerロールを持つユーザーとして認証します。

ゾーンとゾーン範囲を作成するには、 mongosに接続する必要があります。 シャードに直接接続してゾーンまたはゾーン範囲を作成することはできません。

1

パフォーマンスへの影響を軽減するために、シャーディングされたシャーディングされたクラスター全体でバランサーを無効にして、新しいゾーンの構成中に移行が行われないようにすることができます。

sh.stopBalancer()クラスターのバランサーを停止するには、 を使用します。

sh.stopBalancer()

バランサー プロセスが現在実行中かどうかを確認するには、 sh.isBalancerRunning()を使用します。 現在のバランシング ラウンドが完了するまで待ってから続行します。

2

北部米国データセンターの各シャードをNAゾーンに追加します。

sh.addShardTag(<shard name>, "NA")

ヨーロッパ データセンター内の各シャードをEUゾーンに追加します。

sh.addShardTag(<shard name>, "EU")

任意のシャードに割り当てられたゾーンは、 sh.status()を実行して確認できます。

3

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"
)

MinKeyMaxKeyの値は比較用の特別な値として予約されています。 MinKeyは常に他のすべての値よりも低いとみなされ、 MaxKeyは常に他のすべての値よりも高い値として比較されます。 構成された範囲では、各deviceのすべてのユーザーがキャプチャされます。

country : UKcountry : DEの両方がEUゾーンに割り当てられています。 これにより、 countryの値としてUKまたはDEのいずれかのドキュメントがEU データセンターに関連付けられます。

4

以前の手順でバランサーが無効になっている場合は、この手順の完了時にバランサーを再度有効にしてクラスターを再バランスさせます。

バランサーを起動するには、コレクションの名前空間を指定してsh.enableBalancing()を使用します。

sh.enableBalancing("chat.message")

バランサー プロセスが現在実行中かどうかを確認するには、 sh.isBalancerRunning()を使用します。

5

次回バランサーが実行されると、必要に応じてチャンクが分割され、チャンクは構成されたゾーンに従ってシャード全体に移行されます。

バランシングが完了すると、次のことを行います。

  • NAゾーンのシャードにはcountry : USのドキュメントのみを含める必要があり、

  • EUゾーン内のシャードには、 country : UKまたはcountry : DEを持つドキュメントのみを含める必要があります。

USUK 、またはDE以外のcountryの値を持つドキュメントは、クラスター内の任意のシャードに存在できます。

チャンク配布を確認するには、 sh.status()を実行します。

アプリケーションでは、次の更新が必要です。

  • country : UKを持つドキュメントは新しいUKデータセンターに関連付けられる必要があります。 EUデータセンター内のすべてのデータを移行する必要があります

  • チャット アプリケーションがメキシコのユーザーをサポートするようになりました。 country : MXを含むドキュメントは、 NAデータセンターにルーティングする必要があります。

ゾーン範囲を更新するには、次の手順を実行します。

1

パフォーマンスへの影響を軽減するために、シャーディングされたシャーディングされたクラスター全体でバランサーを無効にして、新しいゾーンの構成または古いゾーンの削除中に移行が行われないようにすることができます。

sh.stopBalancer()クラスターのバランサーを停止するには、 を使用します。

sh.stopBalancer()

バランサー プロセスが現在実行中かどうかを確認するには、 sh.isBalancerRunning()を使用します。 現在のバランシング ラウンドが完了するまで待ってから続行します。

2

UKデータセンターの各シャードをUKゾーンに追加します。

sh.addShardTag("<shard name>", "UK")

任意のシャードに割り当てられたゾーンは、 sh.status()を実行して確認できます。

3

sh.removeTagRange()メソッドを使用して、 UK国に関連付けられた古いゾーン範囲を削除します。 このメソッドには次のものが必要です。

  • ターゲット コレクションの完全な名前空間。

  • 範囲の下限を含みます。

  • 範囲の排他的上限。

sh.removeTagRange(
"chat.messages",
{ "country" : "UK", "userid" : MinKey },
{ "country" : "UK", "userid" : MaxKey }
)
4

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"
)

MinKeyMaxKeyの値は比較用の特別な値として予約されています。 MinKeyは常に他のすべての値よりも低いとみなされ、 MaxKeyは常に他のすべての値よりも高い値として比較されます。 これにより、2 つの範囲がuseridの可能な値空間全体をキャプチャするようになります。

5

以前の手順でバランサーが無効になっている場合は、この手順の完了時にバランサーを再度有効にしてクラスターを再バランスさせます。

バランサーを起動するには、コレクションの名前空間を指定してsh.enableBalancing()を使用します。

sh.enableBalancing("chat.messages")

バランサー プロセスが現在実行中かどうかを確認するには、 sh.isBalancerRunning()を使用します。

6

次回バランサーが実行されると、必要に応じてチャンクが分割され、チャンクは構成されたゾーンに従ってシャード全体に移行されます。

バランシング前:

  • EUゾーンのシャードにはcountry : DEまたはcountry : UKのドキュメントのみが含まれ、

  • country : MXがシャーディングされたクラスター内の任意のシャードに保存できるドキュメント。

バランシング後:

  • EUゾーン内のシャードにはcountry : DEのドキュメントのみが含まれます

  • UKゾーン内のシャードにはcountry : UKのドキュメントのみが含まれ、

  • NAゾーン内のシャードには、 country : USまたはcountry : MXのドキュメントのみが含まれます。

USMXUK 、またはDE以外のcountryの値を持つドキュメントは、クラスター内の任意のシャードに存在できます。

チャンク配布を確認するには、 sh.status()を実行します。

Tip

以下も参照してください。

戻る

シャード ゾーンの更新

項目一覧