数据库(replica)
目的
- 减少延迟
- 增加可用性
- 提高吞吐量
三种复制算法
- 单主
- 多主
- 无主
领导者和追随者
同步复制与异步复制
复制方式
- 基于语句的复制
- 基于预写式日志的复制(WAL)
- 基于逻辑日志的复制(基于行)
- 基于触发器的复制
单主
操作
- 增加子节点
- 故障切换-子库
- 故障切换-主库
故障切换问题
- 最后写入数据丢失
- 老主库重新加入后,新老主库数据冲突
- 舍弃数据导致冲突
- 脑裂 Split Brain
- 如何决定 Timeout
复制延迟问题
- 读己之写
- 单调读
- 一致性前缀读
多主
优势
- 性能
- 容忍数据库停机
- 容忍网络延迟问题
应用
- 离线保存
- 协同编辑
解决冲突
- 避免冲突
- 收敛一致性(版本, ID,时间戳)
- 冲突处理逻辑(写时执行,读时执行)
- 版本向量
拓扑
- 环形
- 星型
- 全部到全部
无主
法定人数
法定读取,法定写入
r + w > n
解决冲突
- 读修复
- 反熵
问题
- 松散的法定人数(n 非常大导致 r 与 w 不重叠)
- 写写冲突
- 读写冲突
- 成功更新但个别失败
- 成功更新后故障从从旧数据恢复
- 时序问题