etcd 基础架构:Raft 共识、键值存储、Watch 与集群通信

etcd 是云原生架构中关键的分布式键值存储系统,其核心设计围绕 Raft 共识算法、键值存储模型、Watch 机制 以及 集群节点角色与通信 展开。理解这四大支柱,是构建高可用备份与蓝绿发布回滚策略的前提。

2.1 Raft 共识算法:分布式一致性的基石

Raft 是一种易于理解的分布式共识算法,etcd 使用它来保证集群中所有节点数据的一致性。Raft 将问题分解为三个子问题:领导者选举、日志复制 和 安全性。

  • 领导者选举:集群启动或当前领导者故障时,节点通过超时机制发起选举,获得多数派投票的节点成为新的领导者(Leader)。
  • 日志复制:所有写请求必须由 Leader 处理。Leader 将操作封装为日志条目,复制到所有跟随者(Follower)节点,当日志被多数节点持久化后,该条目才被视为已提交。
  • 安全性:Raft 通过任期号(Term)和日志索引保证只有拥有最新日志的节点才能成为 Leader,防止已提交的数据被覆盖。
关键指标:etcd 集群通常推荐 3 或 5 个节点,容忍 (N-1)/2 个节点故障。3 节点集群可容忍 1 个节点故障,5 节点集群可容忍 2 个节点故障。
Raft 共识算法核心流程 Raft 共识算法核心流程 1. 领导者选举 超时 → 投票 → 多数派获胜 2. 日志复制 Leader → Follower → 多数派确认 3. 安全性保证 任期号 + 日志索引校验 关键说明: • 所有写操作必须经过 Leader,读操作可从任何节点进行(默认从 Leader 读取以保证强一致性)。 • 日志条目按顺序复制,保证所有节点以相同顺序应用相同操作。 • 网络分区时,Raft 通过多数派原则保证只有拥有最新日志的分区才能继续提供服务。 • 备份策略应优先从 Follower 节点拉取快照,避免对 Leader 造成额外负载。

2.2 键值存储模型:有序的层级化数据

etcd 将数据组织为一个 扁平的键值空间,但支持 层级化键名(如 /service/backend/v1/config)。其核心特性包括:

  • 有序存储:所有键按字典序排列,支持范围查询和前缀扫描。
  • 版本化:每个键值对维护一个全局递增的修订号(Revision),用于实现 MVCC 和 Watch。
  • 租约(Lease):键可以绑定到租约,租约过期时所有关联键自动删除,常用于服务注册与心跳检测。
  • 事务(Txn):支持 if-then-else 事务,保证多个操作的原子性。
概念 说明 备份/发布场景
Key / Value 字节数组,最大 1.5 MB 存储蓝绿发布的应用配置、服务发现元数据
Revision 全局单调递增版本号 用于增量备份和 Watch 断点续传
Lease TTL 定时器,自动清理过期键 蓝绿发布中临时路由规则自动过期
Prefix 键前缀匹配,支持目录式查询 按服务名批量备份或回滚
备份要点:etcd 提供 etcdctl snapshot save 命令进行全量快照备份。增量备份可通过 Watch 机制从指定 Revision 开始持续捕获变更事件。

2.3 Watch 机制:事件驱动的实时变更捕获

Watch 是 etcd 实现 实时配置推送 和 服务发现 的核心机制。客户端可以向 etcd 注册对某个键或前缀的监听,当数据发生变化时,etcd 会推送事件通知。

  • 事件类型:PUT(创建/更新)、DELETE(删除)。
  • 流式推送:Watch 建立长连接,事件按顺序实时推送,支持断线重连和从指定 Revision 恢复。
  • WithPrefix:监听某个前缀下的所有键,适合监控整个服务目录。
  • WithProgressNotify:定期发送心跳通知,帮助客户端判断连接健康状态。
避坑指南:Watch 事件不保证幂等性,客户端需自行处理重复事件。在蓝绿发布回滚场景中,建议记录已应用的 Revision 号,避免重复执行回滚操作。
etcd Watch 机制与事件流 etcd Watch 机制与事件流 Watch 客户端 监听 /service/backend/ etcd 集群 Leader + Follower 注册 Watch PUT / DELETE 事件 事件推送示例: 1. 客户端注册 Watch: etcdctl watch /service/backend/ --rev=100 2. etcd 推送事件: {"type":"PUT","key":"/service/backend/v1/config","value":"blue","rev":101} 3. 客户端处理事件,更新本地缓存或触发回滚逻辑 4. 断线重连时,客户端使用最后处理的 Revision 重新注册,避免丢失事件

2.4 集群节点角色与通信

etcd 集群中的每个节点在 Raft 协议下扮演特定角色,节点间通过 gRPC 协议进行通信。

角色 职责 通信端口 备份/发布影响
Leader 处理所有写请求、日志复制、发送心跳 2379 (客户端), 2380 (集群) 备份应避免直接从 Leader 拉取快照,优先使用 Follower
Follower 接收并应用日志、处理读请求(可选)、参与选举 2379, 2380 适合作为备份源,降低 Leader 负载
Candidate 选举过程中的临时角色,发起投票请求 2380 选举期间集群不可写入,备份任务应避开选举窗口

节点间通信使用 gRPC 协议,主要交互包括:

  • 心跳(Heartbeat):Leader 定期向 Follower 发送心跳,维持领导地位。
  • 日志复制(AppendEntries):Leader 将日志条目发送给 Follower,Follower 确认后持久化。
  • 请求投票(RequestVote):Candidate 在选举时向其他节点发送投票请求。
  • 快照安装(Snapshot):当 Follower 日志落后太多时,Leader 发送快照帮助其快速追赶。
自动化流水线集成建议:在蓝绿发布流水线中,建议在发布前对 etcd 进行全量快照备份(从 Follower 节点执行),发布过程中通过 Watch 机制实时记录变更事件,回滚时根据快照和增量事件恢复到指定 Revision。