avatar

瓜生花子八宝粥

少壮不努力 老了看浏览器

  • 首页
  • 开源项目
  • Linux
  • Windows
  • Docker
  • 中间件
  • 数据库
主页 MySQL 主主复制配置指南(基于 GTID)
文章

MySQL 主主复制配置指南(基于 GTID)

发表于 2024-12-4 更新于 2024-12- 4
作者 jepwei
26~34 分钟 阅读

MySQL 主主复制配置指南(基于 GTID)

本指南旨在帮助 Linux 运维工程师配置 MySQL 的主主复制模式(基于 GTID)。通过本指南,您将了解如何在两台服务器之间设置主主复制,以实现高可用性和负载均衡。

目录

  1. 概述
  2. 环境准备
  3. 配置主数据库
  4. 配置从数据库
  5. 启动复制
  6. 检查复制状态
  7. 常见命令
  8. 参数说明
  9. 潜在缺点
  10. 总结

概述

主主复制(Master-Master Replication)允许两台 MySQL 服务器互为主从,实现数据的双向同步。这种架构提高了系统的可用性和读写性能,但也需要谨慎配置以避免数据冲突和其他潜在问题。

环境准备

假设有两台服务器:

  • 服务器A

    • IP 地址:192.168.100.1
    • 服务器ID:1
  • 服务器B

    • IP 地址:192.168.100.2
    • 服务器ID:2

请确保两台服务器已安装相同版本的 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: Yes
  • Slave_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_RunningI/O线程状态(Yes/No)
Slave_SQL_RunningSQL线程状态(Yes/No)
Exec_Master_Log_Pos已执行的主库二进制日志位置
Relay_Log_Space中继日志总大小(字节)
Seconds_Behind_Master从库与主库的延迟时间(秒)
Master_Server_Id主库服务器ID

潜在缺点

虽然主主复制提供了高可用性和负载均衡,但也存在一些潜在缺点:

  1. 数据冲突风险: 双向写入可能导致主键冲突或数据不一致,需谨慎管理自增主键和唯一约束。
  2. 复杂性增加: 配置和维护比主从复制更复杂,排错难度较大。
  3. 延迟问题: 高负载下,复制延迟可能增加,影响数据一致性。
  4. 单点故障: 若两台服务器同时出现故障,系统可能无法正常运行。

总结

通过本指南,您已经了解了如何配置基于 GTID 的 MySQL 主主复制。此架构适用于需要高可用性和负载均衡的场景,但需注意数据一致性和配置复杂性。建议在生产环境中部署前,先在测试环境中进行充分验证。

注意事项

  • 安全性: 请确保复制用户的密码安全,并限制其访问权限。
  • 备份策略: 主主复制并非备份方案,仍需定期备份数据。
  • 监控与维护: 定期监控复制状态,及时处理潜在问题。

参考资料

  • MySQL 官方文档 - GTID 基础知识
  • MySQL 官方文档 - 主主复制配置

结束语

主主复制为 MySQL 提供了灵活的高可用解决方案,但其配置和维护需要深入理解 MySQL 复制机制。希望本指南能为您的运维工作提供帮助。

修订记录

  • 2024-04-27 初始编写
  • 2024-04-28 更新安全提示和潜在缺点

联系我们

如有任何疑问或建议,欢迎联系技术支持团队。

授权信息

本文档遵循 MIT 许可证。

声明

本文中使用的 IP 地址和密码均为示例,实际配置时请使用您自己的安全信息。

封面图

Snipaste_2024-12-04_04-53-45.png

附录

常见错误及解决方案

  • 错误码 1032: 通常由于主键冲突导致,可使用 slave-skip-errors=1032 跳过。
  • 复制延迟高: 优化网络性能,调整 MySQL 配置参数,或增加硬件资源。

结束

感谢您的阅读,祝您配置顺利!

数据库
mysql
许可协议: 
分享

相关文章

1月 15, 2025

容器部署mysql

1. 创建容器并进行持久化处理 # 拉取镜像 docker pull mysql:8.0.20 # 启动镜像,用于拷贝配置文件到宿主机 docker run -p 13306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.

1月 15, 2025

人大金仓数据库部署

为确保金仓数据库管理系统 KingbaseES 的成功安装,用户需创建专用的 kingbase 用户并为其配置适当的权限。安装前需准备目录、上传安装包与授权文件。运用控制台模式安装时,用户需选择安装集与目录,设定数据库参数及字符集,最后确认安装。安装成功后,通过指定命令确认版本与服务状态,可以有效启动与停止数据库服务,确保系统稳定运行。

12月 20, 2024

容器部署高斯gauss数据库

本指南详细介绍了如何使用Docker部署OpenGauss数据库,包括安装前提、镜像拉取、容器运行和验证安装等步骤。首先确保Docker服务正在运行,然后使用特定命令拉取OpenGauss镜像并启动容器。配置参数包括容器名称、权限、端口映射及数据库密码。成功启动后,可通过命令检查容器状态。此外,还包括远程连接的配置方法及注意事项,确保在生产环境下的安全性和数据备份。

下一篇

Linux KVM qemu文件版本转换

上一篇

MySQL 主从复制配置完整指南

最近更新

  • 1panel 部署
  • jumpserver 堡垒机部署
  • ubuntu 设置时间显示为24小时制
  • pritunl vpn 部署
  • dockovpn 部署

热门标签

nacos openvpnas 资源分享 docker oracle mysql ubuntu 开源项目 虚拟化 Linux

目录

©2025 瓜生花子八宝粥. 保留部分权利。

使用 Halo 主题 Chirpy