MySQL 5.7 主主复制 + Keepalived 高可用配置实例
前言
环境准备
一、MySQL 5.7 主主复制配置
1. 修改 my.cnf 核心配置
2. 创建复制账号
3. 配置主主复制
4. 测试复制状态
二、Keepalived 编译安装与配置
1. 编译安装 Keepalived
2. Keepalived 配置文件示例
3. MySQL 状态检测脚本
4. 启动 Keepalived
三、VIP 漂移测试
四、常见问题
五、Keepalived 配置参数详解
1️⃣ 全局配置 global_defs
2️⃣ VRRP 脚本配置 vrrp_script
3️⃣ VRRP 实例配置 vrrp_instance
4️⃣ VIP 漂移逻辑
总结
前言
在高可用数据库架构中,主主复制(Master-Master Replication) 可以实现数据双向同步,而 Keepalived 则提供 VIP 漂移机制,保证在主节点故障时,客户端仍能通过虚拟 IP 访问数据库,从而实现业务连续性。
本文整理了一个 MySQL 5.7 主主复制 + VIP 漂移高可用环境 的完整配置流程,包括配置参数详解、Keepalived 编译安装、健康检查脚本等,帮助运维快速搭建可靠的高可用 MySQL 环境。
环境准备
-
两台 MySQL 节点:
mysql1
、mysql2
-
mysql1:172.16.0.110 | mysql2:172.16.0.115
-
Keepalived 用于 VIP 漂移
-
操作系统:CentOS 7
-
MySQL 已通过 RPM 安装好
注:RPM安装mysql请阅读https://blog.csdn.net/kirito0000/article/details/152375295?spm=1001.2014.3001.5501
一、MySQL 5.7 主主复制配置
1. 修改 my.cnf
核心配置
路径:/etc/my.cnf
#mysql1 [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock port=3306 bind-address=0.0.0.0 default-storage-engine=INNODB character-set-server=utf8 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid # 二进制日志配置(主主复制必须) log-bin=mysql-bin binlog_format=MIXED sync_binlog=1 expire_logs_days=7 # 主从复制核心参数 master_info_repository=TABLE relay_log_info_repository=TABLE relay_log_recovery=ON # 自增冲突控制(主主复制) auto_increment_increment=2 auto_increment_offset=1 server-id=1 #mysql2 [mysqld] # join_buffer_size = 128M # sort_buffer_size = 2M # read_rnd_buffer_size = 2M datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock symbolic-links=0 port = 3306 bind-address = 0.0.0.0 default-storage-engine=INNODB character-set-server=utf8 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid validate_password_policy=LOW validate_password_length=6 log-bin=mysql-bin binlog_format=MIXED sync_binlog=1 expire_logs_days=7 master_info_repository=TABLE relay_log_info_repository=TABLE relay_log_recovery=ON auto_increment_increment = 2 auto_increment_offset = 2 server-id=2
参数详解:
参数 | 含义 |
---|---|
log-bin | 开启二进制日志,用于复制 |
binlog_format | 设置二进制日志格式(STATEMENT/ROW/MIXED) |
sync_binlog | 日志同步策略,保证主主一致性 |
expire_logs_days | 自动清理旧日志 |
server-id | 每台主机唯一标识,主主复制必须不同 |
auto_increment_increment/offset | 防止自增主键冲突,主主必配 |
master_info_repository /relay_log_info_repository | 复制信息存储位置,建议表存储更可靠 |
relay_log_recovery | 保证中继日志异常恢复时不会丢数据 |
2. 创建复制账号
#两个mysql都要创建 CREATE USER 'repl'@'%' IDENTIFIED BY '123456'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES;
3. 配置主主复制
-
mysql1
CHANGE MASTER TOMASTER_HOST='172.16.0.115',MASTER_USER='repl',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=313; START SLAVE;
-
mysql2
CHANGE MASTER TOMASTER_HOST='172.16.0.110',MASTER_USER='repl',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=313; START SLAVE;
4. 测试复制状态
SHOW SLAVE STATUS\G
确认 Slave_IO_Running
和 Slave_SQL_Running
均为 Yes
。
二、Keepalived 编译安装与配置
1. 编译安装 Keepalived
# 安装依赖 yum install -y gcc gcc-c++ make openssl-devel pcre-devel libnl3-devel # 下载并解压 cd /opt wget https://www.keepalived.org/software/keepalived-2.2.5.tar.gz tar zxvf keepalived-2.2.5.tar.gz cd keepalived-2.2.5 # 编译安装 ./configure --prefix=/usr/local/keepalived make && make install # 创建配置目录 mkdir -p /usr/local/etc/keepalived mkdir -p /etc/keepalived # 存放检测脚本
2. Keepalived 配置文件示例
路径:/usr/local/etc/keepalived/keepalived.conf
vim /usr/local/etc/keepalived/keepalived.conf #MASTER global_defs {router_id LVS_MASTER #名称标记为master,名字随便取vrrp_gna_interval 0 } vrrp_script check_mysql {script "/etc/keepalived/check_mysql.sh"interval 2 # 每 2 秒检测一次rise 1 # 连续 1 次成功才认为 UPfall 2 # 连续 2 次失败才认为 DOWN,避免短暂波动weight -50 } vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 99priority 200 # MASTER 节点优先级advert_int 1virtual_ipaddress {172.16.0.250}track_script {check_mysql} } #BACKUP global_defs {router_id LVS_SLAVE #名称标记为slave,名字随便取vrrp_gna_interval 0 } vrrp_script check_mysql {script "/etc/keepalived/check_mysql.sh"interval 2 # 每 2 秒检测一次rise 1 # 连续 1 次成功才认为 UPfall 2 # 连续 2 次失败才认为 DOWN,避免短暂波动 } vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 99priority 199 # BACKUP 节点优先级advert_int 1virtual_ipaddress {172.16.0.250}track_script {check_mysql} }
3. MySQL 状态检测脚本
路径:/etc/keepalived/check_mysql.sh
vim /etc/keepalived/check_mysql.sh #!/bin/bash #以下给出两种可选检测方案,自行选择 ------------------------------------------------------------------------- #检测方案1 # 检查 MySQL 是否监听 3306 #if ss -lnt | grep -q ":3306"; then # exit 0 # MySQL up #else # exit 1 # MySQL down #fi ------------------------------------------------------------------------- #检测方案2 echo "$(date) running script" >> /tmp/check_mysql.log #mysqladmin ping -h 127.0.0.1 -uroot -p123456 --ssl-mode=DISABLED > /dev/null 2>&1 (如果报错ssl尝试这条) mysqladmin ping -h 127.0.0.1 -uroot -p123456 > /dev/null 2>&1 if [ $? -ne 0 ]; thenecho "$(date) MySQL down" >> /tmp/check_mysql.logexit 1 fi echo "$(date) MySQL up" >> /tmp/check_mysql.log exit 0
4. 启动 Keepalived
systemctl start keepalived
三、VIP 漂移测试
-
停掉 master 节点 MySQL:
systemctl stop mysqld
-
检查备节点 VIP 是否漂移:
ip a
-
恢复 MySQL:
systemctl start mysqld
VIP 会重新回到原 master(如果 priority 较高)。
四、常见问题
-
MySQL SSL 报错
解决方法:脚本加 --ssl-mode=DISABLED
-
Keepalived “script is already running”
原因:VRRP 同步多次执行脚本,建议脚本内加互斥或使用 systemctl 管理 Keepalived
-
VIP 不漂移
-
检查
track_script
是否正确引用 -
确保 MySQL 检测脚本能准确返回状态
-
检查 Keepalived 权限和 SELinux 状态(建议 Permissive)
五、Keepalived 配置参数详解
1️⃣ 全局配置 global_defs
global_defs {router_id LVS_MASTER # 当前节点标识(唯一名称),用于日志和 VRRP 标识vrrp_gna_interval 0 # VRRP通告组播间隔(通常保持0即可) }
参数说明:
参数 | 含义 |
---|---|
router_id | 节点标识,随便取,但要唯一。VRRP 日志中会显示该 ID。 |
vrrp_gna_interval | 保留字段,可配置 VRRP Gratuitous ARP 的间隔,一般默认 0 即可。 |
2️⃣ VRRP 脚本配置 vrrp_script
vrrp_script check_mysql {script "/etc/keepalived/check_mysql.sh"interval 2rise 1fall 2weight -50 }
参数说明:
参数 | 含义 |
---|---|
script | 指定要执行的脚本路径,用于健康检查(如 MySQL 是否可用) |
interval | 脚本执行间隔,单位秒 |
rise | 连续执行成功达到次数后认为服务恢复 |
fall | 连续执行失败达到次数后认为服务不可用 |
weight | 成功或失败时对节点优先级的增减值(负值表示失败降低优先级) |
示例:如果 priority=150
,weight=-50
,脚本失败后优先级变成 100,VIP 会漂移到 Backup 节点。
3️⃣ VRRP 实例配置 vrrp_instance
vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 50priority 200advert_int 1authentication {auth_type PASSauth_pass 1234}virtual_ipaddress {172.16.0.250}track_script {check_mysql} }
参数说明:
参数 | 含义 |
---|---|
state | 当前节点状态:MASTER 或 BACKUP |
interface | 绑定虚拟 IP 的网卡名称 |
virtual_router_id | VRRP 实例 ID(0-255),Master 和 Backup 要相同,表示同一组 VIP |
priority | VRRP 优先级,Master 节点必须大于 Backup 节点 |
advert_int | VRRP 通告间隔(秒),用于 Master 向 Backup 发送心跳 |
authentication | VRRP 认证,防止非法节点加入 |
virtual_ipaddress | VIP 地址,可配置多个 |
track_script | 绑定健康检查脚本,脚本结果会影响优先级 |
4️⃣ VIP 漂移逻辑
-
Master 节点启动时,优先级最高,持有 VIP。
-
如果
track_script
脚本失败且优先级低于 Backup 节点,VIP 漂移。 -
当 Master 脚本恢复,优先级重新计算,VIP 可漂回。
总结
通过本文步骤:
-
配置了 MySQL 5.7 主主复制,解决自增主键冲突
-
配置 Keepalived 实现 VIP 漂移,提高数据库高可用性
-
使用脚本自动监控 MySQL 服务状态,自动停止/启动 Keepalived
-
解决 MySQL 5.7 SSL 报错问题,保证检测脚本可靠运行