📓

第6章:パーティションは“設計の先読み力”が試される

に公開

第6章:パーティションは“設計の先読み力”が試される

『データ指向アプリケーションデザイン(DDIA)』第6章を読んだメモです
スケーラビリティ設計の核心「パーティション」の話
将来予測と構造的な割り切り、その間で揺れる設計思考を整理しました

🔙 目次に戻る


シャーディングって、実際どのタイミングで必要?

まず前提として、シャーディング(パーティション)を導入すると、もう戻れない設計になる

だからこそ:

  • 現時点でのスケール要件
  • 将来の伸び方(件数?ユーザー?リクエスト?)
  • 更新頻度とデータの“偏り方”

これらを読んで、将来に先回りした構造を選ぶ必要がある
でも当然、予測なんて大体ハズれる


ホットスポットの正体は、“意図してない集中”

  • 月末に請求データが集中する
  • 特定のテナントにだけアクセスが集中する

──こういうのがホットスポット。

重要なのは、「偏りを予測できたか」ではなく「偏っても破綻しない構造か?」という視点
アプリケーション側のルーティング戦略が鍵を握ることが多い


パーティションキーは“設計の芯”

たとえば:

  • ユーザーIDで分ける
  • 日付で分ける
  • テナント単位で分ける

などがあるが、一度選ぶとテーブル設計もクエリ構造もその前提に縛られる

つまり、あとからの変更=全再設計レベルの作業になる

図6: ハッシュパーティションとノード追加時の再シャーディング概念図


ルーティング層は地味に“命綱”

「このデータはどのインスタンスに送るか?」を決める層

軽く見られがちだが:

  • 単一障害点になりうる
  • 再編タイミングのズレで迷子が発生
  • キャッシュと実データのズレも起きうる

など、意外と繊細な存在

ただし、パーティションキー生成のタイミングが静的(例:テナント作成時)なら
コピーしやすく、スケールにも強くなる


リバランシング:設計者が一番やりたくないやつ

パーティションを増減させて負荷分散する処理

でも現場ではこう言われがち:

「これ、サービス止めずにできるんですか?」

理屈ではYES。でも現場感覚ではNOに近い

  • データ転送が重い
  • 切替タイミング次第で迷子が出る
  • 並行実行で整合性が壊れる

→ 自動化よりも、人手での慎重な運用設計が無難


テイルレイテンシ:遅い1つのせいで全体が終わらない

10個の処理を並列化しても、最後の1個が遅ければ全体が遅くなる
これがテイルレイテンシ

「全体を速くしたつもりが、1つの“しっぽ”で台無しにされる」構図は、地味に根深い


パーティションキー選定の難しさ=「将来見えない」問題

理想:

  • 均等に分散されるキー
  • 将来も分布が変わらない
  • ユースケースの変化にも対応できる

でも現実は:

  • そんな都合のいいキーはない🙃

なのでリスク変化に耐えられる構造を考える
たとえば:

  • 一部データだけ「キー→インスタンス」マップ管理
  • 残りはラウンドロビンで自動分配
  • 将来はマップだけ更新してリバランス

──みたいな「変えやすい構造」を仕込んでおくと安全


✍️ まとめ:スケーラビリティ設計とは、“確実に失敗する未来”との折り合い

パーティション設計とは、将来の爆発を前提とした**“敗北前提の準備”**

大事なのは「失敗しないこと」じゃなく、
「失敗しても壊れない」設計をしておくこと


💡 設計Tips

  • シャーディングは引き返せない設計、導入は慎重に
  • パーティションキーは「変えられない前提」で選ぶ
  • ホットスポットは“必ず来るもの”として構えておく
  • リバランシングは人手の介在を前提にして設計する
  • テイルレイテンシは、“最後の1件”に意識を向ける

🔙 目次に戻る

Discussion