主从复制
在主从复制下 , 主节点可写 , 从节点只读
细分为:
- 同步复制: 所有从节点同步成功后,才返回,所以吞吐量比较低
- 一个从节点同步复制,其他节点异步复制:可以保证存在一个同步从节点有最新的数据副本
- 全异步模式:但是这样主从延迟很关键
如何新增一个新的从节点:
- 主节点开始一致性快照,避免长时间锁定
- 快照拷贝到新的从节点
- 记录快照的数据更改日志 - 如数据库的LSN
- 快照恢复完成之后,处理新的LSN期间的数据变化
主从复制下如何完成高可用:
从节点失效之后,追赶式恢复
主节点失效,重新选举(共识算法),对之前的主节点降级为从节点 - 防止脑裂
主从复制下的日志同步的几种模式:
- 基于语句的复制:binlog_format 为 statement , 但是对于now()这种重新执行的时候数据就不准确了
- 基于WAL复制,即redo记录的信息记录,复制的是物理页,很底层,对存储引擎紧密耦合,存储格式都是需要相同的
- 基于行的逻辑日志复制: binlog_format : row ,复制的是行数据,不需要重复执行语句,目前使用的比较广泛
- 基于触发器的复制:业务上自己定义触发的场景,开销比较大,逻辑比较复杂
如果复制发生了滞后,会产生:
- 读不到自己的写:无法保证写后读一致性
- 只从主节点访问 - 压力太大
- 记录最近最新的时间戳,只拿最新的数据
- 单调读一致性:用户多次读取,不会看到数据回滚的现象
- 只读取单一的从节点
- 前缀读一致性:读顺序基于当时的写顺序
对于各个复制节点的数据不一致的问题,可以看一下 分布式系统一致性和共识
多主节点复制
多主节点即意味着多个主节点都可以同时写入数据(多数据中心)
多主节点肯定是符合可用性
一般多主复制基本都是异步复制,同步对于多主节点风险太大了
对于单个数据中心,内部是一个主从模型
多个数据中心之间,由主节点之间完成信息互换
如果存在多个主节点的写冲突问题,可以交给用户决定
对于多主节点的拓扑结构:
- 环形结构:主节点只从前序节点获取数据 - mysql 使用的模式 - 存在单点问题
- 星形结构:一个主节点发送给所有的其他主节点