7.3 替代方案与云原生:etcd、Consul 与选型决策 本节摘要:etcd 用 Raft 加租约加监听在云原生栈接过协调衣钵,Consul 把注册发现与健康检查做成一等公民,ZooKeeper 自己也在演进(Multi-Read、Observer 扩展、KRaft 时代的外挂地位变化)。本节给三者的能力矩阵与场景判据,收束成一张选型决策清单。 先认对手,再谈选型 etcd 是 Kubernetes 的元数据底座,也是事实上的云原生协调标准。
本节摘要:etcd 用 Raft 加租约加监听在云原生栈接过协调衣钵,Consul 把注册发现与健康检查做成一等公民,ZooKeeper 自己也在演进(Multi-Read、Observer 扩展、KRaft 时代的外挂地位变化)。本节给三者的能力矩阵与场景判据,收束成一张选型决策清单。
etcd 是 Kubernetes 的元数据底座,也是事实上的云原生协调标准。与 ZooKeeper 同为 CP 强一致存储,差异在接口与生态:gRPC 加 JSON 的 API 对云原生工具链更友好,基于租约(lease)的自动过期与**基于版本号的流式监听(watch)**是其两大标志性设计——对照本册:租约就是临时节点加会话的合并体,watch 是 Watcher 的持续化版本(一次注册持续推送,且事件可带变更后数据,没有"只响一次"的坑)。
Consul 的定位更偏服务网格与多数据中心:注册发现、健康检查(主动探测而非仅靠会话)、键值存储、服务分割,自成一体。它的共识内核是 Raft,默认一致性模型里允许读的可用性权衡(三种读模式),与 ZooKeeper 的"读也拒绝"立场不同——7.1 节 Kafka 分手史里"弹性"的那份诉求,Consul 的设计里回应得更直接。
ZooKeeper 自身并未停步:Multi-Read 改进让读也能由 Follower 应答更从容,3.5 系列的动态重配置让扩缩节点不再整群重启,Container 节点补上了临时节点的孤儿清理。这些自救动作说明它仍在被认真维护——"老"不等于"该淘汰"。

实例一,中台部门的注册中心替换。现状:Dubbo 加 ZooKeeper,注册数据十万级 ZNode,扩容痛苦。判据应用:注册发现是主打需求、强一致写不频繁、团队要治理界面——Consul 或应用级注册改造后的 Dubbo 加 Nacos 都是合理去向;若只想减负不想换栈,7.2 节的应用级注册是性价比最高的第一步。结论:先治理粒度,再谈更换实现。
实例二,Kubernetes 平台团队的配置与锁服务。现状:新项目要在 K8s 上做分布式锁与配置下发。判据应用:生态契合是硬指标,etcd 的 watch 与 lease 原生贴合,且 K8s 集群本身已自带 etcd(但别直接用控制面的 etcd 存业务数据——它的容量与变更预算属于集群组件)。结论:业务用独立的 etcd 集群或托管服务,控制面 etcd 是禁区。
实例三,传统企业的定时调度平台。现状:自研调度器需要选主与成员管理,团队十年 Java 经验、运维工具链成熟。判据应用:强一致选主是 ZooKeeper 的舒适区,运维技能与第五章判例直接复用,换 etcd 反而要重学工具链。结论:ZooKeeper 仍是合理选择,年龄不是否决票。
走完全册,把最开始那个比喻收个尾。ZooKeeper 这座"共识法庭"的判决范围其实很窄——只有小数据、只有强一致、只有读过判例的人才懂得怎么与它打交道。但窄判决换来了不可替代的信用:十几年来,无数分布式系统把"谁说了算"这个问题放心地交给它。你的任务是两件事:读懂它的判例,让它只审它该审的案子。至于哪天要换法庭——理解了机制,换的只是房子,法律不变。
问:能不能既用 ZooKeeper 又做云原生改造? 可以渐进:容器化部署、Observer 扩读、namespace 隔离、客户端治理,本册 2.2、3.3、6.2 节的方法都适用;激进一步是让客户端走代理层屏蔽底层实现,为将来替换留出开关。
云厂商普遍提供托管协调服务(托管 ZooKeeper、etcd 集群、配置中心套件),账要算两笔。显性成本:托管实例的月费通常高于自建 ECS——但自建要加上监控、备份、升级、值班的人工摊销,三节点小集群的自建人力成本常常反超托管费。隐性成本:托管方案的版本与参数受限、跨可用区拓扑由厂商决定、遇到疑难需要提工单而非自己上机排查。团队没有专职中间件运维时,托管是理性默认;有运维储备且对版本敏感时,自建保留自由度。
把"要不要换"从感觉题变成清单题,八项逐条打分:
| 评估项 | 留守信号 | 迁移信号 |
|---|---|---|
| 生态绑定 | 依赖 Hadoop、Dubbo 老版本 | 纯云原生新栈 |
| 数据形态 | 元数据小而稳 | 高频大对象混入 |
| 写入规模 | 每秒千笔内 | 每秒万笔且持续增长 |
| 监听模式 | 已完成羊群治理 | 万级客户端盯单点 |
| 运维储备 | 有人懂四字命令与巡检 | 团队只熟云原生工具链 |
| 可用性要求 | 秒级换届可接受 | 分区期必须可读 |
| 迁移窗口 | 无 | 有停机窗口或双写期 |
| 合规约束 | 数据不出自建机房 | 允许托管服务 |
四票以上落在迁移侧才立项,且立项先做 7.1 节那份"渐进开关加双写"的路线图。多数项目的结论是第一行那个朴素判断:先治理自己的数据形态与客户端行为,协调层的更换往往可以无限期延后——因为治理之后,原来的方案已经够用了。
空有清单容易纸上谈兵,代入一个具体场景走一遍。假设你在一家电商公司,现状:Dubbo 2.7 加 ZooKeeper 三节点,注册 ZNode 约四万,团队五人无专职运维,公司整体在向 K8s 迁移。逐行过清单:生态绑定倾向留守(Dubbo 老版本);数据形态倾向留守(元数据小);写入规模留守(千笔内);监听模式存疑(未做过羊群治理,先治理再评估);运维储备留守(团队熟 ZK);可用性留守(秒级换届可接受);迁移窗口迁移侧(K8s 迁移提供天然窗口);合规留守。结论:七比一倾向留守,当务之急是 6.2 节的监听治理与 7.2 节的应用级注册改造,更换协调层暂不立项——但 K8s 迁移完成前,把 etcd 纳入下一轮评估。这份推演的形状就是多数团队的真实结论:评估先行,迁移缓行,治理立即。