さまざまな SLA または SLO のための自己管理型階層型ハードウェア
シャーディングされたクラスターでは、 シャードキー に基づきシャーディングされたデータの ゾーン を作成できます。各ゾーンはクラスター内の 1 つまたは複数のシャードに関連付けることができ、 シャードは任意の数のゾーンに関連付けることができます。 MongoDB はバランスの取れたクラスター内で、ゾーンによってカバーされるチャンクをそのゾーンに関連付けられているシャードのみに移行します。
Tip
空のコレクションまたは存在しないコレクションをシャーディングする前にゾーンとゾーン範囲を定義することで、シャード コレクション操作は定義されたゾーン範囲のチャンクと、シャードキー値の全範囲をカバーする追加のチャンクを作成し、初期化を実行しますゾーン範囲に基づく チャンク分散 。 このように初期チャンクを作成して分散することで、ゾーン シャーディングの設定を迅速に行うことができます。 初期分散後、バランサーは今後のチャンク分散を管理します。
例については、「 空または存在しないコレクションのゾーンとゾーン範囲の事前定義」を参照してください。
このチュートリアルでは、ゾーンを使用して、作成日に基づいてドキュメントを、最近のドキュメントをサポートするためにゾーンされたシャード、またはアーカイブされたドキュメントをサポートするためにゾーンされたシャードにルーティングします。
以下に、 サービス レベル契約(SLA) または サービス レベルオブジェクト(SLO) に基づいてデータをセグメント化するユースケースの例を示します。
アプリケーションは、最近挿入および更新されたドキュメントへの低レイテンシアクセスを提供する必要があります
アプリケーションでは、ドキュメントの範囲またはサブセットへの低レイテンシアクセスを優先する必要があります
特定の範囲またはサブセットのデータを保証することでメリットを得るアプリケーションは、そのデータにアクセスするために SLA の に適したハードウェアを持つサーバーに保存されます。
以下の図は、ハードウェア ベースのゾーンを使用してデータ アクセス SLA または SLO を満たすシャーディングされたクラスターを示します。
Scenario
データ共有アプリケーションでは、過去 6 か月以内にアップロードされたファイルに高速にアクセスする必要があります。 このアプリケーションは、各画像のロケーションとそのメタデータを、 data
コレクションの下の photoshare
データベースに保存します。
次のドキュメントは、単一のユーザーによってアップロードされた画像を表します。
{ "_id" : 10003010, "creation_date" : ISODate("2012-12-19T06:01:17.171Z"), "userid" : 123, "photo_location" : "example.net/storage/usr/photo_1.jpg" } { "_id" : 10003011, "creation_date" : ISODate("2013-12-19T06:01:17.171Z"), "userid" : 123, "photo_location" : "example.net/storage/usr/photo_2.jpg" } { "_id" : 10003012, "creation_date" : ISODate("2016-01-19T06:01:17.171Z"), "userid" : 123, "photo_location" : "example.net/storage/usr/photo_3.jpg" }
過去 1 年以内(2016 年 6 月現在)にアップロードされた、 _id : 10003012
のドキュメントのみに注意してください。
シャードキー
このコレクションでは、 { creation_date : 1 }
インデックスがシャードキーとして使用されます。
各ドキュメントのcreation_date
フィールドを使用すると、作成時にゾーンを作成できます。
アーキテクチャ
シャーディングされたクラスターの配置は現在、3 つのシャードで構成されています。
Zones
アプリケーションでは、ハードウェア階層に基づいて各シャードをゾーンに追加する必要があります。 各ハードウェア階層は、特定の SLA または SLO を満たすように設計された特定のハードウェア構成を表します。
- 高速階層(「最近」)
これらは、大量の RAM、高速 SSD ディスク、強力な CPU を備えた最速のパフォーマンス マシンです。
ゾーンには次の範囲が必要です。
{ creation_date : ISODate(YYYY-mm-dd)}
の下限。YYYY-mm-dd
で指定された年、月、日付は過去 6 か月以内です。{ creation_date : MaxKey }
の上限。
- アーカイブ階層("アーカイブ")
これらのマシンは、RAM が少なく、ディスクが遅く、基本 CPU が多く使用されます。 ただし、サーバーあたりのストレージ容量は大きくなります。
ゾーンには次の範囲が必要です。
{ creation_date : MinKey }
の下限。{ creation_date : ISODate(YYYY-mm-dd)}
の上限。年、月、日付はrecent
階層の下限に使用される値と一致します。
パフォーマンス ニーズが増加するにつれてシャードを追加し、それらをハードウェア階層に基づいて適切なゾーンに関連付けることで、クラスターを水平方向にスケーリングできます。
時間範囲に基づいてゾーン範囲を定義する場合は、ゾーン範囲への更新が頻繁にないことのメリットと、更新時に移行する必要があるデータの量を比較してください。 たとえば、「最近」と見なされるデータの制限を 1 年に設定すると、1 か月の制限を設定するよりも多くのデータがカバーされる可能性が高くなります。 1 か月単位でローテーションする場合に必要な移行は多くなりますが、移行する必要があるドキュメントの量は 1 年単位でローテーションする場合よりも少なくなります。
書込み操作
ゾーンでは、挿入または更新されたドキュメントが設定されたゾーンと一致する場合、そのゾーン内のシャードにのみ書込むことができます。
MongoDB は、設定されたゾーンに一致しないドキュメントをクラスター内の任意のシャードに書込むことができます。
注意
上記の動作では、クラスターが定常状態で、設定されたゾーンを違反するチャンクがない状態である必要があります。 詳しくは、 バランサーの次のセクションを参照してください。
読み取り操作
MongoDB は、クエリにシャードキーが含まれている場合、特定のシャードにクエリをルーティングできます。
たとえば、MongoDB は次のクエリでターゲット読み取り操作を試行できます。クエリ ドキュメントにcreation_date
が含まれているためです。
photoDB = db.getSiblingDB("photoshare") photoDB.data.find( { "creation_date" : ISODate("2015-01-01") } )
リクエストされたドキュメントがrecent
ゾーン範囲内にある場合、MongoDB はこのクエリをそのゾーン内のシャードにルーティングし、クラスター全体のブロードキャスト読み取り操作と比較して読み取りを高速化します
バランサー
バランサーは、設定された ゾーン に従ってチャンクを適切なシャードに移行します。 移行するまで、シャードには設定されたゾーンに違反するチャンクが含まれる可能性があります。 バランシングが完了すると、シャードには、割り当てられたゾーンに違反しない範囲のチャンクのみが含まれるようになります。
ゾーンまたはゾーン範囲を追加または削除すると、チャンクの移行が発生する可能性があります。 データセットのサイズと、ゾーンまたはゾーン範囲が影響するチャンクの数によっては、これらの移行がクラスターのパフォーマンスに影響を与える可能性があります。 特定のスケジュールされた 中に バランサー Windowsを実行することを検討してください。スケジュール ウィンドウの設定方法については、「 バランシング ウィンドウのスケジュール」を参照してください。
セキュリティ
自己管理型配置で ロールベースのアクセス制御 を使用して実行されているシャーディングされたクラスターの場合は、 admin
データベースで少なくともclusterManager
ロールを持つユーザーとして認証します。
手順
ゾーンまたはゾーン範囲を作成するには、 mongos
に接続する必要があります。 シャードに直接接続して、ゾーンまたはゾーン範囲を作成することはできません。
バランサーを無効にする
新しいゾーンの構成中に移行が行われないようにするには、 コレクションでバランサーを無効にする必要があります。
バランサーを停止するには、コレクションの名前空間を指定してsh.disableBalancing()
を使用します。
sh.disableBalancing("photoshare.data")
バランサー プロセスが現在実行中かどうかを確認するには、 sh.isBalancerRunning()
を使用します。 現在のバランシング ラウンドが完了するまで待ってから続行します。
各シャードを適切なゾーンに追加する
recent
ゾーンにshard0000
を追加する。
sh.addShardTag("shard0000", "recent")
recent
ゾーンにshard0001
を追加する。
sh.addShardTag("shard0001", "recent")
archive
ゾーンにshard0002
を追加する。
sh.addShardTag("shard0002", "archive")
任意のシャードに割り当てられたゾーンは、 sh.status()
を実行して確認できます。
各ゾーンの範囲を定義する
最近の画像の範囲を定義し、 sh.addTagRange()
メソッドを使用してrecent
ゾーンに関連付けます。 このメソッドには次のものが必要です。
ターゲット コレクションの完全な名前空間。
範囲の下限(包括的)。
範囲の排他的上限。
ゾーン。
sh.addTagRange( "photoshare.data", { "creation_date" : ISODate("2016-01-01") }, { "creation_date" : MaxKey }, "recent" )
古い画像の範囲を定義し、 sh.addTagRange()
メソッドを使用してarchive
ゾーンに関連付けます。 このメソッドには次のものが必要です。
ターゲット コレクションの完全な名前空間。
範囲の下限(包括的)。
範囲の排他的上限。
ゾーン。
sh.addTagRange( "photoshare.data", { "creation_date" : MinKey }, { "creation_date" : ISODate("2016-01-01") }, "archive" )
バランサーを有効にする
バランサーを再度有効にしてクラスターのバランスを再調整します。
バランサーを起動するには、コレクションの名前空間を指定してsh.enableBalancing()
を使用します。
sh.enableBalancing("photoshare.data")
バランサー プロセスが現在実行中かどうかを確認するには、 sh.isBalancerRunning()
を使用します。
変更を確認する
次回バランサーが実行されると、設定されたゾーンに従ってシャード全体にチャンクが分割され、移行されます。
バランシングが完了すると、 recent
ゾーンのシャードにはcreation_date
がISODate("2016-01-01")
以上のドキュメントのみが含まれ、 archive
ゾーンのシャードにはcreation_date
がISODate("2016-01-01")
未満のドキュメントのみが含まれる必要があります。 。
チャンク分布は、 sh.status()
を実行して確認できます。
ゾーン範囲の更新
シャード範囲を更新するには、 cron ジョブまたはその他のスケジュールされた手順の一部として次の操作を実行します。
バランサーを無効にする
新しいゾーンの構成中に移行が行われないようにするには、 コレクションでバランサーを無効にする必要があります。
バランサーを停止するには、コレクションの名前空間を指定してsh.disableBalancing()
を使用します。
sh.disableBalancing("photoshare.data")
バランサー プロセスが現在実行中かどうかを確認するには、 sh.isBalancerRunning()
を使用します。 現在のバランシング ラウンドが完了するまで待ってから続行します。
古いシャード ゾーン範囲を削除する
sh.removeTagRange()
メソッドを使用して、古いrecent
ゾーン範囲を削除します。 このメソッドには次のものが必要です。
ターゲット コレクションの完全な名前空間。
範囲の下限(包括的)。
範囲の排他的上限。
sh.removeTagRange( "photoshare.data", { "creation_date" : ISODate("2016-01-01") }, { "creation_date" : MaxKey } )
sh.removeTagRange()
メソッドを使用して、古いarchive
ゾーン範囲を削除します。 このメソッドには次のものが必要です。
ターゲット コレクションの完全な名前空間。
範囲の下限(包括的)。
範囲の排他的上限。
sh.removeTagRange( "photoshare.data", { "creation_date" : MinKey }, { "creation_date" : ISODate("2016-01-01") } )
各ゾーンに新しいゾーン範囲を追加する
最近の画像の範囲を定義し、 sh.addTagRange()
メソッドを使用してrecent
ゾーンに関連付けます。 このメソッドには次のものが必要です。
ターゲット コレクションの完全な名前空間。
範囲の下限(包括的)。
範囲の排他的上限。
ゾーン。
sh.addTagRange( "photoshare.data", { "creation_date" : ISODate("2016-06-01") }, { "creation_date" : MaxKey }, "recent" )
古い画像の範囲を定義し、 sh.addTagRange()
メソッドを使用してarchive
ゾーンに関連付けます。 このメソッドには次のものが必要です。
ターゲット コレクションの完全な名前空間。
範囲の下限(包括的)。
範囲の排他的上限。
ゾーン。
sh.addTagRange( "photoshare.data", { "creation_date" : MinKey }, { "creation_date" : ISODate("2016-06-01") }, "archive" )
バランサーを有効にする
バランサーを再度有効にしてクラスターのバランスを再調整します。
バランサーを起動するには、コレクションの名前空間を指定してsh.enableBalancing()
を使用します。
sh.enableBalancing("photoshare.data")
バランサー プロセスが現在実行中かどうかを確認するには、 sh.isBalancerRunning()
を使用します。
変更を確認する
次回バランサーが実行されると、構成されたゾーンに従ってシャード全体にデータが移行されます。
バランシング前では、 recent
ゾーンのシャードにはcreation_date
がISODate("2016-01-01")
以上のドキュメントのみが含まれ、 archive
ゾーンのシャードにはcreation_date
がISODate("2016-01-01")
未満のドキュメントのみが含まれていました。
バランシングが完了すると、 recent
ゾーンのシャードにはcreation_date
がISODate("2016-06-01")
以上のドキュメントのみが含まれ、 archive
ゾーンのシャードにはcreation_date
がISODate("2016-06-01")
未満のドキュメントのみが含まれる必要があります。 。
チャンク分布は、 sh.status()
を実行して確認できます。