コンテンツにスキップ

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

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

推奨順:

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

まず単一node DBのquery、memory、transaction、recoveryを一つの流れとして理解してから分散DBへ進みます。

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

EXPLAIN ANALYZEでは、最上位の時間ではなく、推定rowと実rowが最初にずれたoperator、過剰なloops、spill、page accessを探します。

  1. 10. ACIDと分離レベル
  2. 11. 並行性制御
  3. 17. アプリケーションからのDB利用と運用

業務上の不変条件を先に文章化し、どのscheduleで壊れるかを書きます。その後にisolation level、atomic UPDATE、lock、OCC、Serializableを選びます。

replication lagとfailoverを理解したい

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

Receive、flush、replayのどこまで進んだか、commit時にどのackを待つか、old primaryをどうfenceするかを確認します。

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

Sharding前に、single-node vertical scaling、index、cache、read replica、archive、partitioned tableで解決できないbottleneckか測定します。

microservicesの整合性を設計したい

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

「eventual consistency」で済ませず、各state、visible intermediate state、timeout、retry、compensation、manual recoveryをfailure matrixへ書きます。

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

Topic PostgreSQL MySQL/InnoDB LSM系DB
Table layout Heap + separate indexes Primary key clustered leafにrow Memtable + SSTables
Secondary locator Heap TID Primary key value Key/version/LSM内位置
MVCC old version Heap tuple version Undo chain Sequence/version + tombstone等
Maintenance VACUUM、checkpoint Purge、checkpoint Compaction
Replication base WAL streaming/logical Binlog/redo系 Replicated log/engine固有
Serializable SSI等 Lock/MVCC、設定依存 Product protocol依存

Versionによって挙動は変わります。実運用では必ず使用versionの公式documentと実行計画を確認します。

本文の概念を観察する最小環境として、containerまたはlocal PostgreSQLを利用できます。

試す項目:

  • EXPLAIN (ANALYZE, BUFFERS)
  • Composite index追加前後
  • work_memを変えたsort spill
  • 二sessionでlost update/deadlock
  • pg_locks、pg_stat_activity
  • Long transactionとVACUUM
  • WAL/checkpoint統計
  • Streaming replica lag
  • Backup + PITR

実験値はhardware、cache、data distributionで変わります。結果だけでなく、data量、version、設定、cache state、実行回数を記録します。

次を分けます。

  1. 保証:何をcommit、visible、durableと定義するか
  2. default:初期設定でどの保証が有効か
  3. mechanism:lock、version、log、quorumなどの実装
  4. failure:node/network/storage failure時の挙動
  5. operation:backup、upgrade、failover、monitoring

Feature listだけでなくfailure semanticsを読みます。

  • Datasetがmemoryへ収まるか
  • Warm/cold cache
  • Read/write ratio
  • Key/data skew
  • Transaction size
  • Concurrency
  • Durability設定
  • Replica/ack条件
  • Compaction/checkpoint中か
  • Tail latency

Durabilityを無効化したbenchmarkとproduction設定を比較しません。平均throughputだけでなくp95/p99、resource、background workを記録します。

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

  1. Logical schemaとconstraint
  2. Record/page/index配置
  3. SQLからlogical/physical plan
  4. Scan/join/aggregateのdata flow
  5. Concurrent transactionとの競合
  6. COMMITとWAL flush
  7. Crash後のredo/undo
  8. Replicaへのcommit/apply
  9. Shard routing
  10. Cross-service failureとidempotent recovery

18章の総合演習を、自分のserviceのrequestへ置き換えて図にしてください。