MariaDB 在 2025 年 12 月 1 日宣布,MySQL 版本的 Galera Cluster 将于 2026 年 9 月 30 日结束生命周期。此后,该版本不再获得维护和二进制发布,新的集群能力也只会进入 MariaDB Galera Cluster。对于不准备迁移到 MariaDB Server 的团队,Percona XtraDB Cluster(PXC)提供了另一条基于 Galera 同步复制机制的路线。
虽然两者都使用 wsrep 接口,但不要把迁移理解成简单替换软件包。服务器发行版、系统表、认证插件、默认 SQL 模式、状态传输方式和运维工具都可能不同。更稳妥的做法是建立一套独立 PXC 集群,验证数据和业务,再执行受控切换。
先确认迁移边界
迁移前应冻结数据库版本和目标拓扑。例如,记录源端 MySQL Galera 的准确版本、Galera Provider 版本、节点数量、数据规模、最大表、字符集以及应用使用的认证插件。
可以在每个源节点执行下面的检查:
mysql -NBe "SELECT VERSION();"
mysql -NBe "SHOW VARIABLES LIKE 'wsrep_provider_version';"
mysql -NBe "SHOW VARIABLES LIKE 'wsrep_cluster_name';"
mysql -NBe "SHOW VARIABLES LIKE 'wsrep_cluster_size';"
mysql -NBe "SHOW VARIABLES LIKE 'wsrep_local_state_comment';"
mysql -NBe "SHOW VARIABLES LIKE 'default_authentication_plugin';"
mysql -NBe "SELECT @@sql_mode, @@character_set_server, @@collation_server;"
开始导出前,集群至少应满足:
wsrep_cluster_size等于预期节点数。- 各节点的
wsrep_local_state_comment为Synced。 - 没有持续增长的接收队列、流控或节点反复离群现象。
- 已明确停机窗口、DNS 或代理切换方式以及回滚负责人。
- 已在预生产环境验证目标 PXC 版本与应用驱动、备份工具和监控系统的兼容性。
PXC 与源集群共享 Galera 概念,并不意味着跨发行版节点可以安全地组成一个临时混合集群。除非目标版本的官方兼容矩阵明确支持这种操作,否则不要让 PXC 节点直接加入现有 MySQL Galera 集群。
建立独立的 PXC 集群
下面是一份可以改造的最小配置示例。假设准备三台主机 pxc1、pxc2、pxc3,地址分别为 10.20.0.11、10.20.0.12、10.20.0.13。实际参数名和文件位置需要按所选 PXC 大版本核对。
[mysqld]
server-id=101
bind-address=0.0.0.0
wsrep_on=ON
wsrep_provider=/usr/lib64/galera4/libgalera_smm.so
wsrep_cluster_name=orders-pxc
wsrep_cluster_address=gcomm://10.20.0.11,10.20.0.12,10.20.0.13
wsrep_node_name=pxc1
wsrep_node_address=10.20.0.11
wsrep_sst_method=xtrabackup-v2
pxc_strict_mode=ENFORCING
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
在另外两个节点上修改 server-id、wsrep_node_name 和 wsrep_node_address。开放 Galera 常用的复制、IST、SST 和数据库端口时,应只允许集群节点及受控客户端访问:
sudo firewall-cmd --permanent --add-port=3306/tcp
sudo firewall-cmd --permanent --add-port=4444/tcp
sudo firewall-cmd --permanent --add-port=4567/tcp
sudo firewall-cmd --permanent --add-port=4567/udp
sudo firewall-cmd --permanent --add-port=4568/tcp
sudo firewall-cmd --reload
具体的安装、引导命令取决于操作系统和 PXC 软件包。关键顺序是:只引导第一个节点形成 Primary Component,确认其状态正常,再逐个启动其余节点。不要同时把三个空节点都当作首节点引导。
集群建立后,用 SQL 验证成员关系:
mysql -NBe "SHOW STATUS LIKE 'wsrep_cluster_status';"
mysql -NBe "SHOW STATUS LIKE 'wsrep_cluster_size';"
mysql -NBe "SHOW STATUS LIKE 'wsrep_local_state_comment';"
mysql -NBe "SHOW STATUS LIKE 'wsrep_ready';"
预期结果应包含 Primary、节点数 3、Synced 和 ON。
用逻辑迁移降低发行版耦合
如果数据量允许停机窗口内完成导出和导入,可以这样实践:停写源集群,使用逻辑备份迁移业务库,再单独重建账户和权限。逻辑迁移速度通常不如物理拷贝,但不会把源端系统表和发行版内部状态直接带入 PXC。
下面的脚本会导出除系统库之外的所有业务数据库。运行前修改连接地址和输出目录,并通过 MYSQL_PWD、客户端配置文件或密钥系统提供凭据。
#!/usr/bin/env bash
set -euo pipefail
SOURCE_HOST=${SOURCE_HOST:-10.10.0.11}
BACKUP_DIR=${BACKUP_DIR:-./galera-export}
mkdir -p "$BACKUP_DIR"
mapfile -t databases < <(
mysql -h "$SOURCE_HOST" -NBe \
"SELECT schema_name FROM information_schema.schemata
WHERE schema_name NOT IN
('mysql','information_schema','performance_schema','sys')"
)
for db in "${databases[@]}"; do
echo "Exporting ${db}"
mysqldump -h "$SOURCE_HOST" \
--single-transaction \
--quick \
--routines \
--events \
--triggers \
--hex-blob \
--set-gtid-purged=OFF \
--databases "$db" | gzip -1 > "$BACKUP_DIR/$db.sql.gz"
done
在进入最终导出阶段前,应让应用停止写入,或通过数据库代理把写流量排空。不要只在某个 Galera 节点执行 SET GLOBAL read_only=ON 就假定整个集群已经冻结,因为其他节点仍可能接受写入。
将备份导入新集群中的一个节点即可,PXC 会复制事务:
#!/usr/bin/env bash
set -euo pipefail
TARGET_HOST=${TARGET_HOST:-10.20.0.11}
BACKUP_DIR=${BACKUP_DIR:-./galera-export}
for dump in "$BACKUP_DIR"/*.sql.gz; do
echo "Importing ${dump}"
gzip -dc "$dump" | mysql -h "$TARGET_HOST"
done
不要直接覆盖目标端的 mysql 系统库。账户、角色和授权应使用经过审核的 CREATE USER、CREATE ROLE 与 GRANT 语句重建,同时检查目标版本支持的认证插件。对于大规模数据库,可以评估并行逻辑导出、短期异步复制或经过厂商验证的物理迁移方案,但这些路径必须先确认版本和 GTID 兼容性。
切换前用数据说话
完成导入不等于迁移完成。至少应核对对象数量、关键表行数、业务聚合结果和字符集,并在 PXC 上运行应用的读写回归测试。
下面的查询可以快速生成各业务表的估算行数和空间占用,用于发现明显遗漏;它不能替代精确校验:
SELECT table_schema,
table_name,
table_rows,
data_length + index_length AS bytes
FROM information_schema.tables
WHERE table_schema NOT IN
('mysql', 'information_schema', 'performance_schema', 'sys')
ORDER BY table_schema, table_name;
对于结算、库存、余额等关键表,应使用确定的主键范围执行精确计数或校验和。切换期间保留源集群,不要继续双向写入。推荐顺序是停止写入、完成最终同步、执行校验、更新代理或服务发现、逐步恢复流量,然后观察错误率、事务延迟、死锁、流控和节点状态。
上线检查清单
- 所有 PXC 节点均处于
Primary、Synced和wsrep_ready=ON状态。 - 用户、角色、权限、存储过程、事件和触发器已经单独验证。
- 应用连接串不依赖某个固定节点,并能避开非 Primary 或未同步节点。
- 已从 PXC 备份执行过一次真实恢复,而不只是确认备份任务成功。
- 回滚条件有明确阈值,源集群在观察期内保持只读且未被提前销毁。
- 团队已演练单节点故障、SST/IST、仲裁丢失和整集群重启。
这次迁移的核心不是把一个 Galera 软件包换成另一个,而是重新建立可验证的数据库运行边界。并行建设、逻辑隔离、明确停写和可执行回滚,通常比追求表面上的原地升级更容易控制风险。