分布式系统学习(一)—— Raft算法
CAP定理
一致性
对某个指定的客户端来说,读操作保证能够返回最新的写操作结果。
可用性
非故障的节点在合理的时间内返回合理的响应。
分区容忍性
当出现网络分区后,系统能够继续“履行职责”。
CAP关注的粒度是数据,而不是整个系统。
Raft算法
一、拜占庭将军问题
在很久很久以前,拜占庭是东罗马帝国的首都。那个时候罗马帝国国土辽阔,为了防御目的,因此每个军队都分隔很远,将军与将军之间只能靠信使传递消息。
在打仗的时候,拜占庭军队内所有将军必需达成一致的共识,才能更好地赢得胜利。但是,在军队内有可能存有叛徒,扰乱将军们的决定。
这时候,在已知有成员不可靠的情况下,其余忠诚的将军需要在不受叛徒或间谍的影响下达成一致的协议。
拜占庭将军问题是计算机科学家莱斯利·兰伯特提出的有关计算机网络中所存在的一致性问题
的问题。
二、Raft算法流程
Raft算法依靠状态机
和主从同步
的方式,在各个节点之间实现数据的一致性。
Raft算法的两个核心要点:
- 选举主节点
- 多个节点之间投票竞争
- 同步数据(Log Replication)
选举主节点
三种角色、状态:
- Leader 主节点
- Follower 从节点
- Candidate 参与投票竞争的节点
选举流程:
- 所有节点的初始状态都是Follower,如果Follower超过一段时间没有接收到Leader的心跳,就会成为Candidate 。
- Candidate 会向Follower发起投票,让Follower将票投给自己
- Follower将会投出它们的票(如果有3个Candidate,那这个Follower要投给谁?)
- 得到票数最多的Candidate 成为主节点
同步数据
所有的修改操作都要经过Leader,Leader会等待,直到majority(大多数)节点都被修改,Leader会commit这个修改。
三、Raft算法细节
两个超时时间:
- 选举超时
- 心跳超时
选举超时
- Follower等待,直到成为Candidate的时间,选举超时为150ms-300ms之间的任意值
- Follower超时之后,成为Candidate,开始选举流程,给它自己投票,并发送投票请求给其他节点
- 其他节点投票给Candidate,并reset自己的选举超时时间
- 当Candidate有majority(大多数)选票,就成为Leader
心跳超时
- Leader会发送Append Entries(追加条目)给Follower
- 这些Append Entries(追加条目)信息会按特定的时间间隔发送给Follower,这个时间间隔叫心跳超时
- Follower也会响应Append Entries(追加条目),Follower每次接收到Leader的Append Entries(追加条目),都会reset自己的选举超时时间
- 直到Follower没有接收到Leader的心跳,然后开始选举过程,成为Candidate
关于作者
后端程序员,五年开发经验,从事互联网金融方向。技术公众号「清泉白石」。如果您在阅读文章时有什么疑问或者发现文章的错误,欢迎在公众号里给我留言。