跳转到主要内容

目录

DDIA 第一版完整目录:十二章,涵盖数据系统基础、分布式数据与派生数据。

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

插图目录

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

  1. 图 1-1 — 一个可能的组合使用多个组件的数据系统架构
  2. 图 1-2 — 推特主页时间线的关系型模式简单实现
  3. 图 1-3 — 用于分发推特至关注者的数据流水线,2012 年 11 月的负载参数【16】
  4. 图 1-4 — 展示了一个服务 100 次请求响应时间的均值与百分位数
  5. 图 1-5 — 当一个请求需要多个后端请求时,单个后端慢请求就会拖慢整个终端用户的请求
  6. 图 2-1 — 使用关系型模式来表示领英简介
  7. 图 2-2 — 一对多关系构建了一个树结构
  8. 图 2-3 — 公司名不仅是字符串,还是一个指向公司实体的链接(LinkedIn 截图)
  9. 图 2-4 — 使用多对多关系扩展简历
  10. 图 2-5 — 图数据结构示例(框代表顶点,箭头代表边)
  11. 图 2-6 — 使用示例 2-11 中的 Datalog 规则来确定爱达荷州在北美。
  12. 图 3-1 — 以类 CSV 格式存储键值对的日志,并使用内存散列映射进行索引。
  13. 图 3-2 — 键值更新日志(统计猫咪视频的播放次数)的压缩,只保留每个键的最近值
  14. 图 3-3 — 同时执行压缩和分段合并
  15. 图 3-4 — 合并几个 SSTable 段,只保留每个键的最新值
  16. 图 3-5 — 具有内存索引的 SSTable
  17. 图 3-6 — 使用 B 树索引查找一个键
  18. 图 3-7 — 通过分割页面来生长 B 树
  19. 图 3-8 — ETL 至数据仓库的简化提纲
  20. 图 3-9 — 用于数据仓库的星型模式的示例
  21. 图 3-10 — 按列存储关系型数据,而不是行
  22. 图 3-11 — 压缩的位图索引存储布局
  23. 图 3-12 — 数据立方的两个维度,通过求和聚合
  24. 图 4-1 — 使用 MessagePack 编码的记录(例 4-1)
  25. 图 4-2 — 使用 Thrift 二进制协议编码的记录
  26. 图 4-3 — 使用 Thrift 压缩协议编码的记录
  27. 图 4-4 — 使用 Protobuf 编码的记录
  28. 图 4-5 — 使用 Avro 编码的记录
  29. 图 4-6 — 一个 Avro Reader 解决读写模式的差异
  30. 图 4-7 — 当较旧版本的应用程序更新以前由较新版本的应用程序编写的数据时,如果不小心,数据可能会丢失。
  31. 图 II-1 — 一个数据库切分为两个分区,每个分区都有两个副本
  32. 图 5-1 — 基于领导者的(主/从)复制
  33. 图 5-2 — 基于领导者的复制:一个同步从库和一个异步从库
  34. 图 5-3 — 用户写入后从旧副本中读取数据。需要写后读 (read-after-write) 的一致性来防止这种异常
  35. 图 5-4 — 用户首先从新副本读取,然后从旧副本读取。时间看上去回退了。为了防止这种异常,我们需要单调的读取。
  36. 图 5-5 — 如果某些分区的复制速度慢于其他分区,那么观察者可能会在看到问题之前先看到答案。
  37. 图 5-6 — 跨多个数据中心的多主复制
  38. 图 5-7 — 两个主库同时更新同一记录引起的写入冲突
  39. 图 5-8 — 三种可以在多主复制中使用的拓扑示例。
  40. 图 5-9 — 使用多主复制时,写入可能会以错误的顺序到达某些副本。
  41. 图 5-10 — 法定写入,法定读取,并在节点中断后读修复。
  42. 图 5-11 — 如果 $w + r > n$,读取 r 个副本,至少有一个副本必然包含了最近的成功写入。
  43. 图 5-12 — 并发写入 Dynamo 风格的数据存储:没有明确定义的顺序。
  44. 图 5-13 — 在同时编辑购物车时捕获两个客户端之间的因果关系。
  45. 图 5-14 — 图 5-13 中的因果依赖关系图。
  46. 图 6-1 — 组合使用复制和分区:每个节点充当某些分区的主库,其他分区充当从库。
  47. 图 6-2 — 印刷版百科全书按照关键字范围进行分区
  48. 图 6-3 — 按哈希键分区
  49. 图 6-4 — 基于文档的次级索引进行分区
  50. 图 6-5 — 基于关键词对次级索引进行分区
  51. 图 6-6 — 将新节点添加到每个节点具有多个分区的数据库集群。
  52. 图 6-7 — 将请求路由到正确节点的三种不同方式。
  53. 图 6-8 — 使用 ZooKeeper 跟踪分区分配给节点。
  54. 图 7-1 — 两个客户之间的竞争状态同时递增计数器
  55. 图 7-2 — 违反隔离性:一个事务读取另一个事务的未被执行的写入(“脏读”)。
  56. 图 7-3 — 原子性确保发生错误时,事务先前的任何写入都会被撤消,以避免状态不一致
  57. 图 7-4 — 没有脏读:用户 2 只有在用户 1 的事务已经提交后才能看到 x 的新值。
  58. 图 7-5 — 如果存在脏写,来自不同事务的冲突写入可能会混淆在一起
  59. 图 7-6 — 读取偏差:Alice 观察数据库处于不一致的状态
  60. 图 7-7 — 使用多版本对象实现快照隔离
  61. 图 7-8 — 写入偏差导致应用程序错误的示例
  62. 图 7-9 — 交互式事务和存储过程之间的区别(使用图 7-8 的示例事务)
  63. 图 7-10 — 检测事务何时从 MVCC 快照读取过时的值
  64. 图 7-11 — 在可串行化快照隔离中,检测一个事务何时修改另一个事务的读取。
  65. 图 8-1 — 如果发送请求并没有得到响应,则无法区分(a)请求是否丢失,(b)远程节点是否关闭,或(c)响应是否丢失。
  66. 图 8-2 — 如果有多台机器将网络流量发送到同一目的地,则其交换机队列可能会被填满。在这里,端口 1,2 和 4 都试图发送数据包到端口 3
  67. 图 8-3 — 客户端 B 的写入比客户端 A 的写入要晚,但是 B 的写入具有较早的时间戳。
  68. 图 8-4 — 分布式锁的实现不正确:客户端 1 认为它仍然具有有效的租约,即使它已经过期,从而破坏了存储中的文件
  69. 图 8-5 — 只允许以增加防护令牌的顺序进行写操作,从而保证存储安全
  70. 图 9-1 — 这个系统是非线性一致的,导致了球迷的困惑
  71. 图 9-2 — 如果读取请求与写入请求并发,则可能会返回旧值或新值
  72. 图 9-3 — 任何一个读取返回新值后,所有后续读取(在相同或其他客户端上)也必须返回新值。
  73. 图 9-4 — 将读取和写入看起来已经生效的时间点进行可视化。客户端 B 的最后一次读取不是线性一致的
  74. 图 9-5 — Web 服务器和图像缩放器通过文件存储和消息队列进行通信,打开竞争条件的可能性。
  75. 图 9-6 — 非线性一致的执行,尽管使用了严格的法定人数
  76. 图 9-7 — 网络中断迫使在线性一致性和可用性之间做出选择。
  77. 图 9-8 — Lamport 时间戳提供了与因果关系一致的全序。
  78. 图 9-9 — 两阶段提交(2PC)的成功执行
  79. 图 9-10 — 参与者投赞成票后,协调者崩溃。数据库 1 不知道是否提交或中止
  80. 图 10-1 — 具有三个 Mapper 和三个 Reducer 的 MapReduce 任务
  81. 图 10-2 — 用户行为日志与用户档案的连接
  82. 图 10-3 — 在用户 ID 上进行的 Reduce 端连接。如果输入数据集分区为多个文件,则每个分区都会被多个 Mapper 并行处理
  83. 图 11-1 — (a)负载平衡:在消费者间共享消费主题;(b)扇出:将每条消息传递给多个消费者。
  84. 图 11-2 — 在处理 m3 时消费者 2 崩溃,因此稍后重传至消费者 1
  85. 图 11-3 — 生产者通过将消息追加写入主题分区文件来发送消息,消费者依次读取这些文件
  86. 图 11-4 — 在数据库中 X 首先被设置为 A,然后被设置为 B,而在搜索索引处,写入以相反的顺序到达
  87. 图 11-5 — 将数据按顺序写入一个数据库,然后按照相同的顺序将这些更改应用到其他系统
  88. 图 11-6 — 应用当前状态与事件流之间的关系
  89. 图 11-7 — 按处理时间分窗,会因为处理速率的变动引入人为因素
  90. 图 12-1 — 在搜索索引中,写(文档更新)遇上读(查询)