数据密集型应用系统设计

DDIA by Martin Kleppmann

数据密集型应用系统设计

大纲

复制

  1. 复制为了什么?故障仍可用、地理上接近用户、读副本增加吞吐量
  2. 复制与备份的区别是什么?备份是存旧快照可回滚,复制是数据的实时同步
  3. 复制的核心算法主要有哪三种?
    1. 单主复制:一个副本是主节点,其余的是从节点;写入发送给主节点,其余节点通过主节点发送的复制日志应用所有写入,mysql 中的 binlog 逻辑日志,raft 基于单主节点;
      1. 什么是同步复制、异步复制?同步复制是主节点等从节点确认,异步复制是主节点发送变更后直接让客户端报告成功
      2. 不停机设置新副本的核心流程是什么?先从主节点复制快照,然后追上快照拍摄后的写入
      3. 节点故障怎么处理?主节点故障:故障转移;从节点故障:追赶恢复
      4. 复制日志如何实现?基于语句、基于预写日志、基于逻辑日志(基于行)
    2. 多主复制:多个节点同时接收写入,也同时是其他主节点的从节点,特别适合跨地域的地区之间主节点互相复制、本地优先的一些软件
      1. 多主复制有哪些拓扑结构?双主节点拓扑、环形拓扑、星形拓扑、全对全拓扑
      2. 写入冲突时如何处理?不同主节点上的并发写入,并发定义为写入发生时,两个写入互相不知道对方的存在
        1. 最后写入者胜 LWW:丢弃并发写入,本质是随机选一个写入
        2. 手动冲突解决:数据库存所有写入值为兄弟节点,查询时返回所有,让程序自动或用户手动合并,最后写回新值解决冲突
        3. 自动冲突解决:操作变换、无冲突复制数据类型
    3. 无主复制:放弃主节点概念,任何副本都能接受写入
      1. 写入时并行发送到 n 个副本,收到 w 个节点的确认就认为写入成功;读取时并行发送到 n 个副本,等待r个节点的响应,通过版本号/时间戳区分最新值
      2. 读写仲裁:当w + r > n时,读取的r个节点与写入的w个节点必然存在重叠,可保证读取到最新值
  4. 复制延迟的问题:单主复制+异步复制+读扩展
    1. 最终一致性:异步从节点落后时客户端读到过时信息,停止写入并等待后最终从节点会赶上主节点,达成数据一致;这种复制延迟在正常操作时为几分之一秒,系统高负载或网络故障时会长达几秒甚至几分钟。
    2. 复制延迟引起的三大核心异常
      1. 读己之写(写后读):用户写入后立即查看,异步从节点尚未同步,用户看不到提交的数据 —> 1min 内读主节点/同步副节点;客户端记录最近写入的时间戳;—> 用户始终能看到自己提交的更新,但不对其他用户的更新可见性做承诺
      2. 单调读:用户多次读取路由到不同副本,先看到最新数据后看到过时数据,发生时间倒退 —> 确保多次读同一个副本 —> 用户多次读不会看到时间倒退
      3. 一致前缀读:分片数据库中,因果相关的写入,不同分片复制延迟不同,用户先看到结果后看到原因 —> 确保因果相关的写入都写入同一个分片 —> 按特定顺序发生的写入,在读取时也是相同的顺序,不会因果倒置
  5. 并发写入检测与版本控制:多主、无主复制时并发写入导致副本不一致
    1. 这里的并发与物理时间有关系吗?与物理时间是否重叠无关,核心是信息是否可达。
    2. 通过算法判断两个操作是否并发;先发生的操作应覆盖之前的操作,并发操作需触发冲突解决。
复制
加载中...

历史记录

共 2 条
  1. 2026-03-05 17:15:44
    init
  2. 2026-03-24 17:24:30
    增加了《复制》一章