前言
环境准备
一、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. 配置主主复制
注意:MASTER_LOG_FILE和MASTER_LOG_FILE通过show master status;查看,这里都是写对方的
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 次成功才认为 UP fall 2 # 连续 2 次失败才认为 DOWN,避免短暂波动 weight -50
}
vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 99 priority 200 # MASTER 节点优先级 advert_int 1 virtual_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 次成功才认为 UP fall 2 # 连续 2 次失败才认为 DOWN,避免短暂波动
}
vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 99 priority 199 # BACKUP 节点优先级 advert_int 1 virtual_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 ]; then echo "$(date) MySQL down" >> /tmp/check_mysql.log exit 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 2 rise 1 fall 2 weight -50
}
参数说明:
参数 | 含义 |
---|---|
script | 指定要执行的脚本路径,用于健康检查(如 MySQL 是否可用) |
interval | 脚本执行间隔,单位秒 |
rise | 连续执行成功达到次数后认为服务恢复 |
fall | 连续执行失败达到次数后认为服务不可用 |
weight | 成功或失败时对节点优先级的增减值(负值表示失败降低优先级) |
示例:如果 priority=150
,weight=-50
,脚本失败后优先级变成 100,VIP 会漂移到 Backup 节点。
3️⃣ VRRP 实例配置 vrrp_instance
vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 50 priority 200 advert_int 1 authentication { auth_type PASS auth_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 报错问题,保证检测脚本可靠运行