MySQL 双主模式(Master-Master Replication)是一种主主复制架构,两台 MySQL 实例彼此互为主库,从而实现数据同步、容灾、高可用。但必须做好主键冲突、数据一致性控制。
一、前提条件
条件 |
说明 |
两台机器 |
或同一台机器两个实例(不同端口) |
MySQL 版本一致 |
推荐使用 MySQL 5.7/8.0 |
网络互通 |
主机 A 能访问主机 B 3306 端口 |
同步时间 |
ntp 保证时钟一致性 |
安装方式 |
这里为 源码安装方式 |
二、源码安装 MySQL(以 MySQL 8 为例)
1. 安装依赖
yum install -y gcc gcc-c++ cmake make ncurses-devel bison openssl-devel libaio
2. 下载源码并编译
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.36.tar.gz
tar -zxvf mysql-8.0.36.tar.gz
cd mysql-8.0.36
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DWITH_BOOST=../boost \
-DMYSQL_DATADIR=/data/mysql \
-DSYSCONFDIR=/etc \
-DWITH_INNOBASE_STORAGE_ENGINE=1
make -j$(nproc)
make install
3. 初始化数据目录
useradd -r mysql
chown -R mysql:mysql /usr/local/mysql /data/mysql
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
记录生成的临时 root 密码。
三、配置两台 MySQL 主主复制
🖥️ 假设环境:
节点 |
IP |
Server ID |
监听端口 |
A |
192.168.1.10 |
1 |
3306 |
B |
192.168.1.20 |
2 |
3306 |
A 节点配置 /etc/my.cnf
[mysqld]
server-id=1
log-bin=mysql-bin
relay-log=mysql-relay-bin
gtid_mode=ON
enforce-gtid-consistency=ON
log_slave_updates=ON
binlog_format=ROW
auto_increment_increment=2
auto_increment_offset=1
B 节点配置 /etc/my.cnf
[mysqld]
server-id=2
log-bin=mysql-bin
relay-log=mysql-relay-bin
gtid_mode=ON
enforce-gtid-consistency=ON
log_slave_updates=ON
binlog_format=ROW
auto_increment_increment=2
auto_increment_offset=2
参数说明
参数名 |
说明 |
server-id |
必须唯一 |
log-bin |
启用二进制日志 |
gtid_mode=ON |
启用 GTID |
log_slave_updates=ON |
使得 slave 写 binlog,主主必须 |
auto_increment_increment |
防止主键冲突(设置为节点数) |
auto_increment_offset |
不同节点起点不同 |
四、创建复制用户(在 A 和 B)
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
五、设置主从关系(双向)
在 A 上连接 B:
CHANGE MASTER TO
MASTER_HOST='192.168.1.20',
MASTER_USER='repl',
MASTER_PASSWORD='123456',
MASTER_AUTO_POSITION=1;
START SLAVE;
在 B 上连接 A:
CHANGE MASTER TO
MASTER_HOST='192.168.1.10',
MASTER_USER='repl',
MASTER_PASSWORD='123456',
MASTER_AUTO_POSITION=1;
START SLAVE;
六、验证状态
SHOW SLAVE STATUS\G
确保:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
表示主从关系生效。
七、常见问题和注意事项
问题/风险 |
说明 |
主键冲突 |
必须配置 auto_increment_* 防止冲突 |
双写冲突 |
避免对同一张表同时写入(应用侧保证) |
数据一致性 |
推荐使用 GTID 模式 + ROW 格式 |
split-brain(脑裂) |
可结合 Keepalived + VIP 实现单点写入 |
死循环复制(循环写) |
使用 log_slave_updates=ON 并小心业务逻辑 |
容灾建议 |
主主 + 虚拟 IP + 单写多读 |
八、总结一图
A: 192.168.1.10 (server-id=1)
↔ (主从 + GTID) ↔
B: 192.168.1.20 (server-id=2)
九、延伸建议
推荐策略 |
工具/说明 |
自动切换主库 |
MHA、Orchestrator、ProxySQL |
集群高可用 |
可考虑 MySQL InnoDB Cluster |
日志延迟监控 |
监控 Seconds_Behind_Master |
数据对比校验 |
使用 pt-table-checksum 工具 |