从 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_status为Primarywsrep_local_state_comment为Syncedwsrep_cluster_size与预期节点数一致- 当前加密变量的状态已经被记录
如果节点处于 Donor、Joining、Desynced 或非 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 时,应该把当前操作节点从连接池或负载均衡器中暂时摘除,然后修改配置,等待节点完成连接重建和状态同步,再将它放回流量池。
一个更完整的生产流程通常如下:
- 从负载均衡器摘除一个节点。
- 确认该节点没有承载必须保持的长连接或管理任务。
- 修改
pxc-encrypt-cluster-traffic,必要时同步持久化配置。 - 等待节点重新建立集群通信并回到
Synced。 - 检查集群规模仍然符合预期。
- 将节点重新加入负载均衡器。
- 观察错误率、事务延迟和连接重试情况,再处理下一个节点。
不要同时在多个节点上执行切换。即使业务连接仍然存在,并行修改也会增加节点同时离开组件、复制中断或需要重新进行状态传输的风险。
验证结果与处理边界
完成所有节点的切换后,重新执行状态检查,并保存变更前后的结果:
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 启用看作一次受控的集群滚动变更,而不是一次批量配置推送,通常就能在满足新的安全要求的同时,把业务影响控制在很小范围内。