Raft算法动画演示:
http://thesecretlivesofdata.com/raft/
Nacos集群的写和Leader选举遵循Raft算法。Leader和Follower的通信间隔是500ms。term是0到15000ms。代码在RaftCore中。
Raft中,写就是所有节点先预提交,比如写在日志里,返回确认给Leader,超过半数确认了,就所有节点提交。
Leader选举,就是所有节点随机term,150ms到300ms,时间到了,就投自己一票,将票据发给其它节点,其它节点先收到自己的票据,将把票投给自己,自己的票数最多,自己就是Leader,其它就是Follower。
如果票数也相同,那几个节点就再随机term。
Leader确定后,Leader和Follower建立心跳连接,如果连接没有了,而且leader下线了,Follower就会开始term,选举新的Leader。
随机term是无需所有Follower同时发起投票,有一个得票占多数即可。
脑裂时,也就是分区时,可通信的大集群,分成可独立通信的小集群,会各自选举Leader。恢复时,会选举term次数大的Leader作为大集群的Leader。
Nacos、RocketMQ、Redis的Sentinel用了Raft。
Kafka用的是PacificA,Zookeeper的写用了Raft,选主用的Paxos。