NOTE
4.3 分布式系统复制架构之主从复制
1. 什么是Leader-Follower - 副本中有且仅有一个Leader,其他的都是Follower 2. Leader-Follower使用场景 - 单个数据中心 3. Leader选举 所有副本中选出一个作为Leader,其他的副本作为Follower 3.1. 选举方法 1. 手动 -
这是历史学习笔记,可能存在过时或不完整的理解。
1. 什么是Leader-Follower
- 副本中有且仅有一个Leader,其他的都是Follower
2. Leader-Follower使用场景
- 单个数据中心
3. Leader选举
所有副本中选出一个作为Leader,其他的副本作为Follower
3.1. 选举方法
- 手动
- 手动指定一个节点为leader
- 依赖中心化组件
- 比如Zookeeper
- 选举算法
- Bully算法:在所有活着的节点中,选取节点ID最大或者最小的节点为Leader
- 分布式一致性算法之Paxos.md
- 分布式一致性算法之Raft.md:数据最新原则:term大,并且index大
- 分布式一致性算法之ZAB.md:数据最新原则:term大,并且index大
3.2. 脑裂问题
如果发生网络分区,那么每个分区都有一个Leader,这就是脑裂问题 解决:引入过半机制
4. Leader-Follower原理
4.1. 启动时Leader选举
- 手动
- 中心化
- 选举算法
- 刚启动的集群没有数据,所以按照ID大小决定Leader。
- A启动,通过ping得到节点列表(A),选举ID最小的节点(只有自己)为master,但是不满足最少2个节点,循环等待
- B启动,通过ping得到节点列表(A、B),选举ID最小的节点A为master,满足最少2个节点,组成集群
- C启动,通过ping得到节点列表(A、B、C),由于已经有了master,直接加入这个集群即可
4.2. 数据同步
4.2.1. 同步过程
- follower第一次连接leader,需要同步leader的所有数据,这个过程叫做全量同步。过程如下:
- leader把当前时刻数据做一个快照
- leader将快照发送给新的follower
- leader继续服务客户端写入数据
- follower重放快照
- follower拉取leader快照之后的所有数据变更
4.2.2. 同步方式
4.2.3. 同步日志
4.3. 请求处理
由谁处理,如何路由
4.3.1. 读请求
可由leader或者follower处理
4.3.2. 写请求
必须由leader处理 如果请求路由到leader,那么leader处理完同步给follower 如果请求路由到follower,那么需要由follower转发给leader或者follower告知client重定向到leader处理,leader处理完再同步给follower
4.4. 故障处理
4.4.1. 故障检测
4.4.2. 故障恢复
4.4.2.1. Follower宕机
- Follower宕机之后重启,可以从本地日志知道自己当前复制到哪个位置,重新连接Leader之后从这个位置往后复制即可,这叫做增量同步。过程如下:
- follower重启连接leader
- follower读取本地日志的位置,从leader拉取这个位置之后的数据变更
- follower重放这些数据变更
4.4.2.2. Leader宕机
- Leader宕机之后需要:
- 选取一个follower提升为leader
- 告知客户端和其他follower leader已修改