之前就想写一个关于keepalive的,但因为网上的资料很多,想算了。后来自己又操作了一下,觉得还是自己写得用起来方便。

安装:

下载keepalived最新源码包:

https://www.keepalived.org/download.html

安装方法一:

./configure
make
make install

安装方法二:

源码包中自带spec,使用rpmbuild -bb命令,把包编译成rpm然后给服务器安装。
安装命令:

rpm -ivh keepalived-2.1.5-1.el7.x86_64.rpm

安装方法三:

直接用"yum -y install keepalived"安装,但这样安装的包不是最新版本也勉强能用。

配置及启停

配置

! Configuration File for keepalived

vrrp_script check_ngx_alive {
    script "/etc/keepalived/check_ngx_alive.sh"  # 状态检测脚本
    interval 2   # 状态检测时间间隔
    weight -10   # 当状态检测脚本返回非0值时当前节点priority在设置值基础上降低多少
}
global_defs {
   notification_email {
     #acassen@firewall.loc
     #failover@firewall.loc
     #sysadmin@firewall.loc
   }
   #notification_email_from Alexandre.Cassen@firewall.loc
   #smtp_server 192.168.200.1
   #smtp_connect_timeout 30
   router_id LVS_DEVEL_112   # 保证名称唯一
   script_user root          # 指定脚本运行的用户
   enable_script_security    
   #vrrp_skip_check_adv_addr
   #vrrp_strict
   #vrrp_garp_interval 0
   #vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface ens32      #发vrrp包的接口,可以选择一对专用接口做心跳线
    virtual_router_id 51
    priority 112         #优先级,keepalived会根据优先级判断是主是从
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {   # 设置VIP
        192.168.15.110/24 dev ens32   # 还可以设置得更复杂一点如"192.168.1.33/24 brd 192.168.1.255 dev eno1 label eno1:1",如果不指定王凯,就绑定到interface配置的接口
    }
    track_script {        # 设置检测脚本
        check_ngx_alive   # vrrp_script上面定义的检测脚本的名称
    }
	notify_master "/etc/keepalived/arp_update.sh"   # 变成主节点后执行的脚本
	notify_backup "/etc/keepalived/notify.sh backup" #同理,变成bakup时执行的脚本
	notify_fault  "/etc/keepalived/notify.sh fault"  
	preempt_delay 3  # 变成主节点后多长时间抢占VIP,如果不需要切换可直接写nopreempt
}

virtual_server 192.168.15.110 8034 { # LVS的相关配置
    delay_loop 6    # 每隔6秒查询realserver状态
    lb_algo rr      # lvs的调度算法
    lb_kind DR      # lvs的集群模式
    persistence_timeout 50  #指定时间内来自同一Client的请求会被发送到同一个RealServer
    protocol TCP   

    real_server 192.168.15.112 8034 {
        weight 1
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 1554
        }
    }
}

启停

systemctl start keepalived     #启动
systemctl stop keepalived      #停止
systemctl restart keepalived   #重启
systemctl status keepalived    #查看状态

脚本参考

check_ngx_alive.sh

if [ `ps aux | grep nginx | grep -v grep | wc -l` -eq 0 ];then
    exit 1
fi
exit 0

arp_update.sh

#!/bin/bash

VIP=192.168.15.110
GATEWAY=192.168.15.253
/sbin/arping -I ens32 -c 5 -s $VIP $GATEWAY &>/dev/null

keepalive.conf

! Configuration File for keepalived

vrrp_script check_ngx_alive
{
    script "/etc/keepalived/check_ngx_alive.sh"
    interval 2
    weight -30
    user root
}
global_defs {
   notification_email {
     #acassen@firewall.loc
     #failover@firewall.loc
     #sysadmin@firewall.loc
   }
   router_id LVS_DEVEL_112
   script_user root
   enable_script_security
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens32
    virtual_router_id 51
    priority 112
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.15.110/24 dev ens32
    }
    track_script {
        check_ngx_alive
    }
    notify_master "/etc/keepalived/arp_update.sh"
    #nopreempt
    preempt_delay 3
}

验证及结果

场景1 双机热备

使用keepalive做主备有两种方法
前提:主priority + 主vrrp_script.weight < 备priority (注:vrrp_script.weight是一个负数)
方法一:
主设置nopreempt,state:MASTER,vrrp_script指定的脚本中,当服务不存在时执行"systemctl stop keepalived"
方法二:
两个节点都设置为"preempt_delay 3,state:BACKUP",vrrp_script指定的脚本中不需要停止keepalive

场景2 冷备

配置方法:
两个节点都设置为"preempt_delay 3,state:BACKUP",vrrp_script指定的脚本中不需要停止keepalive
主priority > 备priority; 主priority + 主vrrp_script.weight < 备priority + 备vrrp_script.weight
备的notify_master脚本中添加启动服务的命令;在备机中,服务最初处于关闭状态.

原理描述:当主上的服务挂掉之后,主priority小于备机的priority,备机变成master,触发备机的notify_master脚本,此时备机上的服务被开启,备机的优先级升高。

遇到的问题和解决方法

1. vrrp_script不执行;

答:(1)先用"tail -f /var/log/message"查看报了什么错。
(2)赋予脚本权限 chmod 755 xxx.sh,记住一定要是755.
(3)手动执行脚本,看脚本是否正常执行;(后来发现,如果用 echo "$(date)" >> xxx.log的方式判断是否执行判断不出来,好像echo已经被屏蔽了一样。但是脚本确实已经执行了,从启停服务上看是正常的.)
(4)脚本的名称问题,比如叫"check_nginx_status.sh"结果脚本里判断条件是"ps -ef | grep nginx | grep -v grep | wc -l -eq 2",这时候会导致运行脚本的进程会被算到ps的统计里面去,导致脚本执行不准;
(5)看脚本前面是不是加了"#!/bin/bash",否则keepalive不知道用sh还是bash来执行你的脚本

2.notify_master等脚本不执行,配置不生效的问题;

答:首先查看是否打开了SELINUX;

getenforce

如果是,那有几种办法:
(1)关掉SELINUX

setenforce 0   #临时关闭
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config #重启后永久生效

(2)赋予脚本安全执行权限;

chcon -t keepalived_unconfined_script_exec_t /etc/keepalived/arp_update.sh

3.如何判断VIP是否漂移?

方法一:在服务器上使用"ip addr"命令,查看VIP在哪台上,就是漂移到哪台上了。
方法二:查看/var/log/message日志
方法三: 在其他终端上ping以下VIP,然后用"arp -a"命令查看vip对应的MAC地址是哪个就是哪个了。

4.VIP漂移很慢的问题;

答:这个也没有什么好办法,可以用下面的脚本试试;就是用arping更新arp信息,写在notify_master脚本中;

VIP=192.168.15.110
GATEWAY=192.168.15.253
/sbin/arping -I ens32 -c 5 -s $VIP $GATEWAY &>/dev/null

不知道在你的环境中是怎样的,我测试的结果是失败的。在同网段不管用不用arping VIP漂移都是实时生效的,但是跨网段很长时间都是连接异常。
网关的arp列表有时候迟迟不刷新,有时候刷新了还是连接不上,折腾了一阵还是没有解决。
难道是需要路由器开启VRRP协议?理论上是不需要的,路由器的VRRP协议是为了备份路由的,好像和KeepAlive没有管理。因为家用路由器没那选项,公司的路由器还没试过。有条件的同学可以尝试一下:
参考地址:https://www.cisco.com/c/en/us/support/docs/security/vpn-3000-series-concentrators/7210-vrrp.html
如果成功了记得回复我一下。

参考地址:

https://www.cnblogs.com/shuiguizi/p/11172267.html

posted on 2020-09-04 14:31  步孤天  阅读(2636)  评论(0编辑  收藏  举报