分布式系统一致性
常见的一致性方案
一致性算法
1 Paxos
1.1 Paxos 集群角色
- Proposer - 提出议案
- Acceptor - 参与角色
- Learner - 不参与提案, 接收已通过提案
1.2 提案选定流程
Prepare 阶段
- Proposer 选择一个提案编号 M,向超过半数的 Acceptor 成员发送
prepare
请求 - Acceptor 接收到
prepare
请求,M > N (该 Acceptor 中已响应的所有 prepare 请求的最大编号 N),则将最大的N 响应给 Proposer ,并承诺不再接收小于M 的提案
Accept 阶段
- Proposer 接收到超过半数 Acceptor 对于 M 的
prepare
请求的响应,则发送 [M,V] 提案 Accept 请求给 Acceptor ,V 是 Acceptor 接收到响应编号中最大的 编号对应value。 - Acceptor 接收到
Accept
请求,只要该Acceptor 没有同意过 > M 编号的提案,就通过这个提案;
Learn 阶段
- Proposer 将通过的提案 同步给 Learner
总结:Paxos协议的容错性很好,只要有超过半数的节点可用,整个集群就可以自己进行Leader选举,
2 Raft 协议
2.1 Raft 集群角色
- Leader
- Follower
- Candidate - 候选者
2.2 Leader 选举阶段
- 初始化阶段 所有节点都是 follower 节点
- follower 节点设置 currentIndex = 1, 设置状态为 Candidate、给自己投票、并向其他节点发送投票请求;
- 赢得选举
- 其他leader
- 选举超时
算法流程:
- A_currentIndex > B_currentIndex = 承认A leader , B follower
- 如果 两个Candidate得票一样多, 重选
2.3 数据复制
- leader 接收写 entry 请求
- entry 发送给所有 follower ,半数 follower 回复 ok,则返回给客户端成功,并把commitindex 设置为 该entry 的index,满足 一致性.