Raft协议

本文详细介绍了分布式系统中节点状态的角色,包括Leader、Follower和Candidate,以及termId、RequestVote和AppendEntries等核心概念。在选举过程中,当follower超时未收到来自leader的心跳,会转变为Candidate发起选举。当选主过程结束后,Leader会通过心跳维持其地位,并复制日志到其他Follower,确保一致性。日志复制过程中, Leader等待大多数Follower确认更新后才提交修改,确保集群数据的一致性。

基本名词

  • 节点状态
    • Leader(主节点):接受 client 更新请求,写入本地后,然后同步到其他副本中
    • Follower(从节点):从 Leader 中接受更新请求,然后写入本地日志文件。对客户端提供读请求
    • Candidate(候选节点):如果 follower 在一段时间内未收到 leader 心跳。则判断 leader 可能故障,发起选主提议。节点状态从 Follower 变为 Candidate 状态,直到选主结束
  • termId:任期号,时间被划分成一个个任期,每次选举后都会产生一个新的 termId,一个任期内只有一个 leader。termId 相当于 paxos 的 proposalId。
  • RequestVote:请求投票,candidate 在选举过程中发起,收到 quorum (多数派)响应后,成为 leader。
  • AppendEntries:附加日志,leader 发送日志和心跳的机制
  • election timeout:选举超时,如果 follower 在一段时间内没有收到任何消息(追加日志或者心跳),就是选举超时。

竞选过程   

最初状态:    

  1. 一个分布式系统的最初阶段,此时只有 Follower,没有 Leader。Follower A 等待一个随机的竞选超时时间之后,没收到 Leader 发来的心跳包,因此进入竞选阶段。
  2.  A 发送投票请求给其它所有节点。
  3. 其它节点会对请求进行回复,如果超过一半的节点回复了,那么该 Candidate 就会变成 Leader。
  4. 之后 Leader 会周期性地发送心跳包给 Follower,Follower 接收到心跳包,会重新开始计时。

多个 Candidate 竞选

  1. 如果有多个 Follower 成为 Candidate,并且所获得票数相同,那么就需要重新开始投票,例如下图中 Candidate B 和 Candidate D 都获得两票,因此需要重新开始投票。
  2. 当重新开始投票时,由于每个节点设置的随机竞选超时时间不同,因此能下一次再次出现多个 Candidate 并获得同样票数的概率很低。

日志复制

1. 来自客户端的修改都会被传入 Leader。注意该修改还未被提交,只是写入日志中。

2. Leader 会把修改复制到所有 Follower。

3. Leader 会等待大多数的 Follower 也进行了修改,然后才将修改提交。

4. 此时 Leader 会通知的所有 Follower 让它们也提交修改,此时所有节点的值达成一致。

### Raft 分布式一致性协议的工作原理 Raft 是一种用于管理分布式系统的复制日志的一致性算法,其设计目标是提供更高的可理解性和实用性。以下是关于 Raft 协议如何工作的详细介绍: #### 1. 节点角色定义 在 Raft 中,节点分为三种主要的角色:Leader、Follower 和 Candidate。 - **Leader**: 负责处理所有的客户端请求并将其记录到日志中。其他节点会跟随 Leader 的指令操作[^1]。 - **Follower**: 不主动发起任何动作,仅响应来自 Leader 或 Candidate 的 RPC 请求。 - **Candidate**: 当 Follower 发现无法接收到 Leader 的心跳信号时,它可能会转变为 Candidate 并尝试选举新的 Leader[^3]。 #### 2. 领导者选举机制 领导者选举是 Raft 协议的核心部分之一。当集群启动或当前 Leader 失效时,系统进入选举阶段: - 如果某个 Follower 在超时时间内未收到来自 Leader 的心跳消息,则该节点转换为 Candidate,并向其他节点发送投票请求(RequestVote RPC)。如果获得超过半数的票数,则成为新 Leader[^2]。 - 若多个 Candidates 同时竞选导致选票分裂而无人胜出,则触发新一轮随机延迟后的重新选举过程直至选出唯一 Leader[^4]。 #### 3. 日志复制流程 一旦选举完成,Leader 开始接收客户命令并将这些命令作为条目追加到本地日志中;随后通过 AppendEntries RPC 将最新日志同步给 Followers[^5]: ```python def append_entries(follower_id, prev_log_index, entries): follower = get_follower_by_id(follower_id) if not follower.log_matches(prev_log_index): return False follower.append_logs(entries) return True ``` #### 4. 安全性保障措施 为了确保数据一致性和可靠性,Raft 提出了几个重要的安全性约束条件: - **单一领导原则**:在同一时刻只能存在一个有效的 Leader 来协调整个群集的操作。 - **多数派规则**:每项决策都需要得到大多数副本的认可才能被提交生效。 - **日志匹配属性**:不同服务器上的相同索引位置的日志必须完全相等。 #### 性能表现分析 就性能而言,在稳定状态下,每次提交一条日志只需要一次往返通信至集群一半以上的成员即可完成确认。因此,Raft 的性能受到磁盘 I/O 和网络延时的影响较大。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值