当单集群单地域的容量、可用性与成本无法满足业务时,多集群(Multi-Cluster)与跨云(Cross-Cloud)架构成为必然选择。它不只是"多部署几份",而是要在网络、数据、流量、容灾与成本五个维度上重新设计。本文系统讲解多集群跨云架构的完整设计。
1. 为什么需要多集群与跨云
| 驱动力 | 单集群痛点 | 多集群/跨云收益 |
|---|---|---|
| 可用性 | 单集群故障 = 全站故障 | 集群级故障隔离 |
| 地域 | 用户距离远延迟高 | 就近接入降低延迟 |
| 合规 | 数据必须本地存储 | 按地域部署数据 |
| 成本 | 单云厂商锁定、价格高 | 多云比价、谈判筹码 |
| 容量 | 单集群配额上限 | 水平扩展容量 |
但跨集群/跨云也带来新的复杂度:网络互通、数据同步、流量一致性、运维分裂。核心是"三地一控":多地部署、单一控制平面统一管理。
2. 多集群网络
2.1 集群联邦(KubeFed)
KubeFed(Kubernetes Federation)让一个控制平面管理多个集群,核心概念是模板 + 放置策略 + 覆盖:
FederatedDeployment(模板)
├─ 放置策略:放到 cluster-a、cluster-b、cluster-c
└─ 覆盖:cluster-b 副本数为 3,cluster-c 副本数为 5
控制平面把模板渲染成分散到各集群的 Deployment
apiVersion: types.kubefed.io/v1beta1
kind: FederatedDeployment
metadata:
name: order-service
namespace: production
spec:
template:
spec:
replicas: 3
template:
spec:
containers:
- name: order
image: registry.example.com/order:v1.2.3
placement:
clusters:
- name: cluster-a
- name: cluster-b
overrides:
- clusterName: cluster-b
clusterOverrides:
- path: /spec/replicas
value: 6
2.2 服务网格跨集群
Istio 等服务网格提供跨集群的服务发现与流量路由。多集群 Istio 的常见形态:
- 主从模型(Primary-Remote):一个主集群的控制面管理多个远端集群
- 多主模型(Multi-Primary):每集群独立控制面,通过共享 CA 互信,流量网格化互达
- 多主+多网络:跨 VPC/跨云时每集群一个网络,通过东西向网关打通
cluster-a (主) cluster-b (远程)
┌────────────────────┐ ┌────────────────────┐
│ istiod (控制面) │───信任────►│ 无 istiod │
│ Envoy sidecar │ │ Envoy sidecar │
│ 服务 order-svc │◄───gRPC────│ 调用 order-svc │
│ 服务 pay-svc │ │ 服务 pay-svc │
└────────────────────┘ └────────────────────┘
多集群服务网格的虚拟服务可以跨集群路由流量,用于灰度与容灾:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: order-routing
spec:
hosts:
- order-svc.production.svc.cluster.local
http:
- route:
- destination:
host: order-svc.cluster-a
weight: 90
- destination:
host: order-svc.cluster-b
weight: 10
2.3 网络方案对比
| 方案 | 连通模型 | 延迟 | 复杂度 | 适用 |
|---|---|---|---|---|
| 集群联邦(KubeFed) | 只做部署分发,不解决服务互调 | 不涉及 | 中 | 部署多集群、配置统一 |
| 服务网格(多网络) | 东西向网关互连,服务透明互调 | 中(走网关) | 高 | 跨云微服务互调 |
| 扁平网络(Submariner) | 跨集群 Pod 直连 | 低 | 中 | 同云/同区域多集群 |
| VPN/专线 | 底层网络打通 | 低 | 低(网络侧) | 所有形态的基础 |
3. 跨云数据同步
3.1 单向同步与双向同步
| 模式 | 描述 | 适用 |
|---|---|---|
| 单向同步 | 主云 → 备云,备云只读 | 容灾、读扩展 |
| 双向同步 | 双云可写,冲突需处理 | 单元化、双活 |
| Hub-Spoke | 中心汇总分发 | 数据汇聚、归档 |
3.2 数据同步手段
数据库同步:
MySQL: 主从复制(跨专线) / binlog CDC(如 Canal、Debezium)→ 目标写入
PostgreSQL: logical replication / BDR
Redis: Redis Sentinel + 跨云 Proxy 同步 / 写主读从
对象存储/文件:
对象存储厂商复制 / 自建同步任务(事件驱动触发复制)
消息/事件:
Kafka MirrorMaker2 跨云复制 Topic
RocketMQ/其他 → 跨云桥接消费再投递
# Kafka MirrorMaker2 跨云复制示例
clusters:
source-cloud:
bootstrap.servers: source-cluster:9092
target-cloud:
bootstrap.servers: target-cluster:9092
source-cloud->target-cloud:
enabled: true
topics.replication.factor: 2
config:
replication.factor: 2
sync.group.offsets.enabled: false
emit.checkpoints.enabled: true
3.3 一致性与冲突解决
双向同步必然面临冲突。冲突解决策略:
| 策略 | 规则 | 风险 |
|---|---|---|
| 最后写入者胜(LWW) | 取时间戳/版本更大者 | 时钟偏移会错乱 |
| 版本向量 / CRDT | 每个副本独立演进,合并时求并 | 实现复杂 |
| 分片归属 | 按数据分片固定写入云,避免同一数据双写 | 需要流量路由配合 |
| 对账兜底 | 同步后对账,发现冲突挂起人工 | 需要 https://plumephp.com/distributed-data-consistency-reconciliation/ 支持 |
最佳实践:跨云双活的数据冲突,最好通过"分片归属 + 单向同步 + 对账“组合避免,而不是让业务代码处理复杂的双向冲突合并。
4. 流量调度
4.1 GSLB 与全局负载均衡
GSLB(Global Server Load Balancer)根据用户地理位置、集群健康状态、负载把流量调度到最近的可用集群:
用户 ──► DNS (GSLB)
├─ 就近解析:华东用户 → cluster-shanghai
├─ 健康探测:主集群故障 → 解析到备集群
└─ 负载均衡:多集群按权重/容量分配
# GSLB 配置抽象
cluster:
shanghai: { weight: 50, health: ok, region: cn-east }
singapore: { weight: 30, health: ok, region: ap-southeast }
frankfurt: { weight: 20, health: ok, region: eu-central }
policy:
geo: first-match # 优先就近
failover: active-standby
probing: every 30s (http /healthz)
4.2 流量调度层次
第 1 层:DNS/GSLB —— 按地域/健康选择集群
第 2 层:网关/负载均衡 —— 集群入口路由
第 3 层:服务网格 —— 服务级跨集群路由(灰度/容灾)
第 4 层:应用层 —— 分片归属路由(单元化)
4.3 流量切换与回切
容灾切换(failover)必须有可观测、可回滚的流程:
1. 健康状态异常 / 人工决策触发
2. GSLB 将流量切到备集群(DNS TTL 控制生效时间)
3. 数据层切换到备集群可写(promote)
4. 验证:切流后观察错误率、延迟、数据一致性
5. 回切:故障恢复后,先追平数据,再逐步回切(金丝雀式)
回切比切换更危险:主集群恢复后数据可能落后,必须先数据追平、再小流量验证、再全面回切,否则会二次故障。相关容灾指标可参考 https://plumephp.com/distributed-multi-site-dr/。
5. 容灾与成本
5.1 RTO/RPO 设计
| 容灾级别 | RTO | RPO | 手段 |
|---|---|---|---|
| 同城双活 | 分钟级 | 秒级 | 同城专线 + 同步复制 |
| 两地三中心 | 分钟级 | 秒~分钟级 | 跨地域异步复制 + 快速切换 |
| 跨云容灾 | 分钟~小时级 | 分钟级 | 跨云同步 + GSLB 切换 |
| 备份恢复 | 小时~天级 | 天级 | 定期备份 + 恢复演练 |
5.2 成本模型
跨云的成本往往被低估,规划时必须算清:
| 成本项 | 说明 | 优化手段 |
|---|---|---|
| 出口流量(Egress) | 跨云/跨地域数据传输按量计费,常是大头 | 压缩、增量同步、就近存储 |
| 数据复制存储 | 多副本多地域存储费用翻倍 | 冷热分层、只冗余关键数据 |
| 专线/网络 | 跨云专线月租 | 同区域多云优先、VPN 兜底 |
| 运维分裂 | 双云工具链、权限、监控割裂 | 统一 IaC 与可观测平台 |
| 人力成本 | 多集群运维复杂度上升 | 平台化、SRE 自动化 |
5.3 成本优化实践
- 只对关键链路做跨云:非核心服务保留单云,避免全量双份
- 冷数据集中:历史数据放对象存储并只存一份(或低频冗余)
- 按地域差异化:低延迟要求不高的地域少部署副本
- 数据压缩 + 增量:同步前先压缩,尽量只传增量而非全量
6. 架构模式与实践
6.1 三种主流模式
| 模式 | 描述 | 数据策略 | 适用 |
|---|---|---|---|
| Active-Active(双活) | 多集群同时服务,单元化分流 | 分片归属 + 双向/单向同步 | 高可用 + 容量扩展 |
| Active-Passive(主备) | 主集群服务,备集群待命 | 单向同步 | 容灾为主 |
| Hub-Spoke(中心-分支) | 中心集群统筹,分支集群本地化 | 中心汇总 + 分支同步 | 全球化数据合规 |
6.2 跨云业务系统部署示例
┌─────────── GSLB/DNS ───────────┐
│ 就近接入 + 健康切换 │
▼ ▼
┌─── 云 A(上海)───┐ ┌─── 云 B(新加坡)───┐
│ 入口网关 │ │ 入口网关 │
│ order-svc (分片1) │ │ order-svc (分片2) │
│ 本地 MySQL 主 │ │ 本地 MySQL 主 │
│ Redis 集群 │ │ Redis 集群 │
│ Kafka 实例A │ │ Kafka 实例B │
└─────┬─────────────┘ └─────┬─────────────┘
│ binlog CDC 单向同步 │
└──────────┬───────────────┬───────┘
▼ ▼
┌── 中心数据仓库 / 对账平台 ──┐
│ 汇聚两份数据 + 对账验证 │
└────────────────────────────┘
6.3 关键原则与常见坑
- 控制面统一、数据面隔离:用一个平台管理多集群,但数据必须按地域隔离
- 不要全量双向同步:双向同步的冲突成本极高,优先分片归属 + 单向
- 网络先于应用:跨云先打通网络与 DNS,再谈服务互调
- 容灾必须演练:跨云切换不演练等于没有,定期 GameDay
- 对账必配:跨云复制/同步链路多,没有 https://plumephp.com/distributed-data-consistency-reconciliation/ 兜底难以发现静默丢数据
总结
| 维度 | 核心设计 | 关键工具/方案 |
|---|---|---|
| 多集群网络 | 联邦部署、网格互调、扁平网络 | KubeFed / Istio / Submariner |
| 跨云数据同步 | 单向优先、分片归属、冲突最小化 | CDC / MirrorMaker2 / 对账 |
| 流量调度 | GSLB 就近 + 健康切换 + 服务级路由 | DNS/GSLB / 网关 / 服务网格 |
| 容灾 | RTO/RPO 分级、可回滚切换 | 双活/主备/单元化 |
| 成本 | Egress、冗余存储、运维分裂 | 关键链路冗余 + 压缩增量 |
多集群与跨云是分布式系统在规模与合规压力下的必然演进,它的本质是”通过架构冗余换取可用性,通过统一平台消化复杂度"。与 https://plumephp.com/distributed-multi-site-dr/ 的容灾设计配合阅读,可形成完整的多云高可用视角。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。