主从复制

在主从复制下 , 主节点可写 , 从节点只读

细分为:

  • 同步复制: 所有从节点同步成功后,才返回,所以吞吐量比较低
  • 一个从节点同步复制,其他节点异步复制:可以保证存在一个同步从节点有最新的数据副本
  • 全异步模式:但是这样主从延迟很关键

如何新增一个新的从节点:

  1. 主节点开始一致性快照,避免长时间锁定
  2. 快照拷贝到新的从节点
  3. 记录快照的数据更改日志 - 如数据库的LSN
  4. 快照恢复完成之后,处理新的LSN期间的数据变化

主从复制下如何完成高可用:

从节点失效之后,追赶式恢复

主节点失效,重新选举(共识算法),对之前的主节点降级为从节点 - 防止脑裂

主从复制下的日志同步的几种模式:

  • 基于语句的复制:binlog_format 为 statement , 但是对于now()这种重新执行的时候数据就不准确了
  • 基于WAL复制,即redo记录的信息记录,复制的是物理页,很底层,对存储引擎紧密耦合,存储格式都是需要相同的
  • 基于行的逻辑日志复制: binlog_format : row ,复制的是行数据,不需要重复执行语句,目前使用的比较广泛
  • 基于触发器的复制:业务上自己定义触发的场景,开销比较大,逻辑比较复杂

如果复制发生了滞后,会产生:

  • 读不到自己的写:无法保证写后读一致性
    • 只从主节点访问 - 压力太大
    • 记录最近最新的时间戳,只拿最新的数据
  • 单调读一致性:用户多次读取,不会看到数据回滚的现象
    • 只读取单一的从节点
  • 前缀读一致性:读顺序基于当时的写顺序

对于各个复制节点的数据不一致的问题,可以看一下 分布式系统一致性和共识

多主节点复制

多主节点即意味着多个主节点都可以同时写入数据(多数据中心)

多主节点肯定是符合可用性

一般多主复制基本都是异步复制,同步对于多主节点风险太大了

对于单个数据中心,内部是一个主从模型

多个数据中心之间,由主节点之间完成信息互换

如果存在多个主节点的写冲突问题,可以交给用户决定

对于多主节点的拓扑结构:

  • 环形结构:主节点只从前序节点获取数据 - mysql 使用的模式 - 存在单点问题
  • 星形结构:一个主节点发送给所有的其他主节点