原理
非常好的教程:http://thesecretlivesofdata.com/raft/
总结一下关键的点
- 两个阶段:Leader Election、Log Replication
- 三种角色:Leader、Candidate、Follower
- 两种超时:Election Timeout(150~300ms随机)、Heartbeat Timeout(不要设置太小,要不然容易重新选主)
- Follower 等待 Leader 指令若超过 Election Timeout,便成为 Candidate,并且进入下一轮选举(Term++)
- Follower 收到心跳包(以及 Leader 的消息、Candidate 的 Vote 请求)会重置 Election Timeout 和更新 Term
- Candidate 得到超过半数的投票才会变成 Leader。这能保证在每一个 Term 中,只会有一个 Leader。
- Candidate 变成 Leader 后会给所有节点发送一条 Append Entries 的信息,告诉大家我是 Leader。
- Candidate 若接收到 Leader 的 Hearbeat 或者下一个 Term,就会变成 Follower。
- Candidate 会在每一个 Election Timeout 进入下一轮选举(Term++),并广播 Vote for me 请求
- Client 修改数据时,请求是发送到 Leader,然后 Leader 再发送到其余所有节点,并在大多数节点确认后才在 Leader 上 Commit
- 读写只通过 Leader,也就是 Raft 协议只满足 CAP 理论中的 CP 两个,因为在分区后,可能由于少数的原因,变成了不可用。
- 新增/删除一个节点:新节点给 Leader 发出请求,Leader 往日志里添加一条 ConfChange 的日志,然后再同步到所有 Follower 里。注意在 Commit 之前,新节点就已经开始同步日志了。