# 目录

> DDIA 第二版完整目录：十四章，涵盖数据系统基础、分布式数据与派生数据。

---

LLMS 索引： [llms.txt](/llms.txt)

---

![](/title.jpg)

这份目录与左侧章节树、页末顺序导航共享同一阅读顺序；章内标题直接来自各页的稳定锚点。选择任意条目即可进入对应章节或小节。

- [目录](/toc/)
  - [插图目录](/toc/#list-of-figures)
  - [表格目录](/toc/#list-of-tables)
  - [示例目录](/toc/#list-of-examples)
- [序言](/preface/)
  - [本书的目标读者](/preface/#本书的目标读者)
  - [本书涉及的领域](/preface/#本书涉及的领域)
  - [本书纲要](/preface/#本书纲要)
  - [参考文献与延伸阅读](/preface/#参考文献与延伸阅读)
  - [O‘Reilly Safari](/preface/#oreilly-safari)
  - [联系我们](/preface/#联系我们)
  - [致谢](/preface/#致谢)
- [I 数据系统基础](/part-i/)
  - [1. 数据系统架构中的权衡](/part-i/#1-数据系统架构中的权衡)
  - [2. 定义非功能性需求](/part-i/#2-定义非功能性需求)
  - [3. 数据模型与查询语言](/part-i/#3-数据模型与查询语言)
  - [4. 存储与检索](/part-i/#4-存储与检索)
  - [5. 编码与演化](/part-i/#5-编码与演化)
- [1 数据系统架构中的权衡](/ch1/)
  - [分析型与事务型系统](/ch1/#sec_introduction_analytics)
    - [事务处理与分析的特征](/ch1/#sec_introduction_oltp)
    - [数据仓库](/ch1/#sec_introduction_dwh)
      - [从数据仓库到数据湖](/ch1/#from-data-warehouse-to-data-lake)
      - [超越数据湖](/ch1/#beyond-the-data-lake)
    - [权威记录系统与衍生数据](/ch1/#sec_introduction_derived)
  - [云服务与自托管](/ch1/#sec_introduction_cloud)
    - [云服务的利弊](/ch1/#sec_introduction_cloud_tradeoffs)
    - [云原生系统架构](/ch1/#sec_introduction_cloud_native)
      - [云服务的分层](/ch1/#layering-of-cloud-services)
      - [存储与计算的分离](/ch1/#sec_introduction_storage_compute)
    - [云时代的运维](/ch1/#sec_introduction_operations)
  - [分布式与单节点系统](/ch1/#sec_introduction_distributed)
    - [分布式系统的问题](/ch1/#sec_introduction_dist_sys_problems)
    - [微服务与无服务器](/ch1/#sec_introduction_microservices)
    - [云计算与超级计算](/ch1/#id17)
  - [数据系统、法律与社会](/ch1/#sec_introduction_compliance)
  - [总结](/ch1/#summary)
    - [参考文献](/ch1/#参考文献)
- [2 定义非功能性需求](/ch2/)
  - [案例研究：社交网络首页时间线](/ch2/#sec_introduction_twitter)
    - [表示用户、帖子与关注关系](/ch2/#id20)
    - [时间线的物化与更新](/ch2/#sec_introduction_materializing)
  - [描述性能](/ch2/#sec_introduction_percentiles)
    - [延迟与响应时间](/ch2/#id23)
    - [平均值、中位数与分位数](/ch2/#id24)
    - [响应时间指标的应用](/ch2/#sec_introduction_slo_sla)
  - [可靠性与容错](/ch2/#sec_introduction_reliability)
    - [容错](/ch2/#id27)
    - [硬件与软件故障](/ch2/#sec_introduction_hardware_faults)
      - [通过冗余容忍硬件故障](/ch2/#tolerating-hardware-faults-through-redundancy)
      - [软件故障](/ch2/#software-faults)
    - [人类与可靠性](/ch2/#id31)
  - [可伸缩性](/ch2/#sec_introduction_scalability)
    - [描述负载](/ch2/#id33)
    - [共享内存、共享磁盘与无共享架构](/ch2/#sec_introduction_shared_nothing)
    - [可伸缩性原则](/ch2/#id35)
  - [可维护性](/ch2/#sec_introduction_maintainability)
    - [可运维性：让运维更轻松](/ch2/#id37)
    - [简单性：管理复杂度](/ch2/#id38)
    - [可演化性：让变化更容易](/ch2/#sec_introduction_evolvability)
  - [总结](/ch2/#summary)
    - [参考文献](/ch2/#参考文献)
- [3 数据模型与查询语言](/ch3/)
  - [关系模型与文档模型](/ch3/#sec_datamodels_history)
    - [对象关系不匹配](/ch3/#sec_datamodels_document)
      - [对象关系映射（ORM）](/ch3/#object-relational-mapping-orm)
      - [用于一对多关系的文档数据模型](/ch3/#the-document-data-model-for-one-to-many-relationships)
    - [规范化、反规范化与连接](/ch3/#sec_datamodels_normalization)
      - [规范化的权衡](/ch3/#trade-offs-of-normalization)
      - [社交网络案例研究中的反规范化](/ch3/#denormalization-in-the-social-networking-case-study)
    - [多对一与多对多关系](/ch3/#sec_datamodels_many_to_many)
    - [星型与雪花型：分析模式](/ch3/#sec_datamodels_analytics)
    - [何时使用哪种模型](/ch3/#sec_datamodels_document_summary)
      - [文档模型中的模式灵活性](/ch3/#sec_datamodels_schema_flexibility)
      - [读写的数据局部性](/ch3/#sec_datamodels_document_locality)
      - [文档的查询语言](/ch3/#query-languages-for-documents)
      - [文档和关系数据库的融合](/ch3/#convergence-of-document-and-relational-databases)
  - [图数据模型](/ch3/#sec_datamodels_graph)
    - [属性图](/ch3/#id56)
    - [Cypher 查询语言](/ch3/#id57)
    - [SQL 中的图查询](/ch3/#id58)
    - [三元组存储与 SPARQL](/ch3/#id59)
      - [RDF 数据模型](/ch3/#the-rdf-data-model)
      - [SPARQL 查询语言](/ch3/#the-sparql-query-language)
    - [Datalog：递归关系查询](/ch3/#id62)
    - [GraphQL](/ch3/#id63)
  - [事件溯源与 CQRS](/ch3/#sec_datamodels_events)
  - [数据框、矩阵与数组](/ch3/#sec_datamodels_dataframes)
  - [总结](/ch3/#summary)
    - [参考文献](/ch3/#参考文献)
- [4 存储与检索](/ch4/)
  - [OLTP 系统的存储与索引](/ch4/#sec_storage_oltp)
    - [日志结构存储](/ch4/#sec_storage_log_structured)
      - [SSTable 文件格式](/ch4/#the-sstable-file-format)
      - [构建和合并 SSTable](/ch4/#constructing-and-merging-sstables)
      - [布隆过滤器](/ch4/#bloom-filters)
      - [压实策略](/ch4/#sec_storage_lsm_compaction)
    - [B 树](/ch4/#sec_storage_b_trees)
      - [使 B 树可靠](/ch4/#sec_storage_btree_wal)
      - [B 树变体](/ch4/#b-tree-variants)
    - [比较 B 树与 LSM 树](/ch4/#sec_storage_btree_lsm_comparison)
      - [读取性能](/ch4/#read-performance)
      - [顺序与随机写入](/ch4/#sidebar_sequential)
      - [写放大](/ch4/#write-amplification)
      - [磁盘空间使用](/ch4/#disk-space-usage)
    - [多列索引与二级索引](/ch4/#sec_storage_index_multicolumn)
      - [在索引中存储值](/ch4/#sec_storage_index_heap)
    - [全内存存储](/ch4/#sec_storage_inmemory)
  - [分析型数据存储](/ch4/#sec_storage_analytics)
    - [云数据仓库](/ch4/#sec_cloud_data_warehouses)
    - [列式存储](/ch4/#sec_storage_column)
      - [列压缩](/ch4/#sec_storage_column_compression)
      - [列存储中的排序顺序](/ch4/#sort-order-in-column-storage)
      - [写入列式存储](/ch4/#writing-to-column-oriented-storage)
    - [查询执行：编译与向量化](/ch4/#sec_storage_vectorized)
    - [物化视图与多维数据集](/ch4/#sec_storage_materialized_views)
  - [多维索引与全文索引](/ch4/#sec_storage_multidimensional)
    - [全文检索](/ch4/#sec_storage_full_text)
    - [向量嵌入](/ch4/#id92)
  - [总结](/ch4/#summary)
    - [参考文献](/ch4/#参考文献)
- [5 编码与演化](/ch5/)
  - [编码数据的格式](/ch5/#sec_encoding_formats)
    - [特定语言的格式](/ch5/#id96)
    - [JSON、XML 及其二进制变体](/ch5/#sec_encoding_json)
      - [JSON 模式](/ch5/#json-schema)
      - [二进制编码](/ch5/#binary-encoding)
    - [Protocol Buffers](/ch5/#sec_encoding_protobuf)
      - [字段标签与模式演化](/ch5/#field-tags-and-schema-evolution)
    - [Avro](/ch5/#sec_encoding_avro)
      - [写入者模式与读取者模式](/ch5/#the-writers-schema-and-the-readers-schema)
      - [模式演化规则](/ch5/#schema-evolution-rules)
      - [但什么是写入者模式？](/ch5/#but-what-is-the-writers-schema)
      - [动态生成的模式](/ch5/#dynamically-generated-schemas)
    - [模式的优点](/ch5/#sec_encoding_schemas)
  - [数据流的模式](/ch5/#sec_encoding_dataflow)
    - [流经数据库的数据流](/ch5/#sec_encoding_dataflow_db)
      - [不同时间写入的不同值](/ch5/#different-values-written-at-different-times)
      - [归档存储](/ch5/#archival-storage)
    - [流经服务的数据流：REST 与 RPC](/ch5/#sec_encoding_dataflow_rpc)
      - [Web 服务](/ch5/#sec_web_services)
      - [远程过程调用（RPC）的问题](/ch5/#sec_problems_with_rpc)
      - [负载均衡器、服务发现和服务网格](/ch5/#sec_encoding_service_discovery)
      - [RPC 的数据编码与演化](/ch5/#data-encoding-and-evolution-for-rpc)
    - [持久化执行与工作流](/ch5/#sec_encoding_dataflow_workflows)
      - [持久化执行](/ch5/#durable-execution)
    - [事件驱动的架构](/ch5/#sec_encoding_dataflow_msg)
      - [消息代理](/ch5/#message-brokers)
      - [分布式 actor 框架](/ch5/#distributed-actor-frameworks)
  - [总结](/ch5/#summary)
    - [参考文献](/ch5/#参考文献)
- [II 分布式数据](/part-ii/)
  - [伸缩至更高的负载](/part-ii/#伸缩至更高的负载)
    - [无共享架构](/part-ii/#无共享架构)
    - [复制 vs 分区](/part-ii/#复制-vs-分区)
  - [6. 复制](/part-ii/#6-复制)
  - [7. 分片](/part-ii/#7-分片)
  - [8. 事务](/part-ii/#8-事务)
  - [9. 分布式系统的麻烦](/part-ii/#9-分布式系统的麻烦)
  - [10. 一致性与共识](/part-ii/#10-一致性与共识)
    - [参考](/part-ii/#参考)
- [6 复制](/ch6/)
  - [单主复制](/ch6/#sec_replication_leader)
    - [同步复制与异步复制](/ch6/#sec_replication_sync_async)
    - [设置新的副本](/ch6/#sec_replication_new_replica)
    - [处理节点故障](/ch6/#sec_replication_failover)
      - [追随者失效：追赶恢复](/ch6/#follower-failure-catch-up-recovery)
      - [领导者失效：故障切换](/ch6/#leader-failure-failover)
    - [复制日志的实现](/ch6/#sec_replication_implementation)
      - [基于语句的复制](/ch6/#statement-based-replication)
      - [预写日志（WAL）传输](/ch6/#write-ahead-log-wal-shipping)
      - [逻辑（基于行）日志复制](/ch6/#logical-row-based-log-replication)
  - [复制延迟的问题](/ch6/#sec_replication_lag)
    - [读己之写](/ch6/#sec_replication_ryw)
    - [单调读](/ch6/#sec_replication_monotonic_reads)
    - [一致前缀读](/ch6/#sec_replication_consistent_prefix)
    - [复制延迟的解决方案](/ch6/#id131)
  - [多主复制](/ch6/#sec_replication_multi_leader)
    - [跨地域运行](/ch6/#sec_replication_multi_dc)
      - [多主复制拓扑](/ch6/#sec_replication_topologies)
      - [不同拓扑的问题](/ch6/#problems-with-different-topologies)
    - [同步引擎与本地优先软件](/ch6/#sec_replication_offline_clients)
      - [实时协作、离线优先和本地优先应用](/ch6/#real-time-collaboration-offline-first-and-local-first-apps)
      - [同步引擎的利弊](/ch6/#pros-and-cons-of-sync-engines)
    - [处理写入冲突](/ch6/#sec_replication_write_conflicts)
      - [冲突避免](/ch6/#conflict-avoidance)
      - [最后写入者胜（丢弃并发写入）](/ch6/#sec_replication_lww)
      - [手动冲突解决](/ch6/#manual-conflict-resolution)
      - [自动冲突解决](/ch6/#automatic-conflict-resolution)
    - [CRDT 与操作变换](/ch6/#sec_replication_crdts)
      - [什么是冲突？](/ch6/#what-is-a-conflict)
  - [无主复制](/ch6/#sec_replication_leaderless)
    - [当节点故障时写入数据库](/ch6/#id287)
      - [追赶错过的写入](/ch6/#sec_replication_read_repair)
      - [读写仲裁](/ch6/#sec_replication_quorum_condition)
    - [仲裁一致性的局限](/ch6/#sec_replication_quorum_limitations)
      - [监控陈旧性](/ch6/#monitoring-staleness)
    - [单主与无主复制的性能](/ch6/#sec_replication_leaderless_perf)
      - [多地区操作](/ch6/#multi-region-operation)
    - [检测并发写入](/ch6/#sec_replication_concurrent)
      - [“先发生”关系与并发](/ch6/#sec_replication_happens_before)
      - [捕获先发生关系](/ch6/#capturing-the-happens-before-relationship)
      - [版本向量](/ch6/#version-vectors)
  - [总结](/ch6/#summary)
    - [参考文献](/ch6/#参考文献)
- [7 分片](/ch7/)
  - [分片的利与弊](/ch7/#sec_sharding_reasons)
    - [面向多租户的分片](/ch7/#sec_sharding_multitenancy)
  - [键值数据的分片](/ch7/#sec_sharding_key_value)
    - [按键的范围分片](/ch7/#sec_sharding_key_range)
      - [再平衡键范围分片数据](/ch7/#rebalancing-key-range-sharded-data)
    - [按键的哈希分片](/ch7/#sec_sharding_hash)
      - [哈希取模节点数](/ch7/#hash-modulo-number-of-nodes)
      - [固定数量的分片](/ch7/#fixed-number-of-shards)
      - [按哈希范围分片](/ch7/#sharding-by-hash-range)
      - [一致性哈希](/ch7/#sec_sharding_consistent_hashing)
    - [倾斜的工作负载与缓解热点](/ch7/#sec_sharding_skew)
    - [运维：自动/手动再平衡](/ch7/#sec_sharding_operations)
  - [请求路由](/ch7/#sec_sharding_routing)
  - [分片与二级索引](/ch7/#sec_sharding_secondary_indexes)
    - [本地二级索引](/ch7/#id166)
    - [全局二级索引](/ch7/#id167)
  - [总结](/ch7/#summary)
    - [参考文献](/ch7/#参考文献)
- [8 事务](/ch8/)
  - [事务到底是什么？](/ch8/#sec_transactions_overview)
    - [ACID 的含义](/ch8/#sec_transactions_acid)
      - [原子性](/ch8/#sec_transactions_acid_atomicity)
      - [一致性](/ch8/#sec_transactions_acid_consistency)
      - [隔离性](/ch8/#sec_transactions_acid_isolation)
      - [持久性](/ch8/#durability)
    - [单对象与多对象操作](/ch8/#sec_transactions_multi_object)
      - [单对象写入](/ch8/#sec_transactions_single_object)
      - [多对象事务的需求](/ch8/#sec_transactions_need)
      - [处理错误和中止](/ch8/#handling-errors-and-aborts)
  - [弱隔离级别](/ch8/#sec_transactions_isolation_levels)
    - [读已提交](/ch8/#sec_transactions_read_committed)
      - [没有脏读](/ch8/#no-dirty-reads)
      - [没有脏写](/ch8/#sec_transactions_dirty_write)
      - [实现读已提交](/ch8/#sec_transactions_read_committed_impl)
    - [快照隔离与可重复读](/ch8/#sec_transactions_snapshot_isolation)
      - [多版本并发控制（MVCC）](/ch8/#sec_transactions_snapshot_impl)
      - [观察一致快照的可见性规则](/ch8/#sec_transactions_mvcc_visibility)
      - [索引与快照隔离](/ch8/#indexes-and-snapshot-isolation)
      - [快照隔离、可重复读和命名混淆](/ch8/#snapshot-isolation-repeatable-read-and-naming-confusion)
    - [防止丢失更新](/ch8/#sec_transactions_lost_update)
      - [原子写操作](/ch8/#atomic-write-operations)
      - [显式锁定](/ch8/#explicit-locking)
      - [自动检测丢失更新](/ch8/#automatically-detecting-lost-updates)
      - [条件写入（比较并设置）](/ch8/#sec_transactions_compare_and_set)
      - [冲突解决与复制](/ch8/#conflict-resolution-and-replication)
    - [写偏差与幻读](/ch8/#sec_transactions_write_skew)
      - [写偏差的特征](/ch8/#characterizing-write-skew)
      - [写偏差的更多例子](/ch8/#more-examples-of-write-skew)
      - [导致写偏差的幻读](/ch8/#sec_transactions_phantom)
      - [物化冲突](/ch8/#materializing-conflicts)
  - [可串行化](/ch8/#sec_transactions_serializability)
    - [实际串行执行](/ch8/#sec_transactions_serial)
      - [将事务封装在存储过程中](/ch8/#encapsulating-transactions-in-stored-procedures)
      - [存储过程的利弊](/ch8/#sec_transactions_stored_proc_tradeoffs)
      - [分片](/ch8/#sharding)
      - [串行执行总结](/ch8/#summary-of-serial-execution)
    - [两阶段锁定（2PL）](/ch8/#sec_transactions_2pl)
      - [两阶段锁定的实现](/ch8/#implementation-of-two-phase-locking)
      - [两阶段锁定的性能](/ch8/#performance-of-two-phase-locking)
      - [谓词锁](/ch8/#predicate-locks)
      - [索引范围锁](/ch8/#sec_transactions_2pl_range)
    - [可串行化快照隔离（SSI）](/ch8/#sec_transactions_ssi)
      - [悲观并发控制与乐观并发控制](/ch8/#pessimistic-versus-optimistic-concurrency-control)
      - [基于过时前提的决策](/ch8/#decisions-based-on-an-outdated-premise)
      - [检测陈旧的 MVCC 读取](/ch8/#detecting-stale-mvcc-reads)
      - [检测影响先前读取的写入](/ch8/#sec_detecting_writes_affect_reads)
      - [可串行化快照隔离的性能](/ch8/#performance-of-serializable-snapshot-isolation)
  - [分布式事务](/ch8/#sec_transactions_distributed)
    - [两阶段提交（2PC）](/ch8/#sec_transactions_2pc)
      - [系统承诺](/ch8/#a-system-of-promises)
      - [协调者失效](/ch8/#coordinator-failure)
      - [三阶段提交](/ch8/#three-phase-commit)
    - [跨不同系统的分布式事务](/ch8/#sec_transactions_xa)
      - [恰好一次消息处理](/ch8/#sec_transactions_exactly_once)
      - [XA 事务](/ch8/#xa-transactions)
      - [存疑时持有锁](/ch8/#holding-locks-while-in-doubt)
      - [从协调者失效中恢复](/ch8/#recovering-from-coordinator-failure)
      - [XA 事务的问题](/ch8/#problems-with-xa-transactions)
    - [数据库内部的分布式事务](/ch8/#sec_transactions_internal)
      - [再谈恰好一次消息处理](/ch8/#exactly-once-message-processing-revisited)
  - [总结](/ch8/#summary)
    - [参考文献](/ch8/#references)
- [9 分布式系统的麻烦](/ch9/)
  - [故障与部分失效](/ch9/#sec_distributed_partial_failure)
  - [不可靠的网络](/ch9/#sec_distributed_networks)
    - [TCP 的局限性](/ch9/#sec_distributed_tcp)
    - [实践中的网络故障](/ch9/#sec_distributed_network_faults)
    - [故障检测](/ch9/#id307)
    - [超时和无界延迟](/ch9/#sec_distributed_queueing)
      - [网络拥塞与排队](/ch9/#network-congestion-and-queueing)
    - [同步网络与异步网络](/ch9/#sec_distributed_sync_networks)
      - [我们不能简单地让网络延迟可预测吗？](/ch9/#can-we-not-simply-make-network-delays-predictable)
  - [不可靠的时钟](/ch9/#sec_distributed_clocks)
    - [单调时钟与日历时钟](/ch9/#sec_distributed_monotonic_timeofday)
      - [日历时钟](/ch9/#time-of-day-clocks)
      - [单调时钟](/ch9/#monotonic-clocks)
    - [时钟同步和准确性](/ch9/#sec_distributed_clock_accuracy)
    - [对同步时钟的依赖](/ch9/#sec_distributed_clocks_relying)
      - [用于事件排序的时间戳](/ch9/#sec_distributed_lww)
      - [带置信区间的时钟读数](/ch9/#clock-readings-with-a-confidence-interval)
      - [用于全局快照的同步时钟](/ch9/#sec_distributed_spanner)
    - [进程暂停](/ch9/#sec_distributed_clocks_pauses)
      - [响应时间保证](/ch9/#sec_distributed_clocks_realtime)
      - [限制垃圾回收的影响](/ch9/#sec_distributed_gc_impact)
  - [知识、真相和谎言](/ch9/#sec_distributed_truth)
    - [多数派原则](/ch9/#sec_distributed_majority)
    - [分布式锁和租约](/ch9/#sec_distributed_lock_fencing)
      - [用栅栏机制隔离僵尸与延迟请求](/ch9/#sec_distributed_fencing_tokens)
      - [多副本隔离](/ch9/#fencing-with-multiple-replicas)
    - [拜占庭故障](/ch9/#sec_distributed_byzantine)
      - [弱形式的谎言](/ch9/#weak-forms-of-lying)
    - [系统模型与现实](/ch9/#sec_distributed_system_model)
      - [定义算法的正确性](/ch9/#defining-the-correctness-of-an-algorithm)
      - [安全性与活性](/ch9/#sec_distributed_safety_liveness)
      - [将系统模型映射到现实世界](/ch9/#mapping-system-models-to-the-real-world)
    - [形式化方法和随机测试](/ch9/#sec_distributed_formal)
      - [模型检查与规范语言](/ch9/#model-checking-and-specification-languages)
      - [故障注入](/ch9/#sec_fault_injection)
      - [确定性模拟测试](/ch9/#deterministic-simulation-testing)
  - [总结](/ch9/#summary)
    - [参考文献](/ch9/#参考文献)
- [10 一致性与共识](/ch10/)
  - [线性一致性](/ch10/#sec_consistency_linearizability)
    - [什么使系统具有线性一致性？](/ch10/#sec_consistency_lin_definition)
    - [依赖线性一致性](/ch10/#sec_consistency_linearizability_usage)
      - [锁定与领导者选举](/ch10/#locking-and-leader-election)
      - [约束与唯一性保证](/ch10/#sec_consistency_uniqueness)
      - [跨通道时序依赖](/ch10/#cross-channel-timing-dependencies)
    - [实现线性一致性系统](/ch10/#sec_consistency_implementing_linearizable)
      - [线性一致性与仲裁](/ch10/#sec_consistency_quorum_linearizable)
    - [线性一致性的代价](/ch10/#sec_linearizability_cost)
      - [CAP 定理](/ch10/#the-cap-theorem)
      - [线性一致性与网络延迟](/ch10/#linearizability-and-network-delays)
  - [ID 生成器和逻辑时钟](/ch10/#sec_consistency_logical)
    - [逻辑时钟](/ch10/#sec_consistency_timestamps)
      - [Lamport 时间戳](/ch10/#lamport-timestamps)
      - [混合逻辑时钟](/ch10/#hybrid-logical-clocks)
      - [Lamport/混合逻辑时钟 vs. 向量时钟](/ch10/#lamporthybrid-logical-clocks-vs-vector-clocks)
    - [线性一致的 ID 生成器](/ch10/#sec_consistency_linearizable_id)
      - [实现线性一致的 ID 生成器](/ch10/#implementing-a-linearizable-id-generator)
      - [使用逻辑时钟强制约束](/ch10/#enforcing-constraints-using-logical-clocks)
  - [共识](/ch10/#sec_consistency_consensus)
    - [共识的多面性](/ch10/#sec_consistency_faces)
      - [单值共识](/ch10/#single-value-consensus)
      - [比较并设置作为共识](/ch10/#compare-and-set-as-consensus)
      - [共享日志作为共识](/ch10/#sec_consistency_shared_logs)
      - [获取并增加作为共识](/ch10/#fetch-and-add-as-consensus)
      - [原子提交作为共识](/ch10/#atomic-commitment-as-consensus)
    - [共识的实践](/ch10/#sec_consistency_total_order)
      - [使用共享日志](/ch10/#sec_consistency_smr)
      - [从单主复制到共识](/ch10/#from-single-leader-replication-to-consensus)
      - [共识的微妙之处](/ch10/#subtleties-of-consensus)
      - [共识的利弊](/ch10/#pros-and-cons-of-consensus)
    - [协调服务](/ch10/#sec_consistency_coordination)
      - [将工作分配给节点](/ch10/#allocating-work-to-nodes)
      - [服务发现](/ch10/#service-discovery)
  - [总结](/ch10/#summary)
    - [参考文献](/ch10/#参考文献)
- [III 派生数据](/part-iii/)
  - [记录系统和派生数据系统](/part-iii/#记录系统和派生数据系统)
  - [章节概述](/part-iii/#章节概述)
  - [索引](/part-iii/#索引)
  - [11. 批处理](/part-iii/#11-批处理)
  - [12. 流处理](/part-iii/#12-流处理)
  - [13. 流式系统的哲学](/part-iii/#13-流式系统的哲学)
  - [14. 做正确的事情](/part-iii/#14-做正确的事情)
- [11 批处理](/ch11/)
  - [使用 Unix 工具的批处理](/ch11/#sec_batch_unix)
    - [简单日志分析](/ch11/#sec_batch_log_analysis)
    - [命令链与自定义程序](/ch11/#sec_batch_custom_program)
    - [排序与内存聚合](/ch11/#id275)
  - [分布式系统中的批处理](/ch11/#sec_batch_distributed)
    - [分布式文件系统](/ch11/#sec_batch_dfs)
    - [对象存储](/ch11/#id277)
    - [分布式作业编排](/ch11/#id278)
      - [资源分配](/ch11/#id279)
      - [工作流调度](/ch11/#sec_batch_workflows)
      - [故障处理](/ch11/#id281)
  - [批处理模型](/ch11/#id431)
    - [MapReduce](/ch11/#sec_batch_mapreduce)
    - [数据流引擎](/ch11/#sec_batch_dataflow)
    - [混洗数据](/ch11/#sec_shuffle)
      - [JOIN 与 GROUP BY](/ch11/#sec_batch_join)
    - [查询语言](/ch11/#sec_batch_query_lanauges)
    - [数据框](/ch11/#id287)
  - [批处理用例](/ch11/#sec_batch_output)
    - [提取—转换—加载（ETL）](/ch11/#sec_batch_etl_usage)
    - [分析](/ch11/#sec_batch_olap)
    - [机器学习](/ch11/#id290)
    - [对外提供衍生数据](/ch11/#sec_batch_serving_derived)
  - [本章小结](/ch11/#id292)
    - [脚注](/ch11/#脚注)
    - [参考文献](/ch11/#references)
- [12 流处理](/ch12/)
  - [传递事件流](/ch12/#sec_stream_transmit)
    - [消息传递系统](/ch12/#sec_stream_messaging)
      - [直接从生产者传递给消费者](/ch12/#id296)
      - [消息代理](/ch12/#id433)
      - [消息代理与数据库的对比](/ch12/#id297)
      - [多个消费者](/ch12/#id298)
      - [确认应答与重新传递](/ch12/#sec_stream_reordering)
    - [基于日志的消息代理](/ch12/#sec_stream_log)
      - [使用日志进行消息存储](/ch12/#id300)
      - [日志与传统消息传递的比较](/ch12/#sec_stream_logs_vs_messaging)
      - [消费者偏移量](/ch12/#sec_stream_log_offsets)
      - [磁盘空间使用](/ch12/#sec_stream_disk_usage)
      - [当消费者跟不上生产者时](/ch12/#id459)
      - [重播旧消息](/ch12/#sec_stream_replay)
  - [数据库与流](/ch12/#sec_stream_databases)
    - [保持系统同步](/ch12/#sec_stream_sync)
    - [变更数据捕获](/ch12/#sec_stream_cdc)
      - [变更数据捕获的实现](/ch12/#id307)
      - [初始快照](/ch12/#sec_stream_cdc_snapshot)
      - [日志压实](/ch12/#sec_stream_log_compaction)
      - [变更流的 API 支持](/ch12/#sec_stream_change_api)
      - [变更数据捕获与事件溯源](/ch12/#sec_stream_event_sourcing)
    - [状态、流和不变性](/ch12/#sec_stream_immutability)
      - [不可变事件的优点](/ch12/#sec_stream_immutability_pros)
      - [从同一事件日志中派生多个视图](/ch12/#sec_stream_deriving_views)
      - [并发控制](/ch12/#sec_stream_concurrency)
      - [不变性的局限](/ch12/#sec_stream_immutability_limitations)
  - [流处理](/ch12/#sec_stream_processing)
    - [流处理的应用](/ch12/#sec_stream_uses)
      - [复合事件处理](/ch12/#id317)
      - [流分析](/ch12/#id318)
      - [维护物化视图](/ch12/#sec_stream_mat_view)
      - [在流上搜索](/ch12/#id320)
      - [事件驱动架构与 RPC](/ch12/#sec_stream_actors_drpc)
    - [时间推理](/ch12/#sec_stream_time)
      - [事件时间与处理时间](/ch12/#id322)
      - [处理滞留事件](/ch12/#id323)
      - [你用的是谁的时钟？](/ch12/#id438)
      - [窗口的类型](/ch12/#id324)
    - [流连接](/ch12/#sec_stream_joins)
      - [流流连接（窗口连接）](/ch12/#id440)
      - [流表连接（流扩充）](/ch12/#sec_stream_table_joins)
      - [表表连接（维护物化视图）](/ch12/#id326)
      - [连接的时间依赖性](/ch12/#sec_stream_join_time)
    - [容错](/ch12/#sec_stream_fault_tolerance)
      - [微批处理与检查点](/ch12/#id329)
      - [再谈原子提交](/ch12/#sec_stream_atomic_commit)
      - [幂等性](/ch12/#sec_stream_idempotence)
      - [失败后重建状态](/ch12/#sec_stream_state_fault_tolerance)
  - [本章小结](/ch12/#id332)
    - [脚注](/ch12/#脚注)
    - [参考文献](/ch12/#references)
- [13 流式系统的哲学](/ch13/)
  - [数据集成](/ch13/#sec_future_integration)
    - [通过衍生数据组合专用工具](/ch13/#id442)
      - [理解数据流](/ch13/#id443)
      - [衍生数据与分布式事务](/ch13/#sec_future_derived_vs_transactions)
      - [全序的局限](/ch13/#id335)
      - [排序事件以捕获因果关系](/ch13/#sec_future_capture_causality)
    - [批处理与流处理](/ch13/#sec_future_batch_streaming)
      - [维护衍生状态](/ch13/#id446)
      - [为应用演化而重新处理数据](/ch13/#sec_future_reprocessing)
      - [统一批处理与流处理](/ch13/#id338)
  - [分拆数据库](/ch13/#sec_future_unbundling)
    - [组合使用数据存储技术](/ch13/#id447)
      - [创建索引](/ch13/#id340)
      - [一切的元数据库](/ch13/#id341)
      - [让分拆行得通](/ch13/#sec_future_unbundling_favor)
      - [分拆式系统与集成式系统](/ch13/#id448)
    - [围绕数据流设计应用](/ch13/#sec_future_dataflow)
      - [应用代码作为衍生函数](/ch13/#sec_future_dataflow_derivation)
      - [分离应用代码与状态](/ch13/#id344)
      - [数据流：状态变更与应用代码的相互作用](/ch13/#id450)
      - [流处理器与服务](/ch13/#id345)
    - [观察衍生状态](/ch13/#sec_future_observing)
      - [物化视图与缓存](/ch13/#id451)
      - [有状态、可离线的客户端](/ch13/#id347)
      - [将状态变更推送给客户端](/ch13/#id348)
      - [端到端事件流](/ch13/#id349)
      - [读也是事件](/ch13/#sec_future_read_events)
      - [多分片数据处理](/ch13/#sec_future_unbundled_multi_shard)
  - [追求正确性](/ch13/#sec_future_correctness)
    - [数据库的端到端原则](/ch13/#sec_future_end_to_end)
      - [恰好一次执行操作](/ch13/#id353)
      - [抑制重复](/ch13/#id354)
        - [例 13-1. 从一个账户向另一个账户非幂等地转账](/ch13/#例-13-1-从一个账户向另一个账户非幂等地转账)
      - [唯一标识请求](/ch13/#id355)
        - [例 13-2. 使用唯一 ID 抑制重复请求](/ch13/#例-13-2-使用唯一-id-抑制重复请求)
      - [端到端原则](/ch13/#sec_future_e2e_argument)
      - [在数据系统中应用端到端思维](/ch13/#id357)
    - [强制约束](/ch13/#sec_future_constraints)
      - [唯一性约束需要共识](/ch13/#id452)
      - [基于日志的消息传递中的唯一性](/ch13/#sec_future_uniqueness_log)
      - [多分片请求处理](/ch13/#id360)
    - [及时性与完整性](/ch13/#sec_future_integrity)
      - [数据流系统的正确性](/ch13/#id453)
      - [宽松解释约束](/ch13/#id362)
      - [避免协调的数据系统](/ch13/#id454)
    - [信任但验证](/ch13/#sec_future_verification)
      - [面对软件缺陷时维护完整性](/ch13/#id455)
      - [不要盲信承诺](/ch13/#id364)
      - [为可审计性而设计](/ch13/#id365)
      - [再谈端到端原则](/ch13/#id456)
      - [可审计数据系统的工具](/ch13/#id366)
  - [本章小结](/ch13/#id367)
    - [脚注](/ch13/#脚注)
    - [参考文献](/ch13/#references)
- [14 做正确的事情](/ch14/)
  - [预测分析](/ch14/#id369)
    - [偏见与歧视](/ch14/#id370)
    - [责任与问责](/ch14/#id371)
    - [反馈循环](/ch14/#id372)
  - [隐私与追踪](/ch14/#id373)
    - [监视](/ch14/#id374)
    - [同意与选择自由](/ch14/#id375)
    - [隐私与数据使用](/ch14/#id457)
    - [数据资产与权力](/ch14/#id376)
    - [回顾工业革命](/ch14/#id377)
    - [立法与自律](/ch14/#sec_future_legislation)
  - [总结](/ch14/#id594)
    - [脚注](/ch14/#脚注)
    - [参考文献](/ch14/#references)
- [术语表](/glossary/)
  - [异步（asynchronous）](/glossary/#异步asynchronous)
  - [原子（atomic）](/glossary/#原子atomic)
  - [背压（backpressure）](/glossary/#背压backpressure)
  - [批处理（batch process）](/glossary/#批处理batch-process)
  - [有界（bounded）](/glossary/#有界bounded)
  - [拜占庭故障（Byzantine fault）](/glossary/#拜占庭故障byzantine-fault)
  - [缓存（cache）](/glossary/#缓存cache)
  - [CAP 定理（CAP theorem）](/glossary/#cap-定理cap-theorem)
  - [因果关系（causality）](/glossary/#因果关系causality)
  - [共识（consensus）](/glossary/#共识consensus)
  - [数据仓库（data warehouse）](/glossary/#数据仓库data-warehouse)
  - [声明式（declarative）](/glossary/#声明式declarative)
  - [反规范化（denormalize）](/glossary/#反规范化denormalize)
  - [派生数据（derived data）](/glossary/#派生数据derived-data)
  - [确定性（deterministic）](/glossary/#确定性deterministic)
  - [分布式（distributed）](/glossary/#分布式distributed)
  - [持久性（durable）](/glossary/#持久性durable)
  - [ETL](/glossary/#etl)
  - [故障切换（failover）](/glossary/#故障切换failover)
  - [容错（fault-tolerant）](/glossary/#容错fault-tolerant)
  - [流量控制（flow control）](/glossary/#流量控制flow-control)
  - [追随者（follower）](/glossary/#追随者follower)
  - [全文检索（full-text search）](/glossary/#全文检索full-text-search)
  - [图（graph）](/glossary/#图graph)
  - [哈希（hash）](/glossary/#哈希hash)
  - [幂等（idempotent）](/glossary/#幂等idempotent)
  - [索引（index）](/glossary/#索引index)
  - [隔离性（isolation）](/glossary/#隔离性isolation)
  - [连接（join）](/glossary/#连接join)
  - [领导者（leader）](/glossary/#领导者leader)
  - [线性一致（linearizable）](/glossary/#线性一致linearizable)
  - [局部性（locality）](/glossary/#局部性locality)
  - [锁（lock）](/glossary/#锁lock)
  - [日志（log）](/glossary/#日志log)
  - [物化（materialize）](/glossary/#物化materialize)
  - [节点（node）](/glossary/#节点node)
  - [规范化（normalized）](/glossary/#规范化normalized)
  - [OLAP](/glossary/#olap)
  - [OLTP](/glossary/#oltp)
  - [分片（sharding）](/glossary/#分片sharding)
  - [百分位（percentile）](/glossary/#百分位percentile)
  - [主键（primary key）](/glossary/#主键primary-key)
  - [法定票数（quorum）](/glossary/#法定票数quorum)
  - [再平衡（rebalance）](/glossary/#再平衡rebalance)
  - [复制（replication）](/glossary/#复制replication)
  - [模式（schema）](/glossary/#模式schema)
  - [二级索引（secondary index）](/glossary/#二级索引secondary-index)
  - [可串行化（serializable）](/glossary/#可串行化serializable)
  - [无共享（shared-nothing）](/glossary/#无共享shared-nothing)
  - [偏斜（skew）](/glossary/#偏斜skew)
  - [脑裂（split brain）](/glossary/#脑裂split-brain)
  - [存储过程（stored procedure）](/glossary/#存储过程stored-procedure)
  - [流处理（stream process）](/glossary/#流处理stream-process)
  - [同步（synchronous）](/glossary/#同步synchronous)
  - [记录系统（system of record）](/glossary/#记录系统system-of-record)
  - [超时（timeout）](/glossary/#超时timeout)
  - [全序（total order）](/glossary/#全序total-order)
  - [事务（transaction）](/glossary/#事务transaction)
  - [两阶段提交（two-phase commit, 2PC）](/glossary/#两阶段提交two-phase-commit-2pc)
  - [两阶段锁（two-phase locking, 2PL）](/glossary/#两阶段锁two-phase-locking-2pl)
  - [无界（unbounded）](/glossary/#无界unbounded)
- [索引](/indexes/)
  - [符号](/indexes/#符号)
  - [A](/indexes/#a)
  - [B](/indexes/#b)
  - [C](/indexes/#c)
  - [D](/indexes/#d)
  - [E](/indexes/#e)
  - [F](/indexes/#f)
  - [G](/indexes/#g)
  - [H](/indexes/#h)
  - [I](/indexes/#i)
  - [J](/indexes/#j)
  - [K](/indexes/#k)
  - [L](/indexes/#l)
  - [M](/indexes/#m)
  - [N](/indexes/#n)
  - [O](/indexes/#o)
  - [P](/indexes/#p)
  - [Q](/indexes/#q)
  - [R](/indexes/#r)
  - [S](/indexes/#s)
  - [T](/indexes/#t)
  - [U](/indexes/#u)
  - [V](/indexes/#v)
  - [W](/indexes/#w)
  - [X](/indexes/#x)
  - [Y](/indexes/#y)
  - [Z](/indexes/#z)
- [后记](/colophon/)
  - [关于作者](/colophon/#关于作者)
  - [关于译者](/colophon/#关于译者)
  - [后记](/colophon/#后记)
- [贡献者](/contrib/)
  - [译者](/contrib/#译者)
  - [校订与维护](/contrib/#校订与维护)
  - [繁体中文版本](/contrib/#繁体中文版本)
  - [贡献列表](/contrib/#贡献列表)

## 插图目录 {#list-of-figures}

全书编号插图使用稳定图号和锚点；正文中的“图 N-N”引用会同时链接到这里列出的目标。

- [图 1-1](/ch1/#fig_dwh_etl) — 将数据通过 ETL 导入数据仓库的简化示意图。
- [图 1-2](/ch1/#fig_cloud_spectrum) — 软件类型及其运维方式的连续谱。
- [图 2-1](/ch2/#fig_twitter_relational) — 一个允许用户相互关注的社交网络的简单关系模式。
- [图 2-2](/ch2/#fig_twitter_timelines) — 扇出——把新帖子投递给发帖用户的每一位关注者。
- [图 2-3](/ch2/#fig_throughput) — 当服务的吞吐量接近其处理能力上限时，排队会使响应时间急剧增加。
- [图 2-4](/ch2/#fig_response_time) — 响应时间、服务时间、网络延迟和排队延迟。
- [图 2-5](/ch2/#fig_lognormal) — 用 100 次服务请求的响应时间样本说明平均值和分位数。
- [图 2-6](/ch2/#fig_tail_amplification) — 当一次请求需要多个后端调用时，只需一个慢调用，就会拖慢整个最终用户请求。
- [图 3-1](/ch3/#fig_obama_relational) — 使用关系模式表示 LinkedIn 个人资料。
- [图 3-2](/ch3/#fig_json_tree) — 一对多关系形成树状结构。
- [图 3-3](/ch3/#fig_datamodels_m2m_rel) — 关系模型中的多对多关系。
- [图 3-4](/ch3/#fig_datamodels_many_to_many) — 文档模型中的多对多关系；每个虚线框内的数据可以组成一份文档。
- [图 3-5](/ch3/#fig_dwh_schema) — 用于数据仓库的星型模式示例。
- [图 3-6](/ch3/#fig_datamodels_graph) — 图结构数据示例（框表示顶点，箭头表示边）。
- [图 3-7](/ch3/#fig_datalog_naive) — 使用示例 3\-12 中的 Datalog 规则确定爱达荷州在北美。
- [图 3-8](/ch3/#fig_event_sourcing) — 以不可变事件日志作为权威数据源，并从中派生物化视图。
- [图 3-9](/ch3/#fig_dataframe_to_matrix) — 将电影评分的关系数据库转换为矩阵表示。
- [图 4-1](/ch4/#fig_storage_csv_hash_index) — 以类似 CSV 的格式存储键值对日志，并使用内存哈希映射建立索引。
- [图 4-2](/ch4/#fig_storage_sstable_index) — 带有稀疏索引的 SSTable，查询可以直接跳到正确的数据块。
- [图 4-3](/ch4/#fig_storage_sstable_merging) — 合并多个 SSTable 段，仅保留每个键的最新值。
- [图 4-4](/ch4/#fig_storage_bloom) — 布隆过滤器以概率方式快速判断某个键是否存在于某个 SSTable 中。
- [图 4-5](/ch4/#fig_storage_b_tree) — 使用 B 树索引查找键 251。先从根页沿引用进入键 200–300 所在的页，再进入键 250–270 所在的页。
- [图 4-6](/ch4/#fig_storage_b_tree_split) — 在边界键 337 处拆分页，使 B 树增长；父页也随之更新，以引用两个子页。
- [图 4-7](/ch4/#fig_column_store) — 按列而不是按行存储关系数据。
- [图 4-8](/ch4/#fig_bitmap_index) — 对单列进行压缩并建立位图索引的存储方式。
- [图 4-9](/ch4/#fig_bitmap_and) — 两张位图的按位与运算非常适合向量化处理。
- [图 4-10](/ch4/#fig_data_cube) — 多维数据集的两个维度，通过求和聚合数据。
- [图 4-11](/ch4/#fig_vector_hnsw) — 在 HNSW 索引中查找最接近给定查询向量的数据库条目。
- [图 5-1](/ch5/#fig_encoding_preserve_field) — 旧版应用程序更新先前由新版应用程序写入的数据时，若处理不慎，可能丢失数据。
- [图 5-2](/ch5/#fig_encoding_messagepack) — 示例 5\-2 中的记录使用 MessagePack 编码后的结果。
- [图 5-3](/ch5/#fig_encoding_protobuf) — 使用 Protocol Buffers 编码的示例记录。
- [图 5-4](/ch5/#fig_encoding_avro) — 使用 Avro 编码的示例记录。
- [图 5-5](/ch5/#fig_encoding_avro_schemas) — Protocol Buffers 的编码与解码可以使用不同版本的模式。Avro 解码时使用两个模式：写入者模式必须与编码时所用模式完全相同，读取者模式则可以是较旧或较新的版本。
- [图 5-6](/ch5/#fig_encoding_avro_resolution) — Avro 读取器协调写入者模式与读取者模式之间的差异。
- [图 5-7](/ch5/#fig_encoding_workflow) — 使用图形化的业务流程模型与标记法（BPMN）表示工作流的示例。
- [图 II-1](/part-ii/#fig_replication_partitioning) — 一个数据库切分为两个分区，每个分区都有两个副本
- [图 6-1](/ch6/#fig_replication_leader_follower) — 单主复制把所有写入都发往指定的领导者，再由领导者将变更流发送给各追随者副本。
- [图 6-2](/ch6/#fig_replication_sync_replication) — 基于领导者的复制，其中一个追随者同步复制，另一个异步复制。
- [图 6-3](/ch6/#fig_replication_read_your_writes) — 用户写入后，又从陈旧副本读取。要防止这种异常，需要写后读一致性。
- [图 6-4](/ch6/#fig_replication_monotonic_reads) — 用户先从较新的副本读取，随后从陈旧副本读取，时间仿佛倒退了。要防止这种异常，需要单调读。
- [图 6-5](/ch6/#fig_replication_consistent_prefix) — 如果某些分片的复制速度慢于其他分片，观察者可能先看到答案，后看到问题。
- [图 6-6](/ch6/#fig_replication_multi_dc) — 跨多个地区的多主复制。
- [图 6-7](/ch6/#fig_replication_topologies) — 多主复制可以采用的三种拓扑示例。
- [图 6-8](/ch6/#fig_replication_causality) — 在多主复制中，写入抵达某些副本的顺序可能有误。
- [图 6-9](/ch6/#fig_replication_write_conflict) — 两个领导者并发更新同一条记录，造成写入冲突。
- [图 6-10](/ch6/#fig_replication_amazon_anomaly) — 亚马逊购物车异常示例：以并集方式合并购物车冲突时，已删除的商品可能重新出现。
- [图 6-11](/ch6/#fig_replication_ot_crdt) — OT 与 CRDT 分别如何合并字符串中的两次并发插入。
- [图 6-12](/ch6/#fig_replication_quorum_node_outage) — 节点停机后的仲裁写、仲裁读和读修复。
- [图 6-13](/ch6/#fig_replication_quorum_overlap) — 如果 w \+ r \> n，读取的 r 个副本中至少有一个必然见过最近一次成功写入。
- [图 6-14](/ch6/#fig_replication_concurrency) — Dynamo 风格数据存储中的并发写入没有明确定义的顺序。
- [图 6-15](/ch6/#fig_replication_causality_single) — 捕获两个客户端并发编辑购物车时的因果依赖。
- [图 6-16](/ch6/#fig_replication_causal_dependencies) — 图 6\-15 中因果依赖关系的图示。
- [图 7-1](/ch7/#fig_sharding_replicas) — 复制与分片结合使用：每个节点对某些分片充当领导者，对另一些分片充当追随者。
- [图 7-2](/ch7/#fig_sharding_encyclopedia) — 印刷版百科全书按键范围分片。
- [图 7-3](/ch7/#fig_sharding_hash_mod_n) — 通过对键进行哈希并取模节点数来将键分配给节点。更改节点数会导致许多键从一个节点移动到另一个节点。
- [图 7-4](/ch7/#fig_sharding_rebalance_fixed) — 向每个节点有多个分片的数据库集群添加新节点。
- [图 7-5](/ch7/#fig_sharding_hash_range) — 为每个分片分配连续的哈希值范围。
- [图 7-6](/ch7/#fig_sharding_cassandra) — Cassandra 和 ScyllaDB 将可能的哈希值范围（这里是 0–1023）拆成边界随机的连续区间，并为每个节点分配多个区间。
- [图 7-7](/ch7/#fig_sharding_routing) — 将请求路由到正确节点的三种不同方式。
- [图 7-8](/ch7/#fig_sharding_zookeeper) — 使用 ZooKeeper 跟踪分片到节点的分配。
- [图 7-9](/ch7/#fig_sharding_local_secondary) — 本地二级索引：每个分片只索引其自己分片内的记录。
- [图 7-10](/ch7/#fig_sharding_global_secondary) — 全局二级索引反映来自所有分片的数据，并且本身按索引值进行分片。
- [图 8-1](/ch8/#fig_transactions_increment) — 两个客户端并发递增计数器之间的竞态条件。
- [图 8-2](/ch8/#fig_transactions_read_uncommitted) — 违反隔离性：一个事务读取另一个事务的未提交写入（“脏读”）。
- [图 8-3](/ch8/#fig_transactions_atomicity) — 原子性确保如果发生错误，该事务的任何先前写入都会被撤消，以避免不一致的状态。
- [图 8-4](/ch8/#fig_transactions_read_committed) — 没有脏读：用户 2 只有在用户 1 的事务提交后才能看到 x 的新值。
- [图 8-5](/ch8/#fig_transactions_dirty_writes) — 发生脏写时，不同事务的冲突写入可能混杂在一起。
- [图 8-6](/ch8/#fig_transactions_item_many_preceders) — 读偏差：Aaliyah 观察到了数据库的不一致状态。
- [图 8-7](/ch8/#fig_transactions_mvcc) — 使用多版本并发控制实现快照隔离。
- [图 8-8](/ch8/#fig_transactions_write_skew) — 写偏差导致应用程序错误的示例。
- [图 8-9](/ch8/#fig_transactions_stored_proc) — 交互式事务与存储过程的差异（采用图 8\-8中的示例事务）。
- [图 8-10](/ch8/#fig_transactions_detect_mvcc) — 检测事务何时从 MVCC 快照读取过时值。
- [图 8-11](/ch8/#fig_transactions_detect_index_range) — 在可串行化快照隔离中，检测一个事务何时修改了另一个事务读过的数据。
- [图 8-12](/ch8/#fig_transactions_non_atomic) — 当事务涉及多个数据库节点时，它可能在某些节点上提交，在其他节点上失败。
- [图 8-13](/ch8/#fig_transactions_two_phase_commit) — 两阶段提交（2PC）的成功执行。
- [图 8-14](/ch8/#fig_transactions_2pc_crash) — 参与者投票“是”之后，协调者崩溃。数据库 1 不知道该提交还是中止。
- [图 9-1](/ch9/#fig_distributed_network) — 发出请求却没有收到响应时，无法分辨究竟是 \(a\) 请求丢失、\(b\) 远程节点宕机，还是 \(c\) 响应丢失。
- [图 9-2](/ch9/#fig_distributed_switch_queueing) — 多台机器向同一个目的地发送网络流量时，交换机队列可能被塞满。图中端口 1、2 和 4 都在尝试向端口 3 发送数据包。
- [图 9-3](/ch9/#fig_distributed_timestamps) — 客户端 B 的写入在因果关系上晚于客户端 A 的写入，但 B 的写入具有更早的时间戳。
- [图 9-4](/ch9/#fig_distributed_lease_pause) — 分布式锁的错误实现：租约已经过期，客户端 1 却认为它依然有效，因而损坏了存储中的文件。
- [图 9-5](/ch9/#fig_distributed_lease_delay) — 原租约持有者发出的消息可能延迟很久，直到另一个节点接管租约后才抵达。
- [图 9-6](/ch9/#fig_distributed_fencing) — 只允许写入按照递增的栅栏令牌顺序执行，从而保证存储访问安全。
- [图 9-7](/ch9/#fig_distributed_fencing_leaderless) — 使用栅栏令牌保护对无主复制数据库的写入。
- [图 10-1](/ch10/#fig_consistency_linearizability_0) — 如果这个数据库满足线性一致性，那么 Alice 的读取应返回 1 而不是 0，或者 Bob 的读取应返回 0 而不是 1。
- [图 10-2](/ch10/#fig_consistency_linearizability_1) — 如果读请求与写请求并发，则可能返回旧值，也可能返回新值。
- [图 10-3](/ch10/#fig_consistency_linearizability_2) — 如果 Alice 和 Bob 拥有完美时钟，线性一致性要求读取返回 x \= 1，因为对 x 的读取开始于 x \= 1 写入完成之后。
- [图 10-4](/ch10/#fig_consistency_linearizability_3) — 对 x 的读取与 x \= 1 的写入并发。由于不知道操作的确切时序，读取可以返回 0 或 1。
- [图 10-5](/ch10/#fig_consistency_transcoder) — 一个不满足线性一致性的系统：Alice 和 Bob 在不同时刻看到上传的图像，因此 Bob 的请求建立在陈旧数据之上。
- [图 10-6](/ch10/#fig_consistency_leaderless) — 当网络延迟变化不定时，仅靠法定人数不足以保证线性一致性。
- [图 10-7](/ch10/#fig_consistency_cap_availability) — 如果网络分区使客户端无法联系足够多的副本，它们就无法处理写入。
- [图 10-8](/ch10/#fig_consistency_id_generator) — 两个不同节点可能生成相互冲突的 ID。
- [图 10-9](/ch10/#fig_consistency_lamport_ts) — Lamport 时间戳给出了与因果关系一致的全序。
- [图 10-10](/ch10/#fig_consistency_permissions) — 一个使用 Lamport 时间戳的权限系统。
- [图 11-1](/ch11/#fig_batch_mapreduce) — 一个包含三个 mapper 和三个 reducer 的 MapReduce 作业。
- [图 11-2](/ch11/#fig_batch_join_example) — 用户活动日志与用户画像数据库的连接。
- [图 11-3](/ch11/#fig_batch_join_reduce) — 基于用户 ID 的排序合并连接。若输入数据集由多个文件分片组成，可并行启动多个 mapper 处理。
- [图 12-1](/ch12/#fig_stream_multi_consumer) — （a）负载均衡：由多个消费者分担一个主题的消费工作；（b）扇出：将每条消息传递给多个消费者。
- [图 12-2](/ch12/#fig_stream_redelivery) — 消费者 2 在处理 m3 时崩溃，因此 m3 稍后被重新传递给消费者 1。
- [图 12-3](/ch12/#fig_stream_kafka_partitions) — 生产者把消息追加到主题分区文件中，消费者则顺序读取这些文件。
- [图 12-4](/ch12/#fig_stream_write_order) — 数据库中的 X 先被设为 A，再被设为 B；写入到达搜索索引的顺序却恰好相反。
- [图 12-5](/ch12/#fig_stream_change_capture) — 按数据写入一个数据库的顺序取得数据，再按相同顺序将变化应用到其他系统。
- [图 12-6](/ch12/#fig_stream_compaction) — 一个键值对日志：键是猫咪视频的 ID（mew、purr、scratch 或 yawn），值是播放次数。日志压实只保留每个键的最新值。
- [图 12-7](/ch12/#fig_stream_integral) — 应用当前状态与事件流之间的关系。
- [图 12-8](/ch12/#fig_stream_processing_time) — 按处理时间划分窗口，会因处理速率的变化而产生人为假象。
- [图 13-1](/ch13/#fig_future_write_read_paths) — 在搜索索引中，写入（文档更新）与读取（查询）相遇。
- [图 13-2](/ch13/#fig_future_multi_shard) — 使用事件日志和流处理器，检查源账户是否有足够余额，并把资金原子地转入目标账户和手续费账户。

## 表格目录 {#list-of-tables}

- [表 1-1](/ch1/#tab_oltp_vs_olap) — 事务型系统与分析型系统的特征比较
- [表 1-2](/ch1/#tab_cloud_native_dbs) — 自托管数据库系统与云原生数据库系统示例
- [表 8-1](/ch8/#ch_transactions_isolation_levels) — 各种隔离级别下可能发生的异常汇总。

## 示例目录 {#list-of-examples}

- [示例 3-1](/ch3/#fig_obama_json) — 将 LinkedIn 个人资料表示为 JSON 文档
- [示例 3-2](/ch3/#fig_datamodels_m2m_json) — 通过 ID 引用组织的简历
- [示例 3-3](/ch3/#fig_graph_sql_schema) — 使用关系模式表示属性图
- [示例 3-4](/ch3/#fig_cypher_create) — 图 3\-6 中的一部分数据，以 Cypher 查询表示
- [示例 3-5](/ch3/#fig_cypher_query) — 查找从美国移居欧洲者的 Cypher 查询
- [示例 3-6](/ch3/#fig_graph_sql_query) — 使用递归公用表表达式，以 SQL 写出与示例 3\-5 相同的查询
- [示例 3-7](/ch3/#fig_graph_n3_triples) — 图 3\-6 中的一部分数据，以 Turtle 三元组表示
- [示例 3-8](/ch3/#fig_graph_n3_shorthand) — 示例 3\-7 中数据的简洁写法
- [示例 3-9](/ch3/#fig_graph_rdf_xml) — 使用 RDF\/XML 语法表示示例 3\-8 中的数据
- [示例 3-10](/ch3/#fig_sparql_query) — 与示例 3\-5 相同的查询，用 SPARQL 表示
- [示例 3-11](/ch3/#fig_datalog_triples) — 图 3\-6 中数据的子集，表示为 Datalog 事实
- [示例 3-12](/ch3/#fig_datalog_query) — 与示例 3\-5 相同的查询，用 Datalog 表示
- [示例 3-13](/ch3/#fig_graphql_query) — 群聊应用的 GraphQL 查询示例
- [示例 3-14](/ch3/#fig_graphql_response) — 对示例 3\-13 中查询的一种可能响应
- [示例 4-1](/ch4/#fig_storage_analytics_query) — 分析人们在一周中的哪一天更倾向于购买新鲜水果或糖果
- [示例 5-1](/ch5/#fig_encoding_json_schema) — 以整数为键、字符串为值的 JSON 模式示例。由于 JSON 模式要求所有键均为字符串，整数键表示为只包含数字的字符串。
- [示例 5-2](/ch5/#fig_encoding_json) — 本章将使用多种二进制格式编码的示例记录
- [示例 5-3](/ch5/#fig_open_api_def) — 使用 YAML 编写的 OpenAPI 服务定义示例
- [示例 5-4](/ch5/#fig_fastapi_def) — 使用 FastAPI 实现示例 5\-3 中定义的服务
- [示例 5-5](/ch5/#fig_temporal_workflow) — 用于图 5\-7 所示支付工作流的 Temporal 工作流定义片段
- [示例 8-1](/ch8/#fig_transactions_select_for_update) — 显式锁定行以防止丢失更新
- [示例 8-2](/ch8/#fig_transactions_meeting_rooms) — 会议室预订系统试图避免重复预订（在快照隔离下并不安全）
