以下是基于 Keepalived + VIP 实现 MySQL 主从复制高可用的详细步骤,涵盖主从复制搭建与故障自动切换:
修改配置文件 /etc/my.cnf:
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=test_db # 指定需要同步的数据库(可选)
重启 MySQL:systemctl restart mysqld
创建复制账号:
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'Repl_Pass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
查看主库状态:
SHOW MASTER STATUS; -- 记录 File(如 mysql-bin.000001)和 Position(如 154)
修改配置文件 /etc/my.cnf:
[mysqld]
server-id=2
relay-log=mysql-relay-bin
read_only=1 # 从库只读(可选)
重启 MySQL:systemctl restart mysqld
导入主库数据(若主库已有数据):
# 主库导出数据
mysqldump -uroot -p --databases test_db > /tmp/backup.sql
# 从库导入数据
mysql -uroot -p < /tmp/backup.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;
验证复制状态:
SHOW SLAVE STATUS\G
-- 确保 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes
| 角色 | IP | VIP |
|---|---|---|
| MySQL Master | 192.168.1.10 | 192.168.1.100 |
| MySQL Slave | 192.168.1.11 |
在两台 MySQL 节点安装 Keepalived:
yum install keepalived -y # CentOS
apt install keepalived -y # Ubuntu
主库(Master)配置 /etc/keepalived/keepalived.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:
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
}
}
创建 /etc/keepalived/check_mysql.sh(两节点均需配置):
#!/bin/bash
if ! systemctl is-active mysqld >/dev/null 2>&1; then
exit 1 # MySQL停止,触发VIP漂移
else
exit 0
fi
赋予执行权限:
chmod +x /etc/keepalived/check_mysql.sh
systemctl start keepalived
systemctl enable keepalived
在主库执行:
ip addr show eth0 | grep 192.168.1.100
应看到 VIP 绑定在主库的网卡上。
停止主库的 MySQL 服务:
systemctl stop mysqld
观察 VIP 是否漂移到从库(约 2~5 秒):
# 在从库执行
ip addr show eth0 | grep 192.168.1.100
重启主库的 MySQL 和 Keepalived:
systemctl start mysqld
systemctl restart keepalived
VIP 应自动回到主库(需确保主库优先级更高)。
| 优点 | 缺点 |
|---|---|
| 简单轻量,快速切换(秒级) | 需手动处理主从复制链路切换 |
| 与应用解耦,无需修改应用配置 | 依赖脚本实现故障检测,可靠性依赖脚本逻辑 |
| 适合小规模集群 | 不自动处理数据一致性校验 |

