mysql 8.0主主复制必须先对齐gtid或binlog位置,否则keepalived vip漂移后会导致数据覆盖、主键冲突或复制中断;需用mysqldump全量同步并校验master status,启用gtid复制,严格检查复制状态与mysql可写性,合理配置keepalived的state、priority、virtual_router_id及arp通告。

MySQL8.0主主复制必须先对齐,否则Keepalived接管后写入会丢数据
Keepalived只管VIP漂移,不管数据一致性。如果两台MySQL的gtid_executed或binlog position不一致,VIP切过去立刻写入,就可能覆盖未同步的事务,甚至触发主键冲突或复制中断。
实操要点:
- 初始化时用
mysqldump --all-databases --master-data=2 --single-transaction导出全量,再导入到另一台,而不是直接拷贝data/目录(容易漏掉mysql.ibd或sys库) - 导入后在两台都执行
SHOW MASTER STATUS,确认File和Position完全相同;再分别执行CHANGE MASTER TO ... MASTER_AUTO_POSITION=1启用GTID复制 - 检查
SELECT * FROM performance_schema.replication_connection_status\G,确保LAST_IO_ERROR和LAST_SQL_ERROR为空,且CONNECTED为YES
Keepalived配置里最容易被忽略的MySQL健康检查脚本
默认vrrp_script只检查mysqld进程是否存在,但MySQL进程活着、连接超时、复制延迟大、只读模式开启,都会导致VIP切过去后无法写入。
推荐检查逻辑(保存为/etc/keepalived/check_mysql.sh):
#!/bin/bash
# 检查MySQL是否可连、是否可写、复制是否正常
if mysql -ulft -p'Lft@6666' -h127.0.0.1 -P3306 -e "SELECT 1" &>/dev/null; then
if mysql -ulft -p'Lft@6666' -h127.0.0.1 -P3306 -e "CREATE TEMPORARY TABLE _test_ (id INT) ENGINE=InnoDB" &>/dev/null; then
if mysql -ulft -p'Lft@6666' -h127.0.0.1 -P3306 -e "SELECT SERVICE_STATE FROM performance_schema.replication_applier_status WHERE CHANNEL_NAME=''" 2>/dev/null | grep -q "ON"; then
exit 0
fi
fi
fi
exit 1
关键点:
- 必须加
--connect-timeout=3参数,否则一次卡顿就拖慢整个VRRP检测周期 - 不能只用
mysqladmin ping,它不校验权限和写能力 - 脚本需
chmod +x,且keepalived运行用户(通常是root)要有执行权限
Keepalived的state和priority配错会导致VIP反复漂移
常见错误是两台都配成state MASTER,或优先级相同(如都是100),结果VRRP选举失败,VIP在两台间抖动。
正确做法:
- Node1(如
192.168.11.111)配state MASTER、priority 100 - Node2(如
192.168.11.112)配state BACKUP、priority 90 - 务必设置
virtual_router_id相同(比如51),且该ID在局域网内唯一(避免和其他Keepalived集群冲突) - 禁用抢占(
nopreempt)更稳妥:故障恢复后不抢回VIP,避免刚切回来又因网络抖动再次切换
局域网ARP缓存没刷新,应用连不上新VIP
VIP漂移后,客户端本地ARP表仍缓存着旧MAC地址,导致发包失败。这不是Keepalived配置问题,而是网络层现象。
缓解方式:
- 在Keepalived的
notify脚本中加入arping -c 3 -I eth0 -s $VIP $VIP主动通告 - 应用端连接字符串里不要硬编码
127.0.0.1或localhost,必须用VIP(如192.168.11.150) - 客户端若使用连接池(如HikariCP),需设置
connection-test-query=SELECT 1和合理validation-timeout,及时剔除失效连接
双主架构里,最麻烦的永远不是VIP切不切得过去,而是切过去之后——那条SQL到底有没有真正落盘。复制延迟、半同步超时、GTID gap,任何一个环节没盯住,VIP就是把流量精准引向数据黑洞。











