MySQL 主从同步迁移到 MariaDB Galera 集群需要停止主库写入、导出全量数据、配置 wsrep 插件并引导启动集群。该方案适合需要高可用和多点写入的场景,主要风险在于应用层需适配多主架构且不支持 MyISAM 引擎。
先说结论:迁移过程本质是架构变更,需确保存储引擎兼容并重新设计写入逻辑。
- 适合:需要高可用、多点写入且能接受同步复制延迟的业务。
- 先准备:检查所有表是否为 InnoDB 引擎,移除触发器和外键约束。
- 验收:确认 wsrep_ready 状态为 ON 且集群节点数符合预期。
命令速用版
配置 Galera 集群需在 my.cnf 中启用 wsrep 插件,并通过状态命令验证集群健康度。
# 配置文件 /etc/my.cnf.d/server.cnf 片段
[galera]
wsrep_on=ON
wsrep_cluster_address=gcomm://node1_ip,node2_ip,node3_ip
wsrep_node_address=当前节点 IP
wsrep_sst_method=rsync
# 验证集群状态
SHOW STATUS LIKE 'wsrep_ready';
SHOW STATUS LIKE 'wsrep_cluster_size';为什么会这样
MySQL 主从是异步复制,Galera 是同步多主复制,底层机制差异导致配置无法直接复用。
MySQL 主从架构依赖 binlog 异步传输,从库延迟不可控且只能单点写入。MariaDB Galera 基于 wsrep 接口实现同步复制,所有节点均可读写,数据强一致但受网络延迟影响较大。迁移时必须改变应用连接方式,从连接单一主库改为连接集群地址或多个节点 IP。
分步处理
迁移操作按停止写入、数据导出、集群引导、应用切换顺序执行,每步需验证数据一致性。
步骤 1:兼容性检查
适用场景:迁移前评估。
操作动作:执行 SELECT engine FROM information_schema.tables WHERE engine='MyISAM'; 检查是否存在 MyISAM 表。
验证结果:返回空集表示兼容。
风险边界:存在 MyISAM 表会导致集群启动失败或数据不一致。
步骤 2:停止主库写入
适用场景:数据割接窗口。
操作动作:在 MySQL 主库执行 SET GLOBAL read_only=ON; 并停止应用服务。
验证结果:应用报错只读或连接被拒。
风险边界:需确保所有从库同步完成,避免数据丢失。
步骤 3:导出数据并导入 Galera
适用场景:数据迁移。
操作动作:使用 mysqldump 导出全量数据,导入到第一个 Galera 节点。
验证结果:导入完成无报错。
风险边界:大表导入期间集群可能阻塞,建议单节点引导后加入其他节点。
步骤 4:配置并启动集群
适用场景:集群初始化。
操作动作:在第一节点执行 galera_new_cluster 或设置 wsrep_cluster_address=gcomm:// 引导,其他节点正常启动。
验证结果:所有节点 mysqld 进程运行正常。
风险边界:引导节点配置错误会导致脑裂。
步骤 5:切换应用连接
适用场景:业务恢复。
操作动作:修改应用数据库连接字符串,指向 Galera 节点 IP 或负载均衡器 VIP。
验证结果:应用读写正常。
风险边界:需配置重试机制处理事务冲突错误。
怎么验证是否生效
通过 wsrep 状态变量确认集群同步状态和节点数量,确保数据强一致。
执行 SHOW STATUS LIKE 'wsrep%'; 检查关键指标。wsrep_ready 值为 ON 表示节点已加入集群可接受请求。wsrep_cluster_size 值等于规划节点数表示集群完整。wsrep_local_state_comment 值为 Synced 表示数据同步完成。若出现 State 不为 Synced 或 ready 为 OFF,需检查网络连接和防火墙配置。
常见坑
迁移过程中容易遇到自增主键冲突、大事务阻塞和大字段限制问题。
- 自增主键冲突:多主写入可能导致 auto_increment 冲突,需设置 auto_increment_offset 和 auto_increment_increment 区分节点,或改用 UUID。
- 大事务阻塞:Galera 同步大事务会阻塞整个集群,单事务建议控制在 100MB 以内,公开资料中没有看到可靠的量化数据,需根据实际网络测试。
- 不支持的引擎:MyISAM 引擎不支持同步复制,必须转换为 InnoDB。
- 外键约束:跨节点外键约束可能导致死锁,建议在应用层维护关联关系。
常见问题
Galera 集群支持 MySQL binlog 吗?
支持但配置不同,Galera 使用 wsrep 机制而非传统 binlog 复制。
MariaDB Galera 可以开启 binlog 用于点对点备份或作为异步从库的主库,但集群内部同步不依赖 binlog。若需保留原有备份流程,需在 my.cnf 中显式开启 log_bin 参数。
迁移后写入性能会下降吗?
同步复制会增加写入延迟,性能取决于网络质量和节点数量。
Galera 要求事务在所有节点确认提交,网络延迟直接影响写入响应时间。公开资料中没有看到可靠的量化数据,建议在生产前进行压力测试。
应用需要修改代码吗?
需要修改连接配置,事务逻辑可能需调整以处理冲突。
应用需支持连接多个数据库 IP 或负载均衡地址。由于多主写入可能产生冲突回滚,代码需捕获死锁错误并重试事务。
参考来源
- MariaDB Knowledge Base, Galera Cluster, https://mariadb.com/kb/en/galera-cluster/
- MariaDB Knowledge Base, wsrep Status Variables, https://mariadb.com/kb/en/wsrep-status-variables/
- MariaDB Knowledge Base, MySQL Compatibility, https://mariadb.com/kb/en/mysql-compatibility/