Raft 用任期、领导者与复制日志达成共识

说明领导者选举、日志复制、提交规则和成员变更怎样维护复制状态机安全,并识别多数派与时序边界。

Raft 用任期、领导者与复制日志达成共识

共识算法让多个节点对同一串决策保持一致,即使部分节点停止或网络延迟。Raft 把问题分成领导者选举、日志复制和安全约束,通过复制状态机让各副本按相同顺序执行命令。

协议保证建立在明确故障模型上:节点可能停止并恢复,消息会延迟、丢失、重复或乱序,但不处理节点任意恶意行为。理解模型比记住角色名称更重要。

任期提供逻辑时间与领导权边界

Raft 把时间划分为递增任期。每个任期最多产生一个领导者,也可能因选票分裂没有领导者。节点在通信中携带任期,看到更大任期就更新状态,旧领导者由此失去资格。

任期不是墙上时钟,不要求节点时钟同步。它帮助识别过期消息和领导权,却不能表示真实事件时间。业务时间仍要独立建模。

每个节点在任期内只能投一票,并把当前任期和投票持久化后再响应。若崩溃后忘记投票,可能在同一任期支持多个候选,破坏安全。

选举依赖超时与多数票

跟随者若在选举超时内没有收到领导者心跳,会增加任期并成为候选,为自己投票并请求其他节点支持。获得集群多数票后成为领导者。随机化超时降低多个节点同时竞选导致持续平票的概率。

时序主要影响活性而非安全。时钟异常或网络延迟可能导致频繁选举,使系统暂时不可用,但不应让两个领导者在同一任期都获得多数。实现必须保证持久状态和消息比较规则正确。

多数派意味着五节点集群通常可容忍两个节点不可用,前提是其余三个能互相通信。增加节点提高故障容忍也增加复制确认和运维成本,并非越多越好。

领导者负责追加和复制日志

客户端命令先追加到领导者日志,领导者通过 AppendEntries RPC 把条目发送给跟随者。每条记录包含索引和创建它的任期。RPC 同时携带前一条记录的索引与任期,使跟随者验证日志前缀。

若前缀不匹配,领导者回退发送位置,找到共同点后覆盖冲突后缀。已提交记录不能被未来领导者替换,这是协议安全性的核心结果之一。

空的 AppendEntries 充当心跳,维持领导权并传播提交位置。心跳成功不代表某个新命令已经提交,客户端确认必须遵循提交规则。

提交规则连接多数复制与当前任期

领导者知道某条当前任期记录已存储在多数节点后,可以推进 commitIndex,并按顺序应用到状态机。对旧任期记录,Raft 不只凭副本数量直接提交,而是通过提交当前任期记录间接确认前缀。

这一限制避免旧领导者留下的日志在领导权变化后被错误视为提交。实现若简化条件,可能在故障组合下让不同节点应用不同命令。

状态机必须确定性执行同一日志。若命令依赖本地时间、随机数或外部调用,副本可能产生不同结果。应把非确定输入作为命令内容确定下来,或把外部副作用放在协议之外受控处理。

客户端重试仍需幂等语义

领导者可能在提交命令后、响应客户端前崩溃。客户端不知道命令是否生效,重试会再次提交相同操作。Raft 保证日志一致,不自动识别两个请求属于同一业务动作。

客户端会话 ID、请求序号或幂等键可让状态机返回既有结果。去重状态也必须随日志复制和快照保留,否则恢复后重复请求可能重新执行。

读取也有一致性条件。直接从任意跟随者读取可能陈旧;领导者需要确认自己仍拥有有效领导权,或使用已证明的只读协议。具体实现提供何种读取模式,应以文档验证。

快照压缩日志但不能丢失协议状态

日志持续增长会耗尽存储并拖慢节点追赶。快照保存某个已应用索引处的状态机状态,早期日志可以截断。落后太多的跟随者可安装快照后继续接收新日志。

快照要包含最后索引和任期,以及业务去重等状态。生成期间应用仍可能变化,需要一致性机制避免状态与索引错位。传输快照也要校验完整性并支持断点恢复。

快照不是数据库备份的替代品。协议快照服务节点复制,灾难恢复还需要独立备份、版本兼容和恢复演练。

成员变更需要重叠多数

直接从旧配置切到新配置,两个配置可能各自形成不相交多数,产生双领导。Raft 使用联合一致阶段,让决定同时获得旧配置和新配置多数,再完成切换。

运维平台若绕过协议同时替换多个节点,会破坏假设。扩缩容、地址变化和证书轮换需要走实现支持的成员变更流程,并等待每一步提交。

偶数节点不会增加相对前一个奇数配置的故障容忍,可能增加仲裁成本。拓扑还应跨机架或可用区分布,避免多数副本位于同一故障域。

运维验证关注安全与活性两类结果

安全要求任何时刻都不应用冲突命令,活性要求具备稳定多数时最终能选出领导者并处理请求。压测吞吐无法证明安全,应注入崩溃、磁盘持久化失败、网络隔离和消息重排。

监控包括任期变化、选举次数、提交与应用差、跟随者复制滞后、快照和多数可达性。频繁选举通常意味着延迟、资源暂停或超时配置问题,而不只是“领导者不稳定”。

Raft 提供复制日志共识的清晰结构,但完整系统还需持久化、传输、状态机和客户端协议共同正确。协议名称不是一致性证明,具体实现的读写语义、配置变更和故障测试才决定对外保证。

资料依据