0Pricing
SQL Academy · レッスン

シャーディング戦略:範囲、ハッシュ、ディレクトリ

範囲ベース、ハッシュベース、ディレクトリベースのシャーディングを比較し、負荷を分散しつつ安定するシャードキーを選びます。

「シャーディング戦略:範囲、ハッシュ、ディレクトリ」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

シャーディングとは

1つの論理データベースを複数の物理サーバー(「シャード」)に分割し、それぞれにデータの一部を保持させることです。1台のサーバーでワークロードを処理できなくなった場合に行います。

シャーディングとレプリケーションの違い

  • レプリケーション — 同じデータを複数のサーバーに保持します(HA、読み取りスケーリング用)
  • シャーディング — 異なるデータを異なるサーバーに保持します(書き込みスケーリング、容量拡張用)

両方を組み合わせることもよくあります。各シャードをHAのためにレプリケーションします。

3つのシャーディング戦略

  • レンジ — 値の範囲でシャード分割します(id 1-1MはシャードA、1M-2MはシャードB)
  • ハッシュ — シャードキーをハッシュ化し、Nで剰余を取ります
  • ディレクトリ — 別のテーブルでキー → シャードの対応を管理します

レンジシャーディング

単純で、時系列データや順序付けられたIDに適しています。ただし、最近のデータにトラフィックが集中すると、ホットシャードが発生するリスクがあります。

-- Conceptually:
-- Shard A: user_id 1 - 1,000,000
-- Shard B: user_id 1,000,001 - 2,000,000
-- Shard C: user_id 2,000,001 - 3,000,000

ハッシュシャーディング

通常は均等に分散されます。ただし、シャードの追加は困難です(リシャーディングによってすべてのキーを移動する必要があります):

-- shard_id = hash(user_id) % N
-- N=4: any user_id evenly distributed across 4 shards

ディレクトリシャーディング

ルックアップテーブルで各キーをシャードに対応付けます:

CREATE TABLE shard_routing (
  user_id BIGINT PRIMARY KEY,
  shard_id INT NOT NULL
);

-- Looking up a user costs a directory query first; cache it.

コンシステントハッシュ法

シャードを追加すると、剰余によるハッシュ化では多くのキーが移動してしまいます。コンシステントハッシュ法なら、移動が必要なキーを最小限に抑えられます:

-- Each shard owns a ring segment.
-- Adding a new shard moves only ~1/N of the keys.

シャードキーの選び方

シャードキーがすべてを決めます。適切なシャードキーには、次の特徴があります:

  • 均等に分散される
  • ほとんどのクエリに含まれる(シャード横断のファンアウトを避けられる)
  • 不変である(または変更がほとんどない)
<p>Common picks: user_id, tenant_id, customer_id. Avoid: timestamps for write-heavy workloads (creates hot shards).</p>

テナントごとのシャード

マルチテナントSaaSでは、各テナントを専用のシャードに配置します。構成を理解しやすく、負荷の高いテナントを簡単に分離できます。

リシャーディング可能な設計

将来のリシャーディングを考慮して設計します:

  • 仮想シャードを使用します(例:1024個の論理シャードを物理シャードに割り当てる)
  • 論理シャードを別の物理サーバーへ簡単に移行できるようにします
  • シャード数をハードコードしたアプリケーションコードは避けます

シャード横断クエリ

最も難しい問題です。シャードをまたぐJOINやレポートには、アプリケーション側でのファンアウトと集約ロジックが必要です。詳しくは次のレッスンで扱います。

シャードをまたぐトランザクション

シャード横断のアトミックなトランザクションには、2フェーズコミット(2PC)またはSagaが必要です。一般的には、トランザクションが1つのシャード内に収まるように設計することを推奨します。

まとめ

3つの戦略から、トラフィックの形状に応じて選びます。

  • レンジ — 単純ですが、ホットシャードのリスクがあります
  • ハッシュ — 均等ですが、柔軟性に欠けます
  • ディレクトリ — 柔軟ですが、遅延が増えます
  • スムーズなリシャーディングにはコンシステントハッシュ法

確認問題

usersテーブルをhash(user_id)でシャード分割しています。シャード数を4から5に増やす場合、何個のキーを移動する必要がありますか。

よくある質問

「シャーディング戦略:範囲、ハッシュ、ディレクトリ」レッスンは無料ですか?

はい。「シャーディング戦略:範囲、ハッシュ、ディレクトリ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「シャーディング戦略:範囲、ハッシュ、ディレクトリ」で何を学びますか?

範囲ベース、ハッシュベース、ディレクトリベースのシャーディングを比較し、負荷を分散しつつ安定するシャードキーを選びます。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「シャーディング戦略:範囲、ハッシュ、ディレクトリ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

  1. シャーディング戦略:範囲、ハッシュ、ディレクトリ
  2. シャード間クエリ:難しい問題
  3. Citusと分散Postgres
  4. シャーディングしない場合
← SQL Academyに戻る