要学习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。
- 当2个follower节点同时变为candidate,会发生split vote
网友评论