Skip to main content

数据库(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. 时序问题