【linux服务器】MySQL VIP 高可用方案:Keepalived(三台主机)
MySQL VIP 高可用方案Keepalived三台主机1. 环境假设2. Keepalived 配置server1主库优先级最高server2备库1server3备库23. 工作逻辑4. 与 MySQL 故障切换的配合4.1 编写检测脚本在所有节点4.2 在 Keepalived 配置中调用检测脚本6. 注意事项7. 测试方法当你有三台 MySQL 服务器例如一主两备可以使用 Keepalived 实现 VIP 漂移始终让 VIP 指向当前的主库。以下给出一主两备场景下的 Keepalived 配置方案并说明与 MySQL 复制的配合。1. 环境假设主机IPMySQL 角色Keepalived 角色priorityserver1192.168.100.1当前主库MASTER100server2192.168.100.2备库1BACKUP90server3192.168.100.3备库2BACKUP80VIP192.168.100.100/24网卡接口eth0请根据实际修改2. Keepalived 配置server1主库优先级最高vrrp_script chk_mysql{script/etc/keepalived/check_mysql.shinterval2weight-20}vrrp_instance VI_1{state BACKUP# 所有节点都用 BACKUPnopreempt# 关闭抢占interface eth0 virtual_router_id51priority100# 最高初始为主advert_int1authentication{auth_type PASS auth_pass1111}virtual_ipaddress{192.168.100.100/24}track_script{chk_mysql}}server2备库1vrrp_script chk_mysql{script/etc/keepalived/check_mysql.shinterval2weight-20}vrrp_instance VI_1{state BACKUP nopreempt interface eth0 virtual_router_id51priority90advert_int1authentication{auth_type PASS auth_pass1111}virtual_ipaddress{192.168.100.100/24}track_script{chk_mysql}}server3备库2vrrp_script chk_mysql{script/etc/keepalived/check_mysql.shinterval2weight-20}vrrp_instance VI_1{state BACKUP nopreempt interface eth0 virtual_router_id51priority80advert_int1authentication{auth_type PASS auth_pass1111}virtual_ipaddress{192.168.100.100/24}track_script{chk_mysql}}3. 工作逻辑正常时VIP 在 server1主库上所有应用连接 VIP。server1 宕机Keepalived 检测到故障VIP 自动漂移到优先级次高的 server290 80。此时 server2 必须先被提升为 MySQL 主库STOP SLAVE; RESET SLAVE ALL;否则应用会连到只读备库。server1 恢复由于设置 state MASTER 和较高 priorityVIP 会抢占回 server1若原主库已恢复且需要重新作为主库。如果不想自动抢占可以设置 nopreempt并调整状态为 BACKUP。4. 与 MySQL 故障切换的配合Keepalived 只负责 IP 漂移不管 MySQL 角色。你必须确保 VIP 所在的服务器就是可写的 MySQL 主库。可以编写一个简单的 检测脚本让 Keepalived 在判断自身是否为主库后再决定是否持有 VIP。这样即使优先级高但如果本机不是主库也会释放 VIP。4.1 编写检测脚本在所有节点/etc/keepalived/check_mysql.sh#!/bin/bash#检查本机 MySQL 是否可写即当前不是只读的备库mysql-uroot -p你的密码-eSELECT 1;/dev/nullif[$?-ne0];thenexit1# 连接失败释放 VIPfi检查 read_only 是否为 OFF主库才可写READ_ONLY$(mysql-uroot -p你的密码-eSHOW VARIABLES LIKE read_only;|grep-cOFF)if[$READ_ONLY-eq1];thenexit0# 是主库可以持有 VIPelseexit1# 是只读备库释放 VIPfichmodx /etc/keepalived/check_mysql.sh4.2 在 Keepalived 配置中调用检测脚本在每个节点的 keepalived.conf 的 vrrp_instance 段内添加track_script{chk_mysql}并在全局部分定义脚本vrrp_script chk_mysql{script/etc/keepalived/check_mysql.shinterval2# 每 2 秒检查一次weight-20# 失败时降低优先级 20确保 VIP 被其他节点接管}注意weight 的绝对值应大于最高优先级与其他节点的差值。例如 priority 差值为 10这里设 -20 可确保一旦本机不是主库VIP 就会漂移。. 手动切换后的流程当需要主动切换如维护时在新主库上执行 STOP SLAVE; RESET SLAVE ALL;确保 read_onlyOFF。在原主库上手动停止 Keepalived 或将其 priority 调低VIP 自动漂移到新主库。应用无需更改任何连接信息。6. 注意事项所有节点的 keepalived 配置中 virtual_router_id 必须一致同一组 VRRP。确保 authentication 密码一致。防火墙放行 VRRP 协议firewall-cmd --add-protocolvrrp --permanent; firewall-cmd --reloadVIP 必须与实际网卡同网段且未被其他设备占用。检测脚本中的数据库密码需妥善保管可限制权限文件读取。7. 测试方法在主库上查看 VIPipaddr show eth0|grep192.168.100.100 应看到 VIP。停止主库 MySQL 或 Keepalived观察 VIP 是否漂移到优先级最高的备库。在备库上提升为可写主库后检查 read_only 状态应用应能正常连接 VIP 写入。