[一、MySQL 5.7 主主复制配置](#一、MySQL 5.7 主主复制配置)
[1. 修改 my.cnf 核心配置](#1. 修改 my.cnf 核心配置)
[2. 创建复制账号](#2. 创建复制账号)
[3. 配置主主复制](#3. 配置主主复制)
[4. 测试复制状态](#4. 测试复制状态)
[二、Keepalived 编译安装与配置](#二、Keepalived 编译安装与配置)
[1. 编译安装 Keepalived](#1. 编译安装 Keepalived)
[2. Keepalived 配置文件示例](#2. Keepalived 配置文件示例)
[3. MySQL 状态检测脚本](#3. MySQL 状态检测脚本)
[4. 启动 Keepalived](#4. 启动 Keepalived)
[三、VIP 漂移测试](#三、VIP 漂移测试)
[五、Keepalived 配置参数详解](#五、Keepalived 配置参数详解)
[1️⃣ 全局配置 global_defs](#1️⃣ 全局配置 global_defs)
[2️⃣ VRRP 脚本配置 vrrp_script](#2️⃣ VRRP 脚本配置 vrrp_script)
[3️⃣ VRRP 实例配置 vrrp_instance](#3️⃣ VRRP 实例配置 vrrp_instance)
[4️⃣ VIP 漂移逻辑](#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 TO
MASTER_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 TO
MASTER_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 报错问题,保证检测脚本可靠运行