
MySQL主主复制架构配置指南:双机互备实现高可用读写分离
在MySQL数据库的高可用架构中,主主复制是一种非常实用的部署方案。与传统的单主从架构不同,主主复制允许两台服务器同时承担读写任务,任何一台上的数据变更都会自动同步到另一台,从而有效提升系统的响应性能和容灾能力。
一、主主复制的核心原理
主主复制的本质是让两台MySQL服务器互相成为对方的主库和从库。这意味着每一台服务器既负责写入数据,也负责接收来自另一台的更新。这种双向同步机制带来的好处显而易见:当一台服务器出现故障时,另一台可以无缝接管全部业务,确保服务的连续性。
主主复制的主要优势
- 读写能力翻倍:两台服务器都可以处理读写请求,分散系统压力
- 故障自动转移:单点故障不影响整体服务可用性
- 数据实时备份:两端数据始终保持一致,降低数据丢失风险
- 负载均衡基础:为后续扩展更多节点提供了良好基础
二、配置前的准备工作
在开始配置之前,需要确认以下条件已经满足:
- 两台服务器的MySQL版本保持一致
- 网络互通,防火墙允许3306端口通信
- 已安装好MySQL数据库并正常运行
- 准备好管理员权限的用户账号
本文以两台服务器为例进行演示:
- 服务器A:IP地址 192.168.1.108
- 服务器B:IP地址 192.168.1.110
三、详细配置步骤
第一步:创建复制专用账号
在两台服务器上分别创建用于数据同步的账号,注意密码要设置得足够复杂以保证安全。
在服务器A上执行:
GRANT REPLICATION SLAVE ON *.* TO 'sync_user_b'@'192.168.1.110' IDENTIFIED BY 'StrongPasswordB123';
FLUSH PRIVILEGES;在服务器B上执行:
GRANT REPLICATION SLAVE ON *.* TO 'sync_user_a'@'192.168.1.108' IDENTIFIED BY 'StrongPasswordA456';
FLUSH PRIVILEGES;第二步:修改MySQL配置文件
这是整个配置中最关键的环节,需要特别注意自增ID的冲突避免设置。
服务器A的my.cnf配置
[mysqld]
server-id = 10
log-bin = mysql-bin
binlog-format = ROW
replicate-do-db = business_db
auto-increment-increment = 2
auto-increment-offset = 1服务器B的my.cnf配置
[mysqld]
server-id = 20
log-bin = mysql-bin
binlog-format = ROW
replicate-do-db = business_db
auto-increment-increment = 2
auto-increment-offset = 2配置说明:
- server-id必须唯一,不能重复
- auto-increment-increment设置为服务器总数,这里为2
- auto-increment-offset设置不同的起始值,避免自增主键冲突
- binlog-format建议使用ROW模式,保证数据一致性
修改完成后,重启两台服务器的MySQL服务使配置生效:
systemctl restart mysqld第三步:初始化数据同步
在进行同步之前,需要确保两台服务器上的数据完全一致。如果已有业务数据,建议按以下步骤操作:
- 在服务器A上导出需要同步的数据库:
mysqldump -u root -p --databases business_db > /tmp/business_db_backup.sql- 将备份文件传输到服务器B:
scp /tmp/business_db_backup.sql root@192.168.1.110:/tmp/- 在服务器B上创建同名数据库并导入数据:
CREATE DATABASE IF NOT EXISTS business_db;
USE business_db;
SOURCE /tmp/business_db_backup.sql;第四步:配置双向同步链路
现在开始建立两台服务器之间的复制关系。
在服务器A上配置指向服务器B的同步
首先查看服务器B当前的二进制日志位置:
SHOW MASTER STATUS;记录下File和Position的值,然后在服务器A上执行:
CHANGE MASTER TO
MASTER_HOST='192.168.1.110',
MASTER_USER='sync_user_b',
MASTER_PASSWORD='StrongPasswordB123',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;在服务器B上配置指向服务器A的同步
同样先查看服务器A的二进制日志位置,然后在服务器B上执行:
CHANGE MASTER TO
MASTER_HOST='192.168.1.108',
MASTER_USER='sync_user_a',
MASTER_PASSWORD='StrongPasswordA456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;四、验证同步状态
配置完成后,需要进行全面的验证以确保架构正常工作。
检查同步线程运行状态
在两台服务器上分别执行:
SHOW SLAVE STATUS\G重点关注以下两个参数:
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
这两个参数都显示为Yes,表示同步链路已经成功建立。
测试数据同步效果
在服务器A上创建一张测试表并插入数据:
CREATE TABLE test_sync (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50));
INSERT INTO test_sync(name) VALUES('测试数据A');立即登录服务器B查询该表,应该能看到同样的数据。反之亦然,在服务器B上插入的数据也能实时同步到服务器A。
五、常见问题与解决方案
自增主键冲突问题
如果发现插入数据时出现主键重复错误,请检查auto-increment-increment和auto-increment-offset的配置是否正确。两台服务器的offset值必须不同,且increment值等于服务器总数。
同步延迟问题
当出现较大数据量写入时,可能会产生同步延迟。可以通过以下方式缓解:
- 增加网络带宽
- 优化慢查询语句
- 适当调整slave并行复制参数
断线重连问题
网络抖动可能导致同步中断,MySQL会自动尝试重连。如果长时间无法恢复,可以手动执行STOP SLAVE后再执行START SLAVE重建连接。
六、生产环境建议
在实际生产环境中部署主主复制时,还需要注意以下几点:
- 监控告警:建立完善的同步状态监控体系,及时发现异常
- 定期演练:定期进行故障切换演练,确保应急预案有效
- 备份策略:即使有主主复制,仍然需要定期做全量备份
- 版本升级:尽量保持两台服务器的MySQL版本完全一致
- 读写分离:虽然两台都可读写,但建议根据业务场景合理分配读写比例
通过以上步骤,你已经成功搭建了一套MySQL主主复制架构。这种架构不仅提高了数据库的可用性,还为后续的业务扩展奠定了坚实基础。在实际应用中,可以根据业务需求进一步优化配置参数,充分发挥双主架构的性能优势。