2. etcd 基础架构:Raft 共识算法原理、etcd 集群节点角色、Leader 选举与租约机制

2.1 Raft 共识算法核心原理

etcd 使用 Raft 共识算法来保证分布式系统中的数据一致性和高可用性。Raft 将共识问题分解为三个相对独立的子问题:Leader 选举、日志复制和安全性。其核心思想是通过一个强 Leader 来协调所有节点的日志写入,确保集群中超过半数节点(Quorum)确认后,数据才被视为已提交。

关键概念: Raft 保证在任意时刻,集群中最多只有一个有效的 Leader。所有写请求必须经过 Leader,Leader 将日志条目复制到 Follower 节点,当大多数节点(N/2 + 1)确认写入后,该条目才被提交并应用到状态机。

Raft 的日志复制流程可概括为以下步骤:

  1. 客户端请求:客户端将写请求发送给 Leader。
  2. 追加日志:Leader 将请求封装为日志条目,追加到本地日志中。
  3. 并行复制:Leader 通过 AppendEntries RPC 并行将日志条目发送给所有 Follower。
  4. 确认响应:Follower 收到日志后写入本地,并返回成功响应。
  5. 提交执行:Leader 收到大多数节点的成功响应后,将日志条目标记为已提交,并应用到状态机。
  6. 通知客户端:Leader 将执行结果返回给客户端。
Raft 日志复制流程 Raft 日志复制流程 客户端 Leader Follower 1 Follower 2 ① 写请求 ② AppendEntries ② AppendEntries ③ 确认 ③ 确认 ④ 返回结果 关键说明 • 日志条目在 Leader 本地标记为“未提交”,直到收到大多数 Follower 的确认。 • 只有已提交的日志条目才会被应用到状态机,并返回给客户端。 • 如果 Follower 日志落后,Leader 会通过日志匹配机制强制同步。

2.2 etcd 集群节点角色

在 etcd 集群中,每个节点在任意时刻都处于以下三种角色之一:

角色 职责 状态 关键行为
Leader 处理所有客户端请求,管理日志复制 活跃 定期发送心跳(Heartbeat)给 Follower;处理写请求;提交日志
Follower 被动复制日志,响应 Leader 的 RPC 被动 接收并存储日志;投票给 Candidate;如果超时未收到心跳,转为 Candidate
Candidate 发起 Leader 选举 过渡 增加任期号(Term);请求其他节点投票;获得多数票后成为 Leader
运维提示: 在 etcd 集群中,Follower 节点不直接处理写请求。如果客户端将写请求发送到 Follower,Follower 会将请求重定向到当前 Leader。因此,客户端应优先连接 Leader 节点以获得最佳写入性能。

2.3 Leader 选举机制

Leader 选举是 Raft 协议中保证集群可用性的关键机制。当 Leader 宕机或网络分区导致 Follower 无法收到心跳时,集群会触发新一轮选举。

选举过程遵循以下步骤:

  • 触发条件:Follower 在 选举超时时间(Election Timeout,默认 1000ms)内未收到 Leader 的心跳,则转为 Candidate。
  • 发起选举:Candidate 增加自己的任期号(Term),并向所有节点发送 RequestVote RPC。
  • 投票规则:每个节点在一个任期内只能投一票,且优先投票给日志更新、任期更大的 Candidate。
  • 胜出条件:Candidate 获得超过半数(N/2 + 1)的投票后,成为新的 Leader。
  • 心跳稳定:新 Leader 立即开始发送心跳给所有节点,重置选举超时计时器,稳定集群状态。
注意: 如果多个节点同时成为 Candidate,可能导致选票分散,无法产生多数票。此时会触发新一轮选举,直到某个 Candidate 获得多数票。频繁的选举失败会降低集群可用性,因此应合理配置选举超时时间,避免网络抖动引发不必要的选举。
Leader 选举状态转换 Leader 选举状态转换 Follower Candidate Leader 选举超时 获得多数票 Leader 宕机或网络分区 选举失败或收到更高任期 选举超时时间通常为 500ms ~ 1500ms,建议配置为心跳间隔的 5~10 倍 以避免网络抖动导致的频繁选举。

2.4 租约机制(Lease)

etcd 的 租约(Lease) 是一种轻量级的分布式锁和心跳保活机制。租约允许客户端为 key 绑定一个 TTL(Time-To-Live),在租约有效期内,客户端可以通过续约(KeepAlive)保持 key 的存活;如果租约过期且未续约,etcd 会自动删除所有与该租约关联的 key。

租约机制在以下场景中非常有用:

  • 分布式锁:客户端创建租约并关联锁 key,锁的持有者通过定期续约防止锁超时释放。
  • 服务注册与发现:服务实例将自身信息写入 etcd 并绑定租约,实例下线后租约过期,服务自动注销。
  • Leader 选举:在 etcd 之上实现应用层 Leader 选举时,租约用于控制 Leader 的有效期。
租约操作 API 接口 说明
创建租约 LeaseGrant 指定 TTL(秒),返回租约 ID
续约 LeaseKeepAlive 客户端定期调用,重置租约 TTL
关联 key Put 时指定租约 ID 将 key 与租约绑定,租约过期时 key 自动删除
查询租约 LeaseTimeToLive 查看租约剩余 TTL 和关联的 key 列表
撤销租约 LeaseRevoke 主动删除租约,同时删除所有关联 key
性能优化建议: 在压测场景中,大量短 TTL 租约的频繁创建和续约会增加 etcd 的写入负载。建议将租约 TTL 设置为合理范围(如 10~60 秒),并复用租约 ID 来减少 LeaseGrant 调用次数。同时,注意监控 etcd_server_lease_expired_total 指标,避免租约过期风暴。

2.5 小结

本章介绍了 etcd 基础架构的核心组件:Raft 共识算法保证了数据一致性,节点角色(Leader、Follower、Candidate)定义了集群的行为模式,Leader 选举机制确保了高可用性,而租约机制则为分布式协调提供了灵活的超时控制。理解这些基础原理是后续优化 Federation 调度参数的前提。