跳转至

分布式系统

参考资料

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 的日志
  • 每次只增加或删除一个节点