MySQL 双主模式(Master-Master)源码安装

发布于:2025-07-08 ⋅ 阅读:(20) ⋅ 点赞:(0)

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 工具


网站公告

今日签到

点亮在社区的每一天
去签到