以下是基于 Keepalived + VIP 实现 MySQL 主从复制高可用的详细步骤,涵盖主从复制搭建与故障自动切换:
一、MySQL 主从复制搭建(基础步骤回顾)
1. 主库(Master)配置
修改配置文件 /etc/my.cnf:
ini
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=test_db # 指定需要同步的数据库(可选)
重启 MySQL:systemctl restart mysqld
创建复制账号:
sql
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'Repl_Pass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
查看主库状态:
sql
SHOW MASTER STATUS; -- 记录 File(如 mysql-bin.000001)和 Position(如 154)
2. 从库(Slave)配置
修改配置文件 /etc/my.cnf:
ini
[mysqld]
server-id=2
relay-log=mysql-relay-bin
read_only=1 # 从库只读(可选)
重启 MySQL:systemctl restart mysqld
导入主库数据(若主库已有数据):
bash
# 主库导出数据
mysqldump -uroot -p --databases test_db > /tmp/backup.sql
# 从库导入数据
mysql -uroot -p < /tmp/backup.sql
配置主从链路:
sql
CHANGE MASTER TO
MASTER_HOST='主库IP',
MASTER_USER='repl_user',
MASTER_PASSWORD='Repl_Pass123!',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;
验证复制状态:
sql
SHOW SLAVE STATUS\G
-- 确保 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes
二、Keepalived + VIP 高可用配置
1. 环境规划
角色 | IP | VIP |
---|---|---|
MySQL Master | 192.168.1.10 | 192.168.1.100 |
MySQL Slave | 192.168.1.11 |
2. Install Keepalived
在两台 MySQL 节点安装 Keepalived:
bash
yum install keepalived -y # CentOS
apt install keepalived -y # Ubuntu
3. 配置 Keepalived
主库(Master)配置 /etc/keepalived/keepalived.conf:
conf
global_defs {
router_id mysql_ha_master
}
vrrp_script chk_mysql {
script "/etc/keepalived/check_mysql.sh" # 检测MySQL是否存活
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0 # 网卡名称
virtual_router_id 51
priority 100 # 主库优先级高于从库(如从库设为90)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100/24 # VIP
}
track_script {
chk_mysql # 绑定健康检查脚本
}
}
从库(Slave)配置 /etc/keepalived/keepalived.conf:
conf
global_defs {
router_id mysql_ha_slave
}
vrrp_script chk_mysql {
script "/etc/keepalived/check_mysql.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
chk_mysql
}
}
4. 编写 MySQL 健康检查脚本
创建 /etc/keepalived/check_mysql.sh(两节点均需配置):
bash
#!/bin/bash
if ! systemctl is-active mysqld >/dev/null 2>&1; then
exit 1 # MySQL停止,触发VIP漂移
else
exit 0
fi
赋予执行权限:
bash
chmod +x /etc/keepalived/check_mysql.sh
5. 启动 Keepalived
bash
systemctl start keepalived
systemctl enable keepalived
三、验证高可用性
1. 查看 VIP 绑定状态
在主库执行:
bash
ip addr show eth0 | grep 192.168.1.100
应看到 VIP 绑定在主库的网卡上。
2. 模拟主库故障
停止主库的 MySQL 服务:
bash
systemctl stop mysqld
观察 VIP 是否漂移到从库(约 2~5 秒):
bash
# 在从库执行
ip addr show eth0 | grep 192.168.1.100
3. 恢复主库后 VIP 回切
重启主库的 MySQL 和 Keepalived:
bash
systemctl start mysqld
systemctl restart keepalived
VIP 应自动回到主库(需确保主库优先级更高)。
四、注意事项
脑裂问题:
- 使用 vrrp_script 检测 MySQL 服务状态,避免仅依赖网络存活导致脑裂。
- 可在防火墙中禁止 VRRP 协议的多播包(iptables 或 firewalld 配置)。
主从切换后的处理:
- 若 VIP 漂移到从库,需手动或通过脚本执行 STOP SLAVE; 并提升为新的主库。
- 原主库恢复后,需重新配置为主从复制中的从库。
应用连接配置:
- 应用程序应通过 VIP(192.168.1.100)连接数据库,而非直接使用物理 IP。
五、方案优缺点
优点 | 缺点 |
---|---|
简单轻量,快速切换(秒级) | 需手动处理主从复制链路切换 |
与应用解耦,无需修改应用配置 | 依赖脚本实现故障检测,可靠性依赖脚本逻辑 |
适合小规模集群 | 不自动处理数据一致性校验 |