Raft协议学习

上周分享Eureka的时候,对集群的理解很少,集群之间如何保持一致性等等其实都不怎么理解,肖大佬给了一个网站 http://thesecretlivesofdata.com/raft/ 让我 看一下Raft协议,对分布式协调的协议有一定了解吧,,,

Raft协议: raft协议是一种相对比较易懂的分布式协议,每个节点都有三种状态:Leader, Candidate和Follower。

  1. Leader: 所有请求的处理者 Leader接受Client的更新请求,本地处理之后再同步到其他副本
  2. Follower: 请求的被动更新者,从Leader接受更新请求,写入本地日志文件
  3. Candidate: 如果Follower副本在一定时间内没有收到Leader的心跳,那么Leader可能已经故障,此时启动选举过程,Follower变成Candidate状态直到选举结束。

Raft协议将时间分成了很多连续的随机长度的term,每个term有唯一的id,一个term内只有1个leader。

Election过程: Follower将自己维护的current_term_id加一,然后将自己的状态转成Candidate,向其他节点发送ReqeustVOTEPRC消息(带有current_term_id) 可能有三种结果:

  1. 拿到了超过一半的投票,成为了Leader,Leader要向其他节点发心跳消息宣告自己是current_term_id代表的term的leader,一个节点如果收到了心跳消息,并且RPC消息 中的term_id比本地维护的更大时,会将状态变成Follower;而如果term_id小于本地维护的id,会无视该消息。

  2. 成为了Follower

  3. 没有选出Leader,对每个节点进行一个随机等待过程,再执行一遍Election。

Log Replication: 当Leader被选出后,就可以接受client的请求,leader会将它作为一个log entry 追加到日志中,然后向其他节点发AppendEntriesRPC请求,当leader确定了一个log entry 被大多数节点确认

Written on April 30, 2019