コンテンツにスキップ

付録B. 目的別の読み方と参考資料

本書は01章から順に読めますが、実務上の課題から逆引きすることもできます。

推奨順:

  1. 01. データベースシステムの全体像
  2. 03. ページ、レコード、バッファプール
  3. 04. B-木、B+木、インデックス設計
  4. 06. SQLから論理実行計画へ
  5. 07. 物理実行と演算子
  6. 10. ACIDと分離レベル
  7. 11. 並行性制御
  8. 12. WALとクラッシュリカバリ

まず単一ノードDBのクエリ、メモリ、トランザクション、復旧を一つの流れとして理解してから分散DBへ進みます。

  1. 04. インデックス設計
  2. 07. 物理実行と演算子
  3. 08. 結合アルゴリズム
  4. 09. コストベース最適化
  5. 17. アプリケーションからのDB利用と運用

EXPLAIN解析では、最上位の時間ではなく、推定行と実行が最初にずれた演算子、過剰なループ数、ディスク退避、ページアクセスを探します。

トランザクションの競合を診断したい

Section titled “トランザクションの競合を診断したい”
  1. 10. ACIDと分離レベル
  2. 11. 並行性制御
  3. 17. アプリケーションからのDB利用と運用

業務上の不変条件を先に文章化し、どのスケジュールで壊れるかを書きます。その後に分離レベル、原子的なUPDATE、ロック、OCC、Serializableを選びます。

レプリケーション遅延とフェイルオーバーを理解したい

Section titled “レプリケーション遅延とフェイルオーバーを理解したい”
  1. 12. WALとクラッシュリカバリ
  2. 13. レプリケーションと整合性
  3. 14. 合意形成とRaft
  4. 17. アプリケーションからのDB利用と運用

受信、書き出し、再生のどこまで進んだか、コミット時にどの確認応答を待つか、古い主系をどうフェンシングするかを確認します。

シャーディングを検討している

Section titled “シャーディングを検討している”
  1. 09. コストベース最適化
  2. 13. レプリケーションと整合性
  3. 14. 合意形成とRaft
  4. 15. パーティショニングとシャーディング
  5. 16. 分散トランザクション

シャーディング前に、単一ノード垂直拡張、インデックス、キャッシュ、読み取りレプリカ、アーカイブ、パーティション表で解決できないボトルネックか測定します。

マイクロサービスの整合性を設計したい

Section titled “マイクロサービスの整合性を設計したい”
  1. 10. ACIDと分離レベル
  2. 13. レプリケーションと整合性
  3. 16. 分散トランザクション
  4. 18. 総合演習

「結果整合性」で済ませず、各状態、外部から見える中間状態、タイムアウト、再試行、補償、手動復旧を障害マトリクスへ書きます。

本書は共通原理を中心にし、製品固有の例を区別しています。特に次は同じ語でも構造が異なります。

項目 PostgreSQL MySQL/InnoDB LSM系DB
表の配置 ヒープ + 別インデックス 主キー クラスタ化葉に行 Memtable + SSTable群
副系位置情報 ヒープTID 主キー 値 キー/バージョン/LSM内位置
MVCC古いバージョン ヒープタプルバージョン 取り消し連鎖 連番/バージョン + 削除マーカー等
保守 不要版の回収、チェックポイント 不要版の削除、チェックポイント コンパクション
レプリケーション基底 WALストリーミング/論理 バイナリログ/再実行系 複製ログ/エンジン固有
Serializable SSI等 ロック/MVCC、設定依存 製品固有のプロトコルに依存

バージョンによって挙動は変わります。実運用では必ず使用バージョンの公式文書と実行計画を確認します。

本文の概念を観察する最小環境として、コンテナまたは局所PostgreSQLを利用できます。

試す項目:

  • EXPLAIN (解析, BUFFERS)
  • 複合インデックス追加前後
  • work_memを変えたソートディスク退避
  • 二セッションで更新消失/デッドロック
  • pg_locks、pg_stat_activity
  • 長時間トランザクションと不要版の回収
  • WAL/チェックポイント統計
  • ストリーミングレプリケーションの遅延
  • バックアップ + PITR

実験値はハードウェア、キャッシュ、データ分布で変わります。結果だけでなく、データ量、バージョン、設定、キャッシュ状態、実行回数を記録します。

次を分けます。

  1. 保証:何をコミット済み、可視、永続化済みと定義するか
  2. 既定値:初期設定でどの保証が有効か
  3. 仕組み:ロック、バージョン、ログ、クォーラムなどの実装
  4. 障害:ノード/ネットワーク/ストレージ障害時の挙動
  5. 操作:バックアップ、更新、フェイルオーバー、監視

機能一覧だけでなく障害意味論を読みます。

  • データ集合がメモリへ収まるか
  • 温/低温キャッシュ
  • 読み取り/書き込み比率
  • キー/データ偏り
  • トランザクション大きさ
  • 同時実行性
  • 永続性設定
  • レプリカ/確認応答条件
  • コンパクション/チェックポイント中か
  • 裾の遅延時間

永続性を無効化したベンチマークと本番環境設定を比較しません。平均処理量だけでなくp95/p99、資源、バックグラウンド処理を記録します。

次を一つのリクエストについて説明できれば、本書の概念が接続されています。

  1. 論理スキーマと制約
  2. レコード/ページ/インデックス配置
  3. SQLから論理/物理計画
  4. 走査/結合/集約のデータ流れ
  5. 並行するトランザクションとの競合
  6. コミットとWAL書き出し
  7. クラッシュ後の再実行/取り消し
  8. レプリカへのコミット/適用
  9. シャード振り分け
  10. サービス横断障害と冪等な復旧

18章の総合演習を、自分のサービスのリクエストへ置き換えて図にしてください。