开发者

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

开发者 https://www.devze.com 2025-11-05 09:11 出处:网络 作者: 老吴的爱徒
目录(Centos 6/7 适用)一、环境说明二、前置准备(两台服务器均执行)1. 确认 mysql 状态2. 关闭防火墙(测试环境简化)三、配置服务器 A(192.168.1.51)1. 修改 MySQL 核心配置文件2. 重启 MyS编程客栈QL 使配置
目录
  • (Centos 6/7 适用)
    • 一、环境说明
    • 二、前置准备(两台服务器均执行)
      • 1. 确认 mysql 状态
      • 2. 关闭防火墙(测试环境简化)
    • 三、配置服务器 A(192.168.1.51)
      • 1. 修改 MySQL 核心配置文件
      • 2. 重启 MyS编程客栈QL 使配置生效
      • 3. 创建同步账号(供服务器 B 连接)
    • 四、配置服务器 B(192.168.1.52)
      • 1. 修改 MySQL 核心配置文件
      • 2. 重启 MySQL 服务
      • 3. 创建同步账号(供服务器 A 连接)
    • 五、配置双向同步(关键步骤)
      • 1. 服务器 A 同步服务器 B 的数据(A 作为 B 的从库)
      • 2. 服务器 B 同步服务器 A 的数据(B 作为 A 的从库)
    • 六、验证同步状态
      • 1. 检查从库运行状态
      • 2. 功能测试(双向同步验证)
    • 七、常见问题排查
      • 八、总结
      • 总结

        (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 fire编程客栈walld
        
        # 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上创建的同RTgeeRwrW步账号
          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_Runninjsg: 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互为主从部署内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

        0

        精彩评论

        暂无评论...
        验证码 换一张
        取 消

        关注公众号