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

 

posted @   阿锋888  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示