ゾーンシャーディング:データのリージョン固定
シャードキーの範囲にゾーンを定義してシャードに割り当て、データレジデンシーと地理的パーティショニングを実現します。
「ゾーンシャーディング:データのリージョン固定」はCoddyKit上の無料MongoDB Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはMongoDB Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 MongoDB Academyコースには全4レッスンが含まれています。
ゾーンシャーディングとは
ゾーンシャーディング(旧称:タグ対応シャーディング)を使用すると、特定のシャードキー範囲をゾーンと呼ばれる指定したシャードグループに割り当てられます。シャードキーがゾーンの範囲に含まれるドキュメントは、そのゾーンに属するシャードにのみ保存されます。これにより、1つのシャーディング済みクラスター内で、地理的なデータ配置、ハードウェア階層への対応付け、ワークロードの分離を実現できます。
ゾーンシャーディングの主なユースケース
ゾーンシャーディングは、本番環境における複数の問題を解決します。データレジデンシー — EUのGDPR要件では、欧州ユーザーのデータをEU域内のデータセンターに保持することが求められます。階層型ストレージ — 最近の頻繁にアクセスされるデータをNVMeシャードに、アーカイブする低頻度データを低速で安価なシャードに保持します。テナント分離 — マルチテナントSaaSアプリケーションで、ノイジーネイバーを防ぐため、各エンタープライズ顧客のデータを専用シャードに固定します。
手順1:ゾーン名でシャードにタグを付ける
最初の手順は、1つ以上のシャードにゾーンタグを割り当てることです。1つのシャードを複数のゾーンに所属させることもできます。タグは、任意に選択できる単なる文字列です。タグを付けると、balancerはゾーンタグに割り当てられたチャンクを、同じタグを持つシャードにのみ移動するようになります。
// Tag shards with geographic zones
sh.addShardTag('shard-eu-west-1', 'EU')
sh.addShardTag('shard-eu-central-1', 'EU')
sh.addShardTag('shard-us-east-1', 'US')
sh.addShardTag('shard-us-west-2', 'US')手順2:ゾーンのシャードキー範囲を定義する
次に、sh.addTagRange()を使用して、各ゾーンに対応するシャードキー範囲を定義します。これによりbalancerに対して、「この範囲内のシャードキーを持つすべてのドキュメントは、このゾーンのタグが付いたシャードに配置する」ことを指定します。範囲の片側が開いた境界には、MinKeyとMaxKeyを使用してください。
// Assign EU shard key range to EU zone
sh.addTagRange(
'mydb.users',
{ region: 'EU', userId: MinKey },
{ region: 'EU', userId: MaxKey },
'EU'
)
// Assign US shard key range to US zone
sh.addTagRange(
'mydb.users',
{ region: 'US', userId: MinKey },
{ region: 'US', userId: MaxKey },
'US'
)ゾーンシャーディングのシャードキー設計
ゾーンシャーディングには、最初のコンポーネントをゾーンを識別するフィールド(例:region、tenantId、tier)とする複合シャードキーが必要です。2番目のコンポーネントは、ゾーン内でさらに分割するための粒度を提供します。例:{ region: 1, userId: 1 }では、regionが適切なゾーンにルーティングし、userIdによって各ゾーン内でチャンクを細かく分割できます。
// Shard the collection with a zone-aware compound key
sh.enableSharding('mydb')
sh.shardCollection('mydb.users', { region: 1, userId: 1 })balancerによるゾーン所属の適用
ゾーンを設定すると、balancerはゾーンへの所属を継続的に適用します。EUゾーンの範囲に含まれるキーを持つチャンクがUSのシャードに配置されている場合(シャードの追加やゾーン定義の変更後など)、balancerはそのチャンクをEUのシャードへ移行します。この移行は、次回のbalancerラウンドで自動的に行われます。
// Monitor that chunks are on the correct zone shards
use config
db.chunks.find(
{ ns: 'mydb.users', 'min.region': 'EU' },
{ shard: 1, min: 1 }
)
// All returned chunks should be on EU-tagged shards階層型ストレージ:ホットゾーンとコールドゾーン
ゾーンシャーディングでは、階層型ストレージを実現できます。最近のデータ(例:当月のデータ)を高速なNVMeベースのシャード上の「ホット」ゾーンに割り当て、古いデータを低速なHDDベースのシャード上の「コールド」ゾーンに割り当てます。データが古くなったら、ゾーン範囲の割り当てを更新し、古くなったチャンクをbalancerによってホットゾーンからコールドゾーンへ段階的に移行できます。
// Tiered storage by age
sh.addShardTag('shard01', 'HOT')
sh.addShardTag('shard02', 'COLD')
sh.addTagRange('mydb.events',
{ year: 2025, _id: MinKey },
{ year: 2025, _id: MaxKey },
'HOT'
)
sh.addTagRange('mydb.events',
{ year: 2024, _id: MinKey },
{ year: 2024, _id: MaxKey },
'COLD'
)ゾーン範囲の削除と更新
ビジネス要件の変化に応じて、ゾーン範囲の割り当てを更新してデータを移動できます。既存の範囲をsh.removeTagRange()で削除し、新しい範囲を追加します。するとbalancerが、影響を受けるチャンクを新しい割り当てに合わせて移行します。これにより、毎月データを「ホット」ゾーンから「コールド」ゾーンへ移行できます。
// Remove an old zone range
sh.removeTagRange(
'mydb.events',
{ year: 2024, _id: MinKey },
{ year: 2024, _id: MaxKey },
'HOT'
)
// Add it to COLD zone instead
sh.addTagRange('mydb.events',
{ year: 2024, _id: MinKey },
{ year: 2024, _id: MaxKey },
'COLD'
)ゾーン対応シャードキーを使用したクエリ
{ region: 1, userId: 1 }のような複合ゾーン対応シャードキーを使用すると、regionフィールドを含むクエリは、適切なゾーンのシャードへ自動的にルーティングされます。これにより、データレジデンシー要件への準拠とクエリ性能の両方を実現できます。EU向けのクエリがUSのシャードにアクセスすることはありません。
// Query from a EU service — targeted to EU shards only
const user = await db.users.findOne({ region: 'EU', userId: 'u789' })
// mongos routes this to EU-tagged shards only — data never
// leaves EU-region shards even for the query itself制限事項と注意点
ゾーンシャーディングには、いくつか重要な制限があります。1) 使用できるのはレンジシャーディングのみです(単一フィールドのハッシュシャーディングは使用できません)。2) どのゾーン範囲にも含まれないドキュメントは、任意のシャードに分散される可能性があります。MinKeyからMaxKeyまでを使用して、範囲がすべての可能な値をカバーするようにしてください。3) 大規模なコレクションでは、ゾーンの移行に時間がかかることがあります。トラフィックの少ない時間帯に移行するよう計画してください。
// Ensure all documents are covered by a zone
// Uncovered ranges can land on any shard
sh.addTagRange('mydb.users',
{ region: MinKey, userId: MinKey }, // catch-all
{ region: 'EU', userId: MinKey },
'US' // everything before EU goes to US zone
)ゾーン設定の確認
現在のゾーン設定は、いつでも確認できます。ゾーンタグはconfig serverのconfig.shardsコレクションとconfig.tagsコレクションに保存されます。sh.status()は、チャンクの分散状況とともにゾーン情報を表示するため、balancerがゾーンへの所属を正しく適用したことを簡単に確認できます。
// View all zone ranges configured for a collection
use config
db.tags.find({ ns: 'mydb.users' })
// Full cluster and zone overview
sh.status()
// Shows: zones, shards in each zone, chunks per shard理解度チェック
このレッスンで学んだMongoDBとNoSQLデータベースの概念について、理解度を確認しましょう。
レッスンのまとめ
このレッスンでは、ゾーンシャーディングはシャードキー範囲をタグ付きシャードに固定し、データレジデンシーとワークロードの分離を実現すること、最初のフィールドをゾーン識別子とする複合シャードキーが必要であること、そしてゾーンの割り当てが変わるとbalancerがゾーンへの所属を自動的に適用し、チャンクを移行することを学びました。次は、パフォーマンスのチューニングとデータベースプロファイラーについて学びます。
AI チューターと学ぶ JavaScript — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 30
- レッスン
- 120
よくある質問
「ゾーンシャーディング:データのリージョン固定」レッスンは無料ですか?
はい。「ゾーンシャーディング:データのリージョン固定」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、MongoDB Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 MongoDB Academyコースには全4レッスンが含まれています。
「ゾーンシャーディング:データのリージョン固定」で何を学びますか?
シャードキーの範囲にゾーンを定義してシャードに割り当て、データレジデンシーと地理的パーティショニングを実現します。 ブラウザで直接実行するハンズオンコードでMongoDB Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
MongoDB Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのMongoDB Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「ゾーンシャーディング:データのリージョン固定」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このMongoDB Academyレッスンでコードを書いて実行できますか?
はい。すべてのMongoDB Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- シャーディングの概念:チャンク、バランサー、シャードキー
- シャードキーの選択:カーディナリティ、頻度、単調性
- レンジシャーディングとハッシュシャーディングの戦略
- ゾーンシャーディング:データのリージョン固定