MongoDB Academy · レッスン

ゾーンシャーディング:データのリージョン固定

シャードキーの範囲にゾーンを定義してシャードに割り当て、データレジデンシーと地理的パーティショニングを実現します。

レッスン 4/413 ステップ

「ゾーンシャーディング:データのリージョン固定」は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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. シャーディングの概念:チャンク、バランサー、シャードキー
  2. シャードキーの選択:カーディナリティ、頻度、単調性
  3. レンジシャーディングとハッシュシャーディングの戦略
  4. ゾーンシャーディング:データのリージョン固定
← MongoDB Academyに戻る