用 Percona PS MySQL Operator 构建跨数据中心 DC-DR 架构

2026-09-17 23 预计阅读时间: 1 分钟
来源: percona.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:9 分钟

单个 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,还必须把网络、备份、流量切换和恢复演练一起纳入设计。


相关推荐