シャーディング — データを分けて持つ
1台に入りきらないデータは、複数台で分担する。どうやって分けるか(ハッシュ分割・範囲分割)、台数が変わったらどう引っ越すか(リバランス)。分散データベースの土台になる考え方を、キーが実際に散らばる様子で体感します。
1. キーで行き先を決める — ハッシュ分割
データ全体をいくつかのシャード(断片)に分け、各ノードが一部だけを担当する方式をシャーディング(パーティショニングとも)と呼びます。いちばん基本的な分け方がハッシュ分割:キー(ユーザー名など)からハッシュ関数で大きな数を作り、ノード台数で割った余りで行き先を決めます。
下のデモで「キーを追加」を連打してみてください。行き先はキーごとにバラバラに見えて、数が増えるほど4台にほぼ均等に散らばっていきます。
2. もう1つの分け方 — 範囲分割とホットスポット
辞書の巻のように「a〜f はノード0、g〜m はノード1…」とキーの範囲で分けるのが範囲分割です。隣り合うキーが同じノードに集まるので、「a で始まる商品を全部読む」のような連続アクセス(範囲スキャン)に強いのが利点。
ただし弱点があります。下のデモで「アクセスの偏り」スライダーを上げて、人気キー news にアクセスが集中したときに何が起きるか見てください。
3. ノードを増やす日 — リバランスの大問題
データが増えたので4台を5台にしたい。ここで mod N 方式の落とし穴が現れます。N が 4→5 に変わると、ほぼすべてのキーで余りの値が変わり、大量のデータ引っ越しが発生するのです。
そこで考え出されたのがコンシステントハッシュ。ハッシュ値を円環(リング)上の位置とみなし、キーは「リングを時計回りに進んで最初に出会うノード」が担当します。ノードを追加しても、新ノードのすぐ手前の区間のキーだけが引っ越します。下の「ノードを追加」ボタンで両方式の移動量を比べてください。
4. 現実の構成 — シャーディング × レプリケーション
シャーディングは「分けるだけ」なので、1台壊れるとそのシャードのデータが丸ごと読めなくなる危険があります。だから実際のシステムでは、各シャードを複数のノードに複製(レプリケーション)して持ちます。「分けて、さらに複製する」— これが分散データベースの標準形です。
5. まとめ
- シャーディング:データを分けて複数ノードが分担する。1台の容量・性能の限界を超えるための基本技。
- ハッシュ分割は均等にばらまける、範囲分割は連続アクセスに強い — ただし人気キーのホットスポットには別途対策が要る。
- mod N は台数変更に弱い。コンシステントハッシュならノード追加時の引っ越しが一部のキーだけで済む。
- 現実のシステムはシャーディング × レプリケーションの格子。分けることと複製することは別の道具で、両方使う。