SDN
← 概念一覧へ
データベース

シャーディング(水平分割)

Sharding

1つの巨大テーブルを行で分割し、複数のDB(シャード)に分散する手法。各シャードはデータの一部だけを持つ。例: 姓の頭文字や地域で分ける。書き込みもスケールできる。

キーポイント
  • 同じテーブルのデータを複数のDB(シャード)に分散。各シャードは全体のサブセット(部分)を持つ。
  • 分割キーの例: 姓の頭文字(A-M / N-Z)、地域、ユーザーIDのハッシュ。
  • 各シャードが小さくなり、読み書き・レプリ遅延・インデックスサイズが減る。1シャード障害でも他は稼働。
  • 短所: アプリがシャードを意識する必要があり複雑化。データ偏り(power user)。リバランスが難しい(consistent hashingで緩和)。シャードをまたぐJOINが困難。
トレードオフ

Federationと違い『同じテーブル』を分割するので、1つの巨大テーブルでも分散でき、書き込みもスケールする。一方、どのシャードにデータがあるかをアプリが計算する必要があり複雑。データが偏る(有名人のデータに集中=ホットスポット)と一部シャードだけ過負荷に。シャード構成の変更(リバランス)はデータ移動が大量に発生し難しいが、consistent hashingで移動量を抑えられる。シャードをまたぐJOINやトランザクションも困難になる。

たとえ話: 名簿を頭文字で分冊する

1冊の巨大な名簿(=テーブル)が分厚すぎて扱えないとき、『あ〜さ行』『た〜は行』『ま〜わ行』と複数の冊子(=シャード)に分けます。各冊子は名簿の一部だけを持ち、薄くて扱いやすい。『佐藤さん』を探すなら最初の冊子だけ見ればいい。

図を描画中...

Federation との決定的な違い(再確認)

  • Federation = テーブルの種類で分ける(users用DB、products用DB)= 縦割り。
  • Sharding = 同じテーブルの行で分ける(usersを頭文字で複数DBに)= 横割り。

だからShardingは『1つのテーブルが巨大すぎる』問題に効きます。Federationでは解けないケースの切り札です。

メリット

  • 各シャードが小さい → インデックス縮小、検索高速化。
  • 書き込みも分散 → 別シャードへの書き込みは並行に走る(書き込みスケール)。
  • 障害分離 → 1シャードが落ちても、他のシャードのデータは使える。

3大つまずきポイント

1. データの偏り(ホットスポット)

分割キーが悪いと、特定シャードにアクセスが集中します。

例: フォロワー数で分けたら、有名人のいるシャードだけアクセス殺到。

均等に散らばる分割キー(ハッシュなど)を選ぶことが重要です。

2. リバランスの難しさ

シャードを増やすとき、単純な方法(IDを台数で割った余り)だと、台数が変わった瞬間にほぼ全データの再配置が必要になります。

図を描画中...

これを consistent hashing(コンシステントハッシュ) で緩和します。台数変更時に動かすデータ量を最小限に抑える賢い割り当て方式です。

3. シャードまたぎのJOIN・トランザクション

別シャードにあるデータ同士を結合・同時更新するのが難しい。アプリ側で複数シャードに問い合わせて結合する、といった手間が増えます。

つまずきポイント総括

  • ShardingとFederationは『縦割りか横割りか』で区別する。
  • 分割キー選びが命。偏ると意味がない。
  • 一度シャーディングすると後戻りが大変。導入は本当に必要になってから。

関連する概念

この概念で腕試し

関連する 8 問のクイズに挑戦できます。

クイズを解く