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

アプリケーションまたはカスタマー別のデータのセグメント化

項目一覧

  • Scenario
  • 手順

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

Tip

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

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

このチュートリアルでは、ゾーン を使用してデータをセグメント化する方法を説明します。

次のシナリオを検討して、アプリケーションまたはカスタマーごとにデータをセグメント化する必要があります。

  • 複数のアプリケーションを処理するデータベース

  • 複数のカスタマーをサポートするデータベース

  • アプリケーションまたはカスタマー データの範囲またはサブセットを分離する必要があるデータベース

  • アプリケーションまたはカスタマー データの範囲またはサブセットに対するリソース割り当てが必要なデータベース

この図では、 ゾーン を使用してアプリケーションまたはカスタマーに基づいてデータをセグメント化するシャーディングされたクラスターが示されています。 これにより、特定のシャードにデータを分離できます。 さらに、各シャードには、そのシャードに保存されているデータのパフォーマンス要件に合わせて特定のハードウェアを割り当てることができます。

データセグメンテーションのサポートに使用されるゾーンの概要

アプリケーションは、 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 つのシャードで構成されています。

ゾーンを使用するデータセグメンテーションアーキテクチャの図

このアプリケーションには、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続行するには、ターゲットの シャーディングされたクラスター に関連付けられている に接続する必要があります。シャードに直接接続してゾーンまたはゾーン範囲を作成することはできません。

1

新しいゾーンの構成中に移行が行われないようにするには、 コレクションでバランサーを無効にする必要があります。

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

sh.disableBalancing("chat.message")

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

2

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()を実行して、シャーディングされたクラスターに構成されたゾーンを確認します。

3

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

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

4

バランサーを再度有効にしてクラスターのバランスを再調整します。

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

sh.enableBalancing("chat.message")

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

5

次回バランサーが実行されると、構成されたゾーンに従ってシャード全体にデータが移行されます。

バランシングが完了すると、 robotゾーンのシャードにはclient : robotを持つドキュメントのみが含まれ、 fruitosゾーンのシャードにはclient : fruitosを持つドキュメントのみが含まれます。

チャンク分布は、 sh.status()を実行して確認できます。

戻る

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

項目一覧