单个 Kubernetes 集群内的 Group Replication 可以提供高可用,但它并不能自动解决数据中心级故障问题:整套网络、机房或 Kubernetes 控制面不可用时,副本如果也位于同一站点,就无法承担灾备职责。
Percona (PS MySQL) Operator v1.2.0 引入了跨站点复制能力,使基于 Group Replication/InnoDB Cluster 的部署可以从单个 DC 集群扩展为 DC-DR 拓扑。主数据中心继续承载业务流量,灾备数据中心保留一个可接管的 MySQL 集群。
从单集群扩展到 DC-DR
在单个站点内,Group Replication 主要解决成员故障和实例级高可用。DC-DR 方案需要额外处理三个问题:
- 复制边界:哪些节点属于主集群,哪些节点属于灾备集群。
- 故障切换:灾备集群何时从只读或待命状态转为业务入口。
- 网络与身份:跨站点连接、DNS、证书、账号和防火墙策略是否稳定。
可以把整体拓扑理解为两个逻辑层次:
Primary DC
└── PS MySQL Cluster A
├── MySQL member
├── MySQL member
└── MySQL member
│
│ cross-site replication
▼
DR DC
└── PS MySQL Cluster B
├── MySQL member
├── MySQL member
└── MySQL member
主集群内部使用 Group Replication 保持成员间的一致性,两个集群之间则通过 Operator 支持的跨站点复制机制同步数据。这样,站点级灾难不会直接摧毁唯一的数据副本。
需要注意的是,跨站点复制并不等于跨站点强一致。跨 DC 的延迟、丢包和网络分区都会影响复制进度,实际 RPO 取决于复制延迟和故障发生时尚未传输的数据。
部署前先确认几个边界
1. 两个集群不是两个普通副本
灾备集群通常不应该与主集群同时接收写入。双向写入会引入冲突、写入顺序不一致以及切换后数据合并等问题。除非架构明确支持多主写入,否则应采用单写入站点模型。
2. 跨站点网络是复制链路的一部分
在创建 DR 集群前,需要验证以下连接条件:
- 两个 Kubernetes 集群之间可以访问 MySQL 复制所需端口。
- 网络策略、防火墙和云安全组允许跨站点流量。
- 两侧可以正确解析对方的服务地址。
- TLS 证书、复制账号和密钥在灾备侧可用。
- 网络中断后,恢复连接不会导致人工难以判断的双主状态。
3. 切换流程必须独立于 Operator
Operator 负责协调 Kubernetes 资源和数据库组件,但业务流量如何从主站点切到灾备站点,通常还需要 DNS、全局负载均衡、服务发现或人工变更流程配合。
一次完整的故障切换至少应包含:停止或隔离主站点写入、确认 DR 集群复制状态、提升 DR 集群、切换业务入口,以及验证应用读写。
一个可改造的检查流程
下面的命令展示了部署和演练时可以采用的基本检查方式。资源名称和 CRD 字段需要根据实际 Operator 版本及集群清单调整;先用 kubectl explain 查看当前版本支持的字段。
# 设置两个 Kubernetes 集群的上下文名称
PRIMARY_CTX=dc-primary
DR_CTX=dc-dr
NAMESPACE=database
# 确认两个集群的 Operator 和数据库资源状态
kubectl --context "$PRIMARY_CTX" -n "$NAMESPACE" get pods
kubectl --context "$PRIMARY_CTX" -n "$NAMESPACE" get ps
kubectl --context "$DR_CTX" -n "$NAMESPACE" get pods
kubectl --context "$DR_CTX" -n "$NAMESPACE" get ps
# 查看当前安装的 CRD 字段,避免直接套用其他版本的 manifest
kubectl --context "$PRIMARY_CTX" explain perconaservermysql.spec --recursive | less
# 在切换前记录两个站点的资源状态和事件
kubectl --context "$PRIMARY_CTX" -n "$NAMESPACE" get events --sort-by=.lastTimestamp
kubectl --context "$DR_CTX" -n "$NAMESPACE" get events --sort-by=.lastTimestamp
# 演练期间确认 Operator 日志中是否出现复制或协调错误
kubectl --context "$DR_CTX" -n "$NAMESPACE" logs \\
-l app.kubernetes.io/name=percona-server-mysql-operator \\
--since=30m
一个用于评审的拓扑配置可以先写成如下形式。它强调了设计意图,具体的资源名称、连接信息和跨站点复制字段必须以 v1.2.0 对应 CRD 为准:
# 这是评审用的拓扑模板;请用 kubectl explain 校验字段后再应用
apiVersion: psmdb.percona.com/v1 # 示例占位,按已安装 CRD 调整
kind: PerconaServerMySQL
metadata:
name: mysql-dr
namespace: database
spec:
# 主站点和灾备站点应使用不同的 Kubernetes 集群
clusterName: dc-dr
size: 3
repl:
enabled: true
sourceCluster: mysql-primary
mode: cross-site
# 生产环境中补充 TLS、资源、存储和备份配置
这段 YAML 不应被视为所有版本通用的最终清单。关键实践是把主集群标识、DR 集群标识、复制方向和切换模式纳入配置评审,并在应用前让 API Server 验证字段:
kubectl --context "$DR_CTX" apply --dry-run=server -f dr-cluster.yaml
如果当前 CRD 不接受某个字段,应以 Operator v1.2.0 的安装清单和文档为准修改,而不是绕过校验强行部署。
备份、复制和恢复不是一回事
跨站点复制可以降低灾备集群的数据追赶时间,但它不能替代独立备份。误删表、错误发布或应用批量写错数据,都可能被复制到 DR 集群。
建议同时保留:
- 定期的物理或逻辑备份,并将备份保存到独立于两个 Kubernetes 集群的存储位置。
- 复制延迟、成员状态、网络连接和磁盘容量监控。
- 明确的 RPO/RTO 指标,而不是只记录“有一个备用集群”。
- 定期的恢复测试,包括从备份恢复和从 DR 集群接管两种路径。
恢复演练要记录实际结果,例如复制延迟是多少、业务入口切换用了多久、应用是否需要重新建立连接,以及切回主站点是否会产生额外风险。
落地清单
上线前可以逐项确认:
- 两个站点的 Kubernetes 版本、Operator 版本和 CRD schema 已核对。
- 主集群与 DR 集群的复制方向明确,默认只有一个写入站点。
- 跨站点 DNS、网络策略、防火墙和 TLS 证书已经过真实连接测试。
- 监控能发现复制停止、延迟增长、成员离群和存储不足。
- 备份位于独立故障域,并完成过可验证的恢复。
- 故障切换、回切和数据一致性检查都有可执行的 runbook。
- 应用团队知道切换期间的连接重试、缓存失效和写入暂停策略。
Percona PS MySQL Operator v1.2.0 的跨站点复制能力,真正的价值不只是再增加一个 MySQL 集群,而是让 Group Replication/InnoDB Cluster 的高可用边界从单站点延伸到站点级灾备。要把能力变成可靠的 DC-DR,还必须把网络、备份、流量切换和恢复演练一起纳入设计。