引用
集群组成
副本、故障恢复
leader
- 向follower发送心跳维持leader地位
- 处理所有的客户端读写请求
- 向follower同步数据(数据只能从leader流向follower节点)
follower
- 接收leader的数据
- leader掉线之后竞选新的leader
candidator
- follower竞选时的临时身份,向其他节点发送投票请求
选举
任期
单调递增,每次选举之后进入新的任期
候选者
- follower收不到leader心跳之后,
- 自发成为candidator,将任期+1(并给自己投票),
- 向其他节点请求投票,若收到了超过1/2的投票,则选举成功,成为新的leader节点
投票原则
- 尚未投票
- 任期更高
- 日志更新
读写请求
读
leader处理读请求
写
leader处理写请求 当>1/2节点同步完成,返回成功
网络分区
节点数不足1/2的分区将无法写入新数据,即使有leader节点
*
Raft 永远不会通过计算副本数目的方式去提交一个之前任期内的日志条目。只有领导人当前任期里的日志条目通过计算副本数目可以被提交;一旦当前任期的日志条目以这种方式被提交,那么由于日志匹配特性,之前的日志条目也都会被间接的提交。
客户端未提交的日志也会被复制到大多数节点上。提交过程中leader变化,客户端重试?
leader响应只读请求先至少和大多数节点交换一次心跳? 每次都检查?