双主复制实现

type
status
date
slug
summary
tags
category
icon
password

1️⃣ 前提条件

  • 两台 MySQL 服务器:master1master2
  • IP:192.168.140.10(master1)、192.168.140.11(master2)
  • MySQL 版本:8.0
  • 用户:repl,密码:WWW.1.com
  • 建议使用 GTID 模式,简化双主冲突管理

2️⃣ 双主配置原则

  1. 每台主库的 server-id 必须唯一
  1. 开启二进制日志(log_bin)和 GTID(gtid_mode=ON
  1. 事务使用 ROW 模式(binlog_format=ROW
  1. 双向建立复制账号,并允许对方 IP 连接
  1. 避免自增主键冲突(可使用 auto_increment_increment / auto_increment_offset 设置)

3️⃣ 主库配置(Master1 & Master2)

3.1 编辑 /etc/my.cnf

⚠️ auto_increment_increment 和 auto_increment_offset 避免自增主键冲突。

3.2 重启 MySQL

3.3 创建复制用户

在 Master1:
在 Master2:

4️⃣ 双向连接(配置复制)

4.1 Master1 复制到 Master2

在 Master1:

4.2 Master2 复制到 Master1

在 Master2:

5️⃣ 检查复制状态

在两台服务器执行:
关键字段:
  • Slave_IO_Running: Yes
  • Slave_SQL_Running: Yes
  • Seconds_Behind_Master: 0
  • Auto_Position: 1(使用 GTID 自动定位)

6️⃣ 测试双主写入

  • 在 Master1 插入一条数据
  • 在 Master2 插入另一条数据
  • 检查两台服务器的数据是否同步

7️⃣ 注意事项

  1. 避免循环更新
      • 使用 GTID 可以防止重复执行事务
  1. 冲突管理
      • 如果两个主库同时修改同一行,会导致冲突,需要应用端处理
  1. 监控复制状态
      • 定期 SHOW SLAVE STATUS\G
      • 确保 Slave_IO_RunningSlave_SQL_Running 始终为 Yes
  1. 备份策略
      • 双主场景建议定期全备,并设置从库做只读备份

Loading...