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 个节点故障。
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 号,避免重复执行回滚操作。
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。