和Viewstamped Replication类似.
Raft将一致性算法分成三个子问题:
Leader election
Log replication
Safety
几个特点:
强Leader
日志只从Leader向其它机器发
Leader选举:
使用随机计时器消除选举冲突
Membership变更
rpc接口:
RequestVote
Candidate在选举期间发起
AppendEntries
Leader发起
节点的三种状态(角色):
Leader
Candidate
Follower
leader election
两个超时时间:
election timeout
follower 等待直到leader消息, 直至变成candidate
随机150ms~300ms不等
超时时间到, follower变成candidate, 增加election term, 开始新的选举
其它节点收到vote请求, 发现这个歌election term还没有投票, 那么就投给他
收到多数票, 就成了Leader
heartbeat timeout
leader向follower发送append请求, follower响应这次请求
以一定的间隔发送.
状态迁移:
| cond | from | to |
|---|---|---|
| follower收不到leader的消息 | Follower | Candidate |
| candidate发起投票,收到多数票 | Candidate | Leader |
Log Replication, 一次状态变更的流程(两次沟通)
leader把日志append到本地
leader向follower发送日志
leader等待多数节点确认日志的append
leader确认commit这次变更, 修改本地状态
leader向follower发送commit通知