动画链接 http://thesecretlivesofdata.com/raft/
1.所有节点有三个状态,leader,candidate,follower.其中candidate状态不能对外工作。
2.选举过程,每个节点两个时间周期和选举有关。
election timeout:失去leader联系的节点等待超过该时间,则变为candidate.随机在150ms 到 300ms之间。
heartbeat timeout:leader往follower发的保活心跳时间。会刷新election timeout。
选举中的具体投票过程。
成为candidate后立刻发信息给所有其他节点,要求其他节点对自己投票。
其他节点如果在election timeout周期内没有投过票则回应赞成票并重置election timeout。--确保一个选举周期内一个节点一票。
并递增选举周期election term。
PS:平票重选-时间是随机,已经相当程度避免了平票。
3.工作过程。leader根据heartbeat timeout为周期发送Append Entries给follower,后者回复,这就是刷新follower的election timeout心跳。
这会持续直到有follower成为新的candidate.
工作过程中的具体写入过程-Log Replication。
第一步leader像集群争取写入同意,半数以上回复同意,此刻返回客户端写入成功并进行第二步。
第二步确认写入,并同步给follower。
可以理解为二段式提交的分布式事务。当然这很脆弱,但是好用。
使用上方介绍的保活消息Append Entries传递消息。
4.脑裂处理:
这里的一些假设先解释一下,要达成脑裂也就是出现两个leader.必须是老的少数派被隔离,产生新的多数派的情况,否则第二个leader根本选不出来。
当然也不存在两个leader拥有相同数量支持者的情况。
少数派leader会写入失败。
多数派leader可写入成功。
网络连通后,老的少数派会看到election term更高的多数派并主动成为follower,两个leader都会放弃未commit的写入,并根据election term的多数派开始同步数据。