介绍
raft是一种共识协议,被广泛应用于分布式系统中,相当于Paxos,它的状态更加简单、算法实现更加容易。
核心点
状态
- followers
- 响应candidates和leaders的rpc请求;
- 在选举定时器结束时,如果没有接收到有效的AppendEntries rpc或者没对candidate投票,就会变成candidate;
- candidates
- 自增term,为自己投票;
- 向其他peer发送rpc,如果收到大部分投票,则成为leader,如果收到来自AppendEntiries rpc,结束成为follower,如果收到更高的term RequestVote rpc,成为follower;
- 超时成为follower;
- leader
- 初始化每个nextIndex;
- 发送空的AppendEntries rpc(心跳)给每个follower;
- 接受client的请求,并记录本地log,发送给follower,如果follower落后太多,则会调用installSnapshot rpc进行同步,如果出现冲突,则会将冲突之后的e日志发送follower,follower收到后会进行同步(先删除不一致的日志,然后再加上收到的新的日志),从而达到和leader的同步状态;
- 如果过半节点收到日志,则标记为committed;
- 如果收到失败,且term大于自己的term,则转为follower;
主要行为
- RequestVote
- candidate节点发送;
- candidate自增term后会向所有peer发送投票;
- 收到过半投票则成为leader;
- AppendEntries
- 只有leader节点可以发送;
- 向其他节点同步日志的请求,过半成功则会记录committed;
- 出现异常:如果接收方term更高,则转为follower,如果落后则进行冲突解决或者落后过多处理;
- InstallSnapshot
- 在AppendEntries中提到,落后过多则会进行压缩日志整体同步;
其他
raft是强一致性的,对于读请求,follower依然是通过将请求转发leader来进行响应,leader节点通过对比commited index和read index来确定是否立即可响应;
参考
https://juejin.im/post/5af14cd2f265da0b863633e4