分布式状态一致--Raft算法

要学习Raft算法,强烈推荐一个网址: http://thesecretlivesofdata.com/raft/

基本上述网址多看几遍,Raft算法就了解得七七八八了。

但关于Raft算法,还需要注意以下关键点:

  • 保证各server节点的选举超时时间相异

Raft有2个超时配置,1个为选举超时时间(election timeout),其表征了节点状态由follower转变为candidate所需要的时间,其在150ms-300ms之间随机取值。

集群初始状态时,各server节点的状态均为follower,当server时钟超时后,状态会由follower转变为candidate。

candidate状态的server节点会发起投票流程,candidate节点会先投自己1票,然后给其他节点发送求票信息,若其他节点收到求票信息时还未超时,则会将票投给发送请求的candidate节点。

票数最多的candidate节点状态将会更新为leader。

若各server节点的超时时间相同,则选举过程可能会陷入胶着状态,难以选出leader。

leader选取成功后,会周期性地发送心跳信息给各follower,该周期即是Raft另外1个超时配置: 心跳超时(heartbeat timeout)。

若follower未在heartbeat timeout时间内收到来自leader的心跳信息,则会由follower状态转化为candidate,并发起新一轮的投票流程。

  • leader节点必须等待大多数follower将状态写入日志,才可将该状态值commit。

分布式状态一致--Raft算法

分布式状态一致--Raft算法

分布式状态一致--Raft算法

分布式状态一致--Raft算法

  • 当2个follower节点同时变为candidate,会发生split vote

分布式状态一致--Raft算法
分布式状态一致--Raft算法
分布式状态一致--Raft算法

分布式状态一致--Raft算法