Raft: In Search of an Understandable Consensus Algorithm

和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通知