keepalived高可用
安装keepalived
yum -y install keepalived yum install psmisc -y #需要用到killall指令做健康检查
Keepalived 配置
配置为非抢占模式-----主备切换后,主的恢复后,VIP不主动切回主节点
此模式存在问题---vip飘到备节点,备节点故障后,vip也不会主动飘到主节点,所以备节点增加脚本使其故障后,重启keepaived使vip飘到主节点
解决办法是两个节点均是backup角色时均配置或者均不配置“nopreempt”
前言:
注意: 同一网段中virtual_router_id的值不能重复,否则会出错,相关错误信息如下。 Keepalived_vrrp[27120]: ip address associated with VRID not present in received packet : one or more VIP associated with VRID mismatch actual MASTER advert bogus VRRP packet received on eth1 !!! receive an invalid ip number count associated with VRID! VRRP_Instance(xxx) ignoring received advertisment... 问题排查: 通过tcpdump抓包并过滤vrid,可以发现同一个vrid对应的主机,进而判断是否这些主机隶属同一个集群 tcpdump -nn -i any net 224.0.0.0/8 如: [root@CN-DJI-PLB1 ~]# tcpdump -nn -i any net 10.104.15.0/24 |grep vrid tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes 13:50:46.778532 IP 10.104.15.33 > 224.0.0.18: VRRPv2, Advertisement, vrid 55, prio 100, authtype simple, intvl 1s, length 20 13:50:47.778735 IP 10.104.15.61 > 224.0.0.18: VRRPv2, Advertisement, vrid 55, prio 95, authtype simple, intvl 1s, length 20 13:50:47.778748 IP 10.104.15.33 > 224.0.0.18: VRRPv2, Advertisement, vrid 55, prio 100, authtype simple, intvl 1s, length 20 13:50:48.778899 IP 10.104.15.63 > 224.0.0.18: VRRPv2, Advertisement, vrid 55, prio 98, authtype simple, intvl 1s, length 20 13:50:49.779096 IP 10.104.15.61 > 224.0.0.18: VRRPv2, Advertisement, vrid 55, prio 95, authtype simple, intvl 1s, length 20 13:50:50.779518 IP 10.104.15.33 > 224.0.0.18: VRRPv2, Advertisement, vrid 55, prio 100, authtype simple, intvl 1s, length 20 13:50:51.779755 IP 10.104.15.33 > 224.0.0.18: VRRPv2, Advertisement, vrid 55, prio 100, authtype simple, intvl 1s, length 20 13:51:01.783737 IP 10.104.15.61 > 224.0.0.18: VRRPv2, Advertisement, vrid 55, prio 95, authtype simple, intvl 1s, length 20 13:51:02.784253 IP 10.104.15.63 > 224.0.0.18: VRRPv2, Advertisement, vrid 55, prio 98, authtype simple, intvl 1s, length 20
主节点配置
/etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { vrrp_skip_check_adv_addr } vrrp_script check_Mysqld { script "killall -0 mysqld" #mysqld为system服务名 interval 2 # 检测间隔时间,即两秒检测一次 fall 2 # 检测失败的最大次数,超过两次认为节点资源发生故障 rise 2 # 请求两次成功认为节点恢复正常 weight -50 #一个正整数或负整数。权重值,关系到整个集群角色选举 } vrrp_instance VI_1 { state BACKUP #非抢占模式都为BACKUP,抢占模式主节点配置MASTER interface eth0 #网卡 virtual_router_id 66 #取值在0-255之间,keepalived集群同一id nopreempt #非抢占模式参数,只在主节点配置 priority 100 #主备优先级不一致 advert_int 1 authentication { auth_type PASS auth_pass Aa123456 } virtual_ipaddress { 172.25.209.30/26 #vip,注意填写真实网段 } track_script { check_Mysqld #对应上方vrrp_script } }
实现效果: 如果 mysqld 进程存在并且运行正常,killall -0 mysqld 脚本返回成功,VRRP 实例的权重会减少 50,但不会改变其角色。 如果 mysqld 进程不存在,脚本返回失败,连续两次失败会触发 VRRP 认为此节点不可用,并且可能会触发主备切换。 脚本返回成功两次(表示 mysqld 已恢复),则节点权重会恢复,从而有机会重新成为主节点。
从节点配置
/etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { vrrp_skip_check_adv_addr } vrrp_script check_Mysqld { script "/etc/keepalived/.chk_mysql.sh" #检测重启脚本 interval 2 # 检测间隔时间,即两秒检测一次 fall 2 # 检测失败的最大次数,超过两次认为节点资源发生故障 rise 2 # 请求两次成功认为节点恢复正常 weight -50 #一个正整数或负整数。权重值,关系到整个集群角色选举 } vrrp_instance VI_1 { state BACKUP #非抢占模式都为BACKUP,抢占模式主节点配置MASTER interface eth0 #网卡 virtual_router_id 66 #取值在0-255之间,keepalived集群同一id priority 90 #主备优先级不一致 advert_int 1 authentication { auth_type PASS auth_pass Aa123456 } virtual_ipaddress { 172.25.209.30/26 #vip,注意填写真实网段 } track_script { check_Mysqld #对应上方vrrp_script } }
/etc/keepalived/.chk_mysql.sh #!/bin/bash pidcount=$(ps -C mysql --no-header | wc -l) if [ $pidcount -eq 0 ];then systemctl restart mysqld if [ $(ps -C mysqld --no-header | wc -l) -eq 0 ];then killall keepalived exit 1 fi fi exit 0
vim /usr/lib/systemd/system/keepalived.service [Unit] Description=LVS and VRRP High Availability Monitor After=syslog.target network-online.target [Service] Type=forking PIDFile=/var/run/keepalived.pid KillMode=process EnvironmentFile=-/etc/sysconfig/keepalived ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS ExecReload=/bin/kill -HUP $MAINPID Restart=always RestartSec=60s #避免keepalived重启过快导致vip不切换,设置60s后再启动 [Install] WantedBy=multi-user.target
配置开机自启,启动服务
systemctl daemon-reload
systemctl enable keepalived --now && systemctl status keepalived
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?