付録B. 目的別の読み方と参考資料
本書は01章から順に読めますが、実務上の課題から逆引きすることもできます。
初めてDB内部を学ぶ
Section titled “初めてDB内部を学ぶ”推奨順:
- 01. データベースシステムの全体像
- 03. ページ、レコード、バッファプール
- 04. B-tree、B+tree、インデックス設計
- 06. SQLから論理実行計画へ
- 07. 物理実行と演算子
- 10. ACIDと分離レベル
- 11. 並行性制御
- 12. WALとクラッシュリカバリ
まず単一node DBのquery、memory、transaction、recoveryを一つの流れとして理解してから分散DBへ進みます。
遅いqueryを診断したい
Section titled “遅いqueryを診断したい”EXPLAIN ANALYZEでは、最上位の時間ではなく、推定rowと実rowが最初にずれたoperator、過剰なloops、spill、page accessを探します。
transactionの競合を診断したい
Section titled “transactionの競合を診断したい”業務上の不変条件を先に文章化し、どのscheduleで壊れるかを書きます。その後にisolation level、atomic UPDATE、lock、OCC、Serializableを選びます。
replication lagとfailoverを理解したい
Section titled “replication lagとfailoverを理解したい”Receive、flush、replayのどこまで進んだか、commit時にどのackを待つか、old primaryをどうfenceするかを確認します。
shardingを検討している
Section titled “shardingを検討している”Sharding前に、single-node vertical scaling、index、cache、read replica、archive、partitioned tableで解決できないbottleneckか測定します。
microservicesの整合性を設計したい
Section titled “microservicesの整合性を設計したい”「eventual consistency」で済ませず、各state、visible intermediate state、timeout、retry、compensation、manual recoveryをfailure matrixへ書きます。
製品共通原理と実装差
Section titled “製品共通原理と実装差”本書は共通原理を中心にし、製品固有の例を区別しています。特に次は同じ語でも構造が異なります。
| 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、実行回数を記録します。
読むべき一次資料
Section titled “読むべき一次資料”Relationとquery
Section titled “Relationとquery”- E. F. Codd, “A Relational Model of Data for Large Shared Data Banks”
- Goetz Graefe, “Query Evaluation Techniques for Large Databases”
- Surajit Chaudhuri, “An Overview of Query Optimization in Relational Systems”
Storage
Section titled “Storage”- Patrick O’Neil et al., “The Log-Structured Merge-Tree”
- PostgreSQL: Database Page Layout
- RocksDB Wiki
Transactionとrecovery
Section titled “Transactionとrecovery”- Hal Berenson et al., “A Critique of ANSI SQL Isolation Levels”
- Michael J. Cahill et al., “Serializable Isolation for Snapshot Databases”
- C. Mohan et al., “ARIES”
分散system
Section titled “分散system”- Raft Paper
- Dynamo Paper
- Spanner Paper
- Gilbert and Lynch, CAP proof
- Gray and Lamport, Consensus on Transaction Commit
- Garcia-Molina and Salem, Sagas
公式documentationを読むとき
Section titled “公式documentationを読むとき”次を分けます。
- 保証:何をcommit、visible、durableと定義するか
- default:初期設定でどの保証が有効か
- mechanism:lock、version、log、quorumなどの実装
- failure:node/network/storage failure時の挙動
- operation:backup、upgrade、failover、monitoring
Feature listだけでなくfailure semanticsを読みます。
benchmarkの注意
Section titled “benchmarkの注意”- 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を記録します。
学習の完成条件
Section titled “学習の完成条件”次を一つのrequestについて説明できれば、本書の概念が接続されています。
- Logical schemaとconstraint
- Record/page/index配置
- SQLからlogical/physical plan
- Scan/join/aggregateのdata flow
- Concurrent transactionとの競合
- COMMITとWAL flush
- Crash後のredo/undo
- Replicaへのcommit/apply
- Shard routing
- Cross-service failureとidempotent recovery
18章の総合演習を、自分のserviceのrequestへ置き換えて図にしてください。