分布式系统
参考资料
Raft
Raft 基本概念
- Leader:负责处理客户端请求,管理日志复制和提交
- Follower:被动接受 Leader 的指令,处理日志复制和提交
- Candidate:在选举过程中,Follower 可能会变成 Candidate
- 本地状态机:每个节点维护一个本地状态机,应用已提交的日志条目来更新状态
Raft 读写
- 写:客户端发送写请求到 Leader,Leader 将请求作为日志条目追加到日志中,并将日志条目复制到 Followers。当大多数节点确认日志条目后,Leader 将其提交并应用到状态机
- 读:客户端发送读请求到 Leader,Leader 可以直接从本地状态机读取数据并返回给客户端,或者通过日志复制机制确保读请求在最新的状态下被处理
- 只读 Leader, 需要保证 Leader 不是过时的,通常通过心跳机制和选举过程来确保
- 写一条空日志条目,确保 Leader 的日志是最新的
- 想让 Follower 处理读请求,必须使用租约机制
- Follower 的 commitIndex 不落后于 readindex
- 租约有效
Raft 强一致性
- 只写 Leader
- 新的 Leader 必须包含所有已提交的日志条目 (请求投票时带上 Term 与 Index)
- Leader 死掉后, 会进行选举
- 每个 Follower 的超时器随机设置,避免同时发起选举
- Candidate 收到大多数节点的投票后成为新的 Leader
- 脑裂, 参考 Term 决定 Leader 的合法性
其他
- 快照加日志
- 只能提交当前 Term 的日志
- 每次只增加或删除一个节点