跳到主要内容

数据库-复制 (replica)

目的​

  1. 减少延迟
  2. 增加可用性
  3. 提高吞吐量

三种复制算法​

  1. 单主
  2. 多主
  3. 无主

领导者和追随者​

同步复制与异步复制​

复制方式​

  1. 基于语句的复制
  2. 基于预写式日志的复制(WAL)
  3. 基于逻辑日志的复制(基于行)
  4. 基于触发器的复制

单主​

操作​

  1. 增加子节点
  2. 故障切换-子库
  3. 故障切换-主库

故障切换问题​

  1. 最后写入数据丢失
  2. 老主库重新加入后,新老主库数据冲突
  3. 舍弃数据导致冲突
  4. 脑裂 Split Brain
  5. 如何决定 Timeout

复制延迟问题​

  1. 读己之写
  2. 单调读
  3. 一致性前缀读

多主​

优势​

  1. 性能
  2. 容忍数据库停机
  3. 容忍网络延迟问题

应用​

  1. 离线保存
  2. 协同编辑

解决冲突​

  1. 避免冲突
  2. 收敛一致性(版本, ID,时间戳)
  3. 冲突处理逻辑(写时执行,读时执行)
  4. 版本向量

拓扑​

  1. 环形
  2. 星型
  3. 全部到全部

无主​

法定人数​

法定读取,法定写入

r + w > n

解决冲突​

  1. 读修复
  2. 反熵

问题​

  1. 松散的法定人数(n 非常大导致 r 与 w 不重叠)
  2. 写写冲突
  3. 读写冲突
  4. 成功更新但个别失败
  5. 成功更新后故障从从旧数据恢复
  6. 时序问题