1. Federation 架构概述

1.1 etcd Federation 概念

etcd Federation(联邦)是一种将多个独立 etcd 集群通过逻辑层连接起来,形成统一命名空间与数据视图的分布式架构模式。它并非将多个集群合并为一个更大的 Raft 组,而是在每个集群保持独立 Raft 共识与故障域的前提下,通过跨集群复制机制实现数据的最终一致或强一致同步。

核心设计原则:每个参与联邦的 etcd 集群仍然是一个独立的 Raft 组,拥有自己的 Leader、Follower 和投票节点。联邦层只负责在集群之间转发写入请求或同步变更事件,不参与底层 Raft 日志复制。

Federation 通常用于以下场景:

  • 跨地域部署:业务需要多个数据中心共享同一套配置或服务发现数据。
  • 故障隔离:单个集群故障不影响其他集群的可用性,联邦层可自动切换写入目标。
  • 读写分离:本地集群处理本地读请求,联邦层将写请求广播到所有集群。
  • 渐进式迁移:在集群升级或扩缩容期间,通过联邦逐步切换流量。

1.2 跨数据中心复制模型

etcd Federation 支持多种跨数据中心复制模型,不同模型在一致性、延迟和吞吐量上存在显著差异。下表对比了三种主流复制模型:

复制模型 一致性级别 写入延迟 典型场景
异步复制 最终一致 低(本地写入即返回) 配置分发、缓存预热
同步复制 强一致 高(等待所有集群确认) 金融交易、全局锁
半同步复制 多数一致 中(等待多数集群确认) 服务发现、元数据管理
实践建议:在压测沙盘环境中,建议先使用异步复制模型进行基准测试,再逐步切换为半同步或同步模型,以量化不同复制模型对吞吐量和延迟的影响。

跨数据中心复制的核心流程通常包含以下步骤:

  1. 本地写入:客户端向本地 etcd 集群发起写入请求,本地集群完成 Raft 提交。
  2. 变更捕获:联邦代理(Federation Proxy)通过 Watch API 或 gRPC 流捕获本地集群的键值变更事件。
  3. 事件转发:联邦代理将变更事件序列化为 protobuf 消息,通过跨数据中心网络发送到其他集群的联邦代理。
  4. 远程写入:目标集群的联邦代理将接收到的变更事件以 etcd 客户端身份写入本地集群。
  5. 冲突处理:若发生并发写入冲突,根据复制模型选择策略(如最后写入者胜出、版本号比较等)进行合并。
跨数据中心复制流程(异步模型) 数据中心 A etcd 集群 A 联邦代理 A Watch 变更流 客户端 → 本地写入 数据中心 B etcd 集群 B 联邦代理 B 远程写入 事件 → 本地提交 protobuf 事件流 异步模型:本地写入成功后立即返回客户端,联邦代理异步转发变更到其他数据中心

1.3 Federation vs 单集群对比

在选择使用单 etcd 集群还是 Federation 架构时,需要从多个维度进行权衡。下表从关键特性出发,对比两种架构的差异:

对比维度 单 etcd 集群 etcd Federation
故障域 单故障域(集群内节点故障可容忍) 多故障域(每个集群独立,跨集群故障隔离)
跨地域延迟 高(所有节点需跨地域通信参与 Raft) 低(本地集群处理本地读写,跨地域仅同步变更)
写入吞吐 受限于单集群 Raft 提交速率(通常 10K-50K ops) 可线性扩展(每个集群独立处理写入,联邦层聚合)
一致性模型 强一致(Raft 线性一致性) 可配置(最终一致 / 强一致 / 多数一致)
运维复杂度 低(单集群管理) 高(多集群 + 联邦代理 + 网络策略)
数据冲突风险 无(Raft 保证全局有序) 有(并发写入需冲突解决策略)
典型节点数 3 / 5 / 7 节点 每个集群 3 节点,联邦层 2-5 个集群
关键权衡:Federation 架构虽然提供了更好的跨地域可用性和扩展性,但引入了数据冲突、网络分区和运维复杂度。在压测沙盘环境中,建议先模拟单集群基准性能,再对比 Federation 模式下的吞吐衰减和延迟增加,从而量化架构切换的代价。
单集群 vs Federation 架构对比 单 etcd 集群 Leader Follower 1 Follower 2 Raft 组 强一致 单故障域 跨地域延迟高 所有节点必须跨地域参与 Raft 投票 写入吞吐受限于单集群提交速率 etcd Federation 集群 A(DC1) 集群 B(DC2) 集群 C(DC3) 联邦层 异步/同步复制 多故障域 本地读写低延迟 每个集群独立 Raft 组,本地提交 联邦层负责跨集群事件同步 Federation 通过牺牲一致性灵活性换取跨地域可用性和写入吞吐的线性扩展