Raft算法

资料

 

实现

对于强一致性共识算法,当前工业生产中,最多使用的就是 Raft 协议,Raft 协议更容易让人理解,并且有很多成熟的工业算法实现,比如蚂蚁金服的 JRaft、Zookeeper 的 ZAB、Consul 的 Raft、百度的 braft、Apache Ratis
paxos以复杂和难以理解著称,通常来说raft是更容易理解的算法,也更容易在工程实践中采用。
  1. braft:百度基于C++实现
  1. Aeron Cluster:基于java实现
  1. etcd/raft:基于Go语言实现

状态

notion image
Raft协议一共包含如下3类角色:
  • Leader(领袖):领袖由群众投票选举得出,每次选举,只能选出一名领袖;
  • Candidate(候选人):当没有领袖时,某些群众可以成为候选人,然后去竞争领袖的位置;
  • Follower(群众):这个很好理解,就不解释了。
然后在进行选举过程中,还有几个重要的概念:
  • Leader Election(领导人选举):简称选举,就是从候选人中选出领袖;
  • Term(任期):它其实是个单独递增的连续数字,每一次任期就会重新发起一次领导人选举;
  • Election Timeout(选举超时):就是一个超时时间,当群众超时未收到领袖的心跳时,会重新进行选举。

流程

选主流程 (Leader Election)

  1. 初始化状态:
      • 所有节点启动时默认处于 Follower 状态。
  1. 超时检测:
      • Follower 节点在随机时间间隔内没有接收到 Leader 或 Candidate 的心跳消息,则认为当前 Leader 失效,Follower 转变为 Candidate 状态并发起选举。
  1. 发起选举:
      • Candidate 节点会将自身的任期号增加,并向集群中的其他节点发送 RequestVote 请求。
  1. 投票:
      • 其他节点(通常是 Follower 和其他 Candidate)根据投票规则决定是否投票给该 Candidate。
        • 如果投票给 Candidate,则会发送 VoteGranted 消息。
        • 如果已经有投票给其他 Candidate 或者认为该 Candidate 的任期号不够新,则不会投票。
  1. 成为 Leader:
      • 当一个 Candidate 收集到集群中超过半数节点的投票时,它就会成为新的 Leader。

日志复制流程 (Log Replication)

  1. 发送心跳:
      • 成功当选的 Leader 会定期向所有的 Follower 发送心跳消息(AppendEntries RPC)以维持其领导地位。
  1. 追加条目:
      • 当 Leader 收到来自客户端的新条目时,它会将这些条目追加到自己的日志中,并通过 AppendEntries 请求将其同步到所有 Follower。
  1. 日志匹配:
      • Follower 需要确保其日志与 Leader 的日志保持一致。如果 AppendEntries 请求中的条目与 Follower 的日志不匹配,则 Follower 会拒绝该请求,并返回冲突点的信息。
  1. 日志截断:
      • Leader 接收到冲突信息后,会调整 Follower 的日志使其与自己的日志相匹配,这通常涉及到删除 Follower 日志中不一致的部分。
  1. 日志应用:
      • 当一个条目被复制到了大多数节点上,它就被认为是已提交的。Leader 会在本地应用这些已提交的日志条目,并通知 Follower 应用相应的条目。

安全性保障

  • Raft 确保在同一时刻只能有一个 Leader。
  • 通过维护日志的一致性,确保所有节点最终达成一致的状态。
Loading...
目录
文章列表
王小扬博客
产品
Think
Git
软件开发
计算机网络
CI
DB
设计
缓存
Docker
Node
操作系统
Java
大前端
Nestjs
其他
PHP