PXC 集群如何无停机启用 TLS 加密

2026-09-10 32 预计阅读时间: 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.

预计阅读时间:8 分钟

从 Percona XtraDB Cluster(PXC)8.0 开始,复制流量默认启用加密。但在实际环境中,仍然有不少集群是在未启用 TLS 的状态下运行,直到合规要求、审计发现或网络信任边界变化,才需要补上这层保护。

这类变更的关键不只是“打开一个开关”,而是要让节点逐个切换,同时保持业务连接和集群仲裁能力正常。PXC 提供的 pxc-encrypt-cluster-traffic 变量正是为这种场景准备的。

先确认集群当前状态

TLS 变更前,先确认集群没有处于降级状态。至少需要检查节点是否都处于 Synced,并记录当前节点数量、主节点状态以及业务连接情况。

可以在每个节点上执行:

SHOW STATUS LIKE 'wsrep_cluster_status';
SHOW STATUS LIKE 'wsrep_local_state_comment';
SHOW STATUS LIKE 'wsrep_cluster_size';
SHOW VARIABLES LIKE 'pxc%encrypt%';

理想情况下,应该看到:

  • wsrep_cluster_statusPrimary
  • wsrep_local_state_commentSynced
  • wsrep_cluster_size 与预期节点数一致
  • 当前加密变量的状态已经被记录

如果节点处于 DonorJoiningDesynced 或非 Primary 状态,不建议立即进行安全配置变更。先处理集群健康问题,避免把 TLS 切换和节点恢复叠加在一起。

用滚动方式开启加密

pxc-encrypt-cluster-traffic 控制 PXC 节点之间复制流量的加密。实际执行时,应按照一次一个节点的方式推进,并在每一步确认节点重新加入集群且状态恢复为 Synced

下面是一个可改造的操作示例。示例假设使用具有管理权限的 MySQL 账号,并且通过本地 Unix socket 连接;远程执行时可以补充 -h-P 和认证参数。

#!/usr/bin/env bash
set -euo pipefail

MYSQL=(mysql --batch --skip-column-names)

for node in db01 db02 db03; do
  echo "Checking ${node} before TLS change"
  ssh "${node}" "mysql -e \"SHOW STATUS LIKE 'wsrep_local_state_comment'; SHOW STATUS LIKE 'wsrep_cluster_status'; SHOW STATUS LIKE 'wsrep_cluster_size';\""

  echo "Enabling encrypted cluster traffic on ${node}"
  ssh "${node}" "mysql -e \"SET GLOBAL pxc_encrypt_cluster_traffic = ON;\""

  echo "Waiting for ${node} to become Synced"
  until ssh "${node}" "mysql --batch --skip-column-names -e \"SHOW STATUS LIKE 'wsrep_local_state_comment';\"" | grep -q $'wsrep_local_state_comment\tSynced'; do
    sleep 5
  done

done

实际运行前需要根据环境调整以下内容:

  • 节点主机名和滚动顺序
  • SSH 用户、密钥和跳板机配置
  • MySQL 客户端认证方式
  • 健康检查超时时间
  • 连接池和负载均衡器的摘除、恢复逻辑

变量名称在配置文件中通常使用连字符形式:

[mysqld]
pxc-encrypt-cluster-traffic=ON

运行时 SQL 变量通常使用下划线形式:

SET GLOBAL pxc_encrypt_cluster_traffic = ON;

不同 PXC 小版本和发行包的可用性可能存在差异。执行变更前,应在目标版本上使用 SHOW VARIABLES 确认变量名称、当前值以及是否支持动态修改。

为什么滚动变更可以保持业务在线

PXC 的高可用能力来自多个节点共同提供服务。滚动启用 TLS 时,应该把当前操作节点从连接池或负载均衡器中暂时摘除,然后修改配置,等待节点完成连接重建和状态同步,再将它放回流量池。

一个更完整的生产流程通常如下:

  1. 从负载均衡器摘除一个节点。
  2. 确认该节点没有承载必须保持的长连接或管理任务。
  3. 修改 pxc-encrypt-cluster-traffic,必要时同步持久化配置。
  4. 等待节点重新建立集群通信并回到 Synced
  5. 检查集群规模仍然符合预期。
  6. 将节点重新加入负载均衡器。
  7. 观察错误率、事务延迟和连接重试情况,再处理下一个节点。

不要同时在多个节点上执行切换。即使业务连接仍然存在,并行修改也会增加节点同时离开组件、复制中断或需要重新进行状态传输的风险。

验证结果与处理边界

完成所有节点的切换后,重新执行状态检查,并保存变更前后的结果:

SHOW VARIABLES LIKE 'pxc_encrypt_cluster_traffic';
SHOW STATUS LIKE 'wsrep_cluster_status';
SHOW STATUS LIKE 'wsrep_cluster_size';
SHOW STATUS LIKE 'wsrep_local_state_comment';

还应从监控系统确认:

  • 集群节点数没有减少
  • 所有节点最终回到 Synced
  • 应用连接没有持续重试或大量失败
  • 事务提交延迟没有异常升高
  • 错误日志中没有持续出现 TLS、认证或集群通信错误

TLS 只保护节点之间的复制通信。它不会自动替代客户端到数据库的 TLS,也不会解决账号权限、证书生命周期、密钥保护或网络访问控制问题。若合规要求覆盖应用连接,还需要单独检查客户端连接参数和服务端证书配置。

上线前检查清单

  • 在与生产环境相同的 PXC 版本上完成演练。
  • 确认 pxc-encrypt-cluster-traffic 的运行时和持久化配置形式。
  • 预先验证证书、密钥和文件权限,若该版本或部署方式要求这些材料。
  • 准备节点摘除和恢复流量的操作。
  • 一次只处理一个节点。
  • 每一步都等待节点回到 Synced
  • 记录集群规模、状态、延迟和错误日志。
  • 为异常情况准备回滚窗口和人工升级路径。

把 TLS 启用看作一次受控的集群滚动变更,而不是一次批量配置推送,通常就能在满足新的安全要求的同时,把业务影响控制在很小范围内。


相关推荐