Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL互为主从部署

MySQL互为主从(双向同步)部署超详细教程

作者:老吴的爱徒

MySQL互为主从是一种特殊的复制架构,其中两个MySQL服务器互为主从,彼此之间互相同步数据,这篇文章主要介绍了MySQL互为主从(双向同步)部署的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

(CentOS 6/7 适用)

一、环境说明

服务器角色IP 地址系统版本MySQL 版本核心作用
服务器 A192.168.1.51CentOS 6/7MySQL 5.7.17作为 B 的主库 + 作为 B 的从库
服务器 B192.168.1.52CentOS 6/7MySQL 5.7.17作为 A 的主库 + 作为 A 的从库

目标:实现 A、B 双向数据同步,确保两边数据实时一致,支持读写分离或故障备份。

二、前置准备(两台服务器均执行)

1. 确认 MySQL 状态

先验证 MySQL 版本一致性和服务运行状态,避免版本差异导致同步失败。

# 1. 检查MySQL版本(需均为5.7.17)
mysql -V

# 2. 确认MySQL服务正常运行
# CentOS 7
systemctl status mysqld
# CentOS 6
service mysqld status

2. 关闭防火墙(测试环境简化)

生产环境可改为开放 3306 端口,测试阶段直接关闭防火墙更高效。

# CentOS 7
systemctl stop firewalld && systemctl disable firewalld

# CentOS 6
service iptables stop && chkconfig iptables off

三、配置服务器 A(192.168.1.51)

1. 修改 MySQL 核心配置文件

编辑my.cnf,仅保留互为主从必需配置,减少冗余。

vim /etc/my.cnf

[mysqld]区块添加以下内容:

[mysqld]
server-id = 51                  # 唯一ID,不可与B重复(建议用IP后两位)
log_bin = mysql-bin             # 开启二进制日志(主从同步核心依赖)
log_slave_updates = 1           # 允许同步的数据再次生成日志(互为主从关键)
auto_increment_increment = 2    # 自增步长为2,避免主键冲突
auto_increment_offset = 1       # A生成奇数ID(1、3、5...)

2. 重启 MySQL 使配置生效

# CentOS 7
systemctl restart mysqld
# CentOS 6
service mysqld restart

3. 创建同步账号(供服务器 B 连接)

登录 MySQL,创建用于同步的账号repluser,并授予复制权限。

# 登录MySQL(输入root密码)
mysql -u root -p

执行 SQL 命令:

-- 允许服务器B(192.168.1.52)使用repluser账号连接
GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.1.52' IDENTIFIED BY 'Sync@123';

-- 刷新权限,确保配置生效
FLUSH PRIVILEGES;

-- 查看A的主库状态(记录File和Position,后续配置B需用)
SHOW MASTER STATUS;

记录输出结果(示例):

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      438 |              |                  |
+------------------+----------+--------------+------------------+

四、配置服务器 B(192.168.1.52)

1. 修改 MySQL 核心配置文件

与服务器 A 类似,仅调整server-idauto_increment_offset

vim /etc/my.cnf

[mysqld]区块添加:

[mysqld]
server-id = 52                  # 唯一ID,与A不同
log_bin = mysql-bin             # 开启二进制日志
log_slave_updates = 1           # 互为主从关键配置
auto_increment_increment = 2    # 自增步长与A一致
auto_increment_offset = 2       # B生成偶数ID(2、4、6...)

2. 重启 MySQL 服务

# CentOS 7
systemctl restart mysqld
# CentOS 6
service mysqld restart

3. 创建同步账号(供服务器 A 连接)

登录 MySQL,创建给 A 用的同步账号。

mysql -u root -p

执行 SQL 命令:

-- 允许服务器A(192.168.1.51)使用repluser账号连接
GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.1.51' IDENTIFIED BY 'Sync@123';

-- 刷新权限
FLUSH PRIVILEGES;

-- 查看B的主库状态(记录File和Position,后续配置A需用)
SHOW MASTER STATUS;

记录输出结果(示例):

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      438 |              |                  |
+------------------+----------+--------------+------------------+

五、配置双向同步(关键步骤)

1. 服务器 A 同步服务器 B 的数据(A 作为 B 的从库)

登录服务器 A 的 MySQL,配置 B 为主库信息。

mysql -u root -p

执行 SQL(替换为 B 的SHOW MASTER STATUS结果):

-- 停止现有从库进程(若之前配置过)
STOP SLAVE;

-- 配置B为主库
CHANGE MASTER TO
  MASTER_HOST = '192.168.1.52',    # B的IP
  MASTER_USER = 'repluser',        # B上创建的同步账号
  MASTER_PASSWORD = 'Sync@123',    # 同步密码
  MASTER_LOG_FILE = 'mysql-bin.000001',  # B的File
  MASTER_LOG_POS = 438;             # B的Position

-- 启动从库同步
START SLAVE;

2. 服务器 B 同步服务器 A 的数据(B 作为 A 的从库)

登录服务器 B 的 MySQL,配置 A 为主库信息。

mysql -u root -p

执行 SQL(替换为 A 的SHOW MASTER STATUS结果):

-- 停止现有从库进程
STOP SLAVE;

-- 配置A为主库
CHANGE MASTER TO
  MASTER_HOST = '192.168.1.51',    # A的IP
  MASTER_USER = 'repluser',        # A上创建的同步账号
  MASTER_PASSWORD = 'Sync@123',    # 同步密码
  MASTER_LOG_FILE = 'mysql-bin.000001',  # A的File
  MASTER_LOG_POS = 438;             # A的Position

-- 启动从库同步
START SLAVE;

六、验证同步状态

1. 检查从库运行状态

在 A 和 B 上分别执行以下命令,核心验证Slave_IO_RunningSlave_SQL_Running是否均为Yes

SHOW SLAVE STATUS\G;  # \G表示竖屏显示,更易读

关键输出(需均为 Yes)

Slave_IO_Running: Yes    # 与主库连接正常
Slave_SQL_Running: Yes   # 同步日志执行正常

2. 功能测试(双向同步验证)

测试 1:A 写入数据,B 验证同步

  1. 在 A 上创建测试数据:
-- A上执行
CREATE DATABASE IF NOT EXISTS sync_test;
USE sync_test;
CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT, info VARCHAR(50));
INSERT INTO t1 (info) VALUES ('来自A的测试数据');  # ID应为1(奇数)
  1. 在 B 上查看数据是否同步:
-- B上执行
USE sync_test;
SELECT * FROM t1;  # 应返回ID=1的记录

测试 2:B 写入数据,A 验证同步

  1. 在 B 上插入数据:
-- B上执行
INSERT INTO sync_test.t1 (info) VALUES ('来自B的测试数据');  # ID应为2(偶数)
  1. 在 A 上查看数据是否同步:
-- A上执行
USE sync_test;
SELECT * FROM t1;  # 应返回ID=1和ID=2的两条记录

七、常见问题排查

  1. Slave_IO_Running: Connecting

    • 原因:IP 错误、同步账号密码错误、防火墙未关闭。
    • 解决:核对CHANGE MASTER TO中的 IP、账号、密码;确保防火墙已关闭。
  2. Slave_SQL_Running: No

    • 原因:主从数据不一致、主键冲突。
    • 解决:确保初始数据一致;检查auto_increment配置是否正确(A 奇数、B 偶数)。
  3. 同步延迟

    • 原因:数据量过大、服务器性能不足。
    • 解决:优化 MySQL 配置(如增大innodb_buffer_pool_size);避免大事务。

八、总结

  1. 互为主从的核心是双向配置主从关系,A 同步 B、B 同步 A,通过log_slave_updates = 1支撑双向日志传递。
  2. 自增 ID 配置(步长 2 + 偏移 1/2)是避免主键冲突的关键,确保 A、B 生成的 ID 完全不重叠。
  3. 验证时优先检查Slave_IO_RunningSlave_SQL_Running,再通过实际数据写入测试同步功能。

总结

到此这篇关于MySQL互为主从(双向同步)部署的文章就介绍到这了,更多相关MySQL互为主从部署内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文