MySQL 主主复制配置指南(基于 GTID)
MySQL 主主复制配置指南(基于 GTID)
本指南旨在帮助 Linux 运维工程师配置 MySQL 的主主复制模式(基于 GTID)。通过本指南,您将了解如何在两台服务器之间设置主主复制,以实现高可用性和负载均衡。
目录
概述
主主复制(Master-Master Replication)允许两台 MySQL 服务器互为主从,实现数据的双向同步。这种架构提高了系统的可用性和读写性能,但也需要谨慎配置以避免数据冲突和其他潜在问题。
环境准备
假设有两台服务器:
-
服务器A
- IP 地址:
192.168.100.1 - 服务器ID:
1
- IP 地址:
-
服务器B
- IP 地址:
192.168.100.2 - 服务器ID:
2
- IP 地址:
请确保两台服务器已安装相同版本的 MySQL,并且能够相互网络通信。
配置主数据库
1. 编辑 MySQL 配置文件
在 服务器A 上编辑 MySQL 配置文件(通常为 /etc/my.cnf 或 /etc/mysql/my.cnf):
vim /etc/my.cnf
2. 添加以下配置
[mysqld]
# 基础配置
server-id=1
gtid_mode=ON
enforce_gtid_consistency=ON
log_bin=master-bin
log_bin_index=master-bin.index
binlog_format=ROW
expire_logs_days=30
sync_binlog=1
sync_relay_log=1
sync_relay_log_info=1
relay_log=/var/lib/mysql/relay-log
relay_log_index=/var/lib/mysql/relay-log.index
master_info_repository=TABLE
relay_log_info_repository=TABLE
# 主主复制配置
log_slave_updates=ON
auto_increment_increment=2
auto_increment_offset=1
# 可选配置
# slave-skip-errors=1032
说明:
server-id:每台服务器的唯一标识,服务器B设置为2。auto_increment_increment和auto_increment_offset:避免自增主键冲突。
3. 重启 MySQL 服务
sudo systemctl restart mysqld
配置从数据库
在 服务器B 上重复与服务器A相同的配置步骤,但需更改以下参数:
[mysqld]
# 基础配置
server-id=2
gtid_mode=ON
enforce_gtid_consistency=ON
log_bin=master-bin
log_bin_index=master-bin.index
binlog_format=ROW
expire_logs_days=30
sync_binlog=1
sync_relay_log=1
sync_relay_log_info=1
relay_log=/var/lib/mysql/relay-log
relay_log_index=/var/lib/mysql/relay-log.index
master_info_repository=TABLE
relay_log_info_repository=TABLE
# 主主复制配置
log_slave_updates=ON
auto_increment_increment=2
auto_increment_offset=2
# 可选配置
# slave-skip-errors=1032
注意: auto_increment_offset 设置为2以避免与服务器A的自增主键冲突。
4. 重启 MySQL 服务
sudo systemctl restart mysqld
启动复制
1. 在双方服务器上创建复制用户
在 服务器A 和 服务器B 上分别执行以下命令:
CREATE USER 'repl_user'@'%' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'your_secure_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
安全提示: 请将 your_secure_password 替换为强密码。
2. 获取主库当前状态
在 服务器A 和 服务器B 上执行:
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
记录下 File 和 Position 的值。
3. 配置复制
在 服务器A 上配置指向 服务器B:
CHANGE MASTER TO
MASTER_HOST='192.168.100.2',
MASTER_USER='repl_user',
MASTER_PASSWORD='your_secure_password',
MASTER_AUTO_POSITION=1;
START SLAVE;
在 服务器B 上配置指向 服务器A:
CHANGE MASTER TO
MASTER_HOST='192.168.100.1',
MASTER_USER='repl_user',
MASTER_PASSWORD='your_secure_password',
MASTER_AUTO_POSITION=1;
START SLAVE;
4. 解锁表
在 服务器A 和 服务器B 上执行:
UNLOCK TABLES;
检查复制状态
在 服务器A 和 服务器B 上执行以下命令查看复制状态:
SHOW SLAVE STATUS\G
关键检查项:
Slave_IO_Running: YesSlave_SQL_Running: Yes
若两者均为 Yes,则复制配置成功。
常见命令
-
跳过一个错误:
SET GLOBAL sql_slave_skip_counter = 1; -
查看复制状态:
SHOW SLAVE STATUS\G
参数说明
| 参数 | 说明 |
|---|---|
Master_Host | 主库地址 |
Master_User | 复制用户 |
Master_Port | 主库端口 |
Connect_Retry | 重试连接时间间隔(秒) |
Master_Log_File | 当前读取的主库二进制日志文件 |
Read_Master_Log_Pos | 从库已读取到的二进制日志位置 |
Relay_Log_File | 当前处理的中继日志文件 |
Relay_Log_Pos | 中继日志处理位置 |
Relay_Master_Log_File | 中继日志对应的主库二进制日志文件 |
Slave_IO_Running | I/O线程状态(Yes/No) |
Slave_SQL_Running | SQL线程状态(Yes/No) |
Exec_Master_Log_Pos | 已执行的主库二进制日志位置 |
Relay_Log_Space | 中继日志总大小(字节) |
Seconds_Behind_Master | 从库与主库的延迟时间(秒) |
Master_Server_Id | 主库服务器ID |
潜在缺点
虽然主主复制提供了高可用性和负载均衡,但也存在一些潜在缺点:
- 数据冲突风险: 双向写入可能导致主键冲突或数据不一致,需谨慎管理自增主键和唯一约束。
- 复杂性增加: 配置和维护比主从复制更复杂,排错难度较大。
- 延迟问题: 高负载下,复制延迟可能增加,影响数据一致性。
- 单点故障: 若两台服务器同时出现故障,系统可能无法正常运行。
总结
通过本指南,您已经了解了如何配置基于 GTID 的 MySQL 主主复制。此架构适用于需要高可用性和负载均衡的场景,但需注意数据一致性和配置复杂性。建议在生产环境中部署前,先在测试环境中进行充分验证。
注意事项
- 安全性: 请确保复制用户的密码安全,并限制其访问权限。
- 备份策略: 主主复制并非备份方案,仍需定期备份数据。
- 监控与维护: 定期监控复制状态,及时处理潜在问题。
参考资料
结束语
主主复制为 MySQL 提供了灵活的高可用解决方案,但其配置和维护需要深入理解 MySQL 复制机制。希望本指南能为您的运维工作提供帮助。
修订记录
- 2024-04-27 初始编写
- 2024-04-28 更新安全提示和潜在缺点
联系我们
如有任何疑问或建议,欢迎联系技术支持团队。
授权信息
本文档遵循 MIT 许可证。
声明
本文中使用的 IP 地址和密码均为示例,实际配置时请使用您自己的安全信息。
封面图

附录
常见错误及解决方案
- 错误码 1032: 通常由于主键冲突导致,可使用
slave-skip-errors=1032跳过。 - 复制延迟高: 优化网络性能,调整 MySQL 配置参数,或增加硬件资源。
结束
感谢您的阅读,祝您配置顺利!