Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL 双机互备

MySQL 双机互备的项目实践

作者:我已疯魔成性

MySQL双机互备实现主主复制的高可用架构,通过配置两台服务器互为主从,实现数据实时同步和服务冗余,下面就来详细的介绍一下,感兴趣的可以了解一下

前言

MySQL 双机互备(也常被称为主主复制 / Master-Master 复制)是一种高可用架构,两台 MySQL 服务器互为主从,既能各自提供读写服务,又能实时同步数据,避免单节点故障导致服务中断。下面我会用通俗易懂的方式,一步步教你实现 MySQL 双机互备。

一、环境准备

假设你有两台服务器,基础信息如下(请替换为你的实际信息):
表格
服务器 IP 地址 角色
服务器 A 192.168.1.100 Master1/ Slave2
服务器 B 192.168.1.101 Master2/ Slave1

前置条件:
两台服务器安装相同版本的 MySQL(推荐 5.7+ 或 8.0+)。
两台服务器网络互通(能 ping 通,且 3306 端口开放)。
关闭防火墙 / SELinux(或放行 3306 端口)。
两台服务器的 server-id 必须不同(核心)

二、核心配置步骤

1.修改两台服务器的 MySQL 配置文件

MySQL 配置文件通常在 /etc/my.cnf(CentOS/RHEL)或 /etc/mysql/my.cnf(Ubuntu/Debian),编辑配置文件并添加以下内容:

服务器 A(192.168.1.100)配置

server-id=1                                   #server的唯一标识
auto_increment_offset=1                       #自增id起始值
auto_increment_increment=2                    #每次自增数字
log-bin = mysql-bin                           #打开二进制功能,MASTER主服务器必须打开此项
max_binlog_size=1024M                         #binlog单文件最大值
replicate-do-db=mcsxx
replicate-do-db=mcsxx_config
replicate-ignore-table=mcsxx.sys_num         ##忽略不同步的表
replicate-ignore-table=mcsxx.sys_verify         ##忽略不同步的表
slave-skip-errors=all
# 启用GTID模式  
gtid_mode = ON  
# 强制GTID一致性检查  
enforce_gtid_consistency = ON  
# 可选:禁用日志校验(部分版本需添加)  
binlog_checksum = NONE 
log_slave_updates = ON # 必须开启,确保互备时事务日志传递
binlog_format = ROW # 推荐ROW模式

服务器 B(192.168.1.101)配置

server-id=2                                 #server的唯一标识
auto_increment_offset=2                       #自增id起始值
auto_increment_increment=2                    #每次自增数字
log-bin = mysql-bin                           #打开二进制功能,MASTER主服务器必须打开此项
max_binlog_size=1024M                         #binlog单文件最大值
replicate-do-db=mcsxx
replicate-do-db=mcsxx_config
replicate-ignore-table=mcsxx.sys_num         ##忽略不同步的表
replicate-ignore-table=mcsxx.sys_verify         ##忽略不同步的表
slave-skip-errors=all
# 启用GTID模式  
gtid_mode = ON  
# 强制GTID一致性检查  
enforce_gtid_consistency = ON  
# 可选:禁用日志校验(部分版本需添加)  
binlog_checksum = NONE  
log_slave_updates = ON # 必须开启,确保互备时事务日志传递
binlog_format = ROW # 推荐ROW模式

修改完成后,重启两台服务器的 MySQL 服务:

# CentOS/RHEL 7+
systemctl restart mysqld
# Ubuntu/Debian
systemctl restart mysql

2.创建复制专用账号

在两台服务器上分别创建用于复制的账号(权限最小化,只授予复制权限):

服务器 A 上执行(给服务器 B 授权):

CREATE USER 'repl'@'192.168.1.101' IDENTIFIED BY 'abcmima';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.101';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;  # 记录File和Position 

服务器 B上执行(给服务器 A 授权):

CREATE USER 'repl'@'192.168.1.100' IDENTIFIED BY 'abcmima';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.100';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;  # 记录File和Position 

3.删除日志文件(从当前开始同步,两边都删掉,然后重启数据库)

rm -rf mysql-bin.*
rm -rf localhost-relay-bin.*

4.配置互为从库

服务器 A 上配置(将服务器 B 设为主库)

RESET MASTER;
CHANGE MASTER TO MASTER_HOST='192.168.1.101', MASTER_USER='repl', MASTER_PASSWORD='abcmima', MASTER_AUTO_POSITION=1; 
START SLAVE;
show slave status\G

服务器 B上配置(将服务器 A 设为主库)

RESET MASTER;
CHANGE MASTER TO MASTER_HOST='192.168.1.100', MASTER_USER='repl', MASTER_PASSWORD='abcmima', MASTER_AUTO_POSITION=1; 
START SLAVE;
show slave status\G

5.检查从库状态(关键,两台服务器都需要查询)

SHOW SLAVE STATUS\G;

关键检查项:确保 Slave_IO_Running 和 Slave_SQL_Running 都是 Yes,如果是 No,查看 Last_Error 排查问题。

6.验证数据库

分别在两台服务器上插入修改数据,另外一台服务器上数据库查看有没有变化。

7.常见问题与注意事项

主键冲突:主主复制的核心是 auto_increment_increment 和 auto_increment_offset 配置,必须保证两台服务器的自增 ID 不重叠。
复制状态异常:如果 Slave_IO_Running 为 No,检查网络 / 账号密码;如果 Slave_SQL_Running 为 No,检查数据不一致(如主键重复)。
只读设置:如果想让其中一台仅作为备库(只读),可将其 read_only = 1(注意:root 用户不受只读限制)。
故障切换:如果一台服务器宕机,可将业务流量切到另一台,恢复后重新配置复制即可。

总结

MySQL 双机互备的核心是主主复制,通过开启二进制日志、配置不同的 server-id 和自增步长,实现两台服务器数据双向同步。
关键配置项:log-bin(开启二进制日志)、log_slave_updates = 1(允许从库写入二进制日志)、auto_increment_increment/offset(避免主键冲突)。
验证时需双向测试数据同步,核心检查项是 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes。

到此这篇关于MySQL 双机互备的文章就介绍到这了,更多相关MySQL 双机互备内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

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