keepalive单实例通过脚本绑定外部服务实现主备自动切换

    科技2026-06-13  1

              keepalive单实例通过脚本绑定外部服务实现主备自动切换

    keepalive是一款优秀的高可用(HA--high alive,这的高可用指的是keepalive)负载均衡器,当然,nginx也可以作为负载均衡器使用,但,keepalive是专业的负载均衡,因此相比较于nginx,功能更为丰富强大。(专业的人做专业的事,同样的道理,专业的keepalive更为高效强大。)

    keepalive集成了lvs的所有功能,包括lvs的四种模式和十种算法,不仅如此,还集成了心跳检测,当然,这个检测是通过keepalive引入脚本实现,脚本的灵活和强大不用多说了。我们说keepalive专业就专业在这了。

    实验架构介绍:

    两台服务器,系统版本centos7。

    192.168.0.16   安装keepalive和killall和httpd,keepalive是单实例,backup模式,全部使用yum方式安装。selinux关闭状态。

    192.168.0.17    安装keepalive和killall和httpd,keepalive是单实例,backup模式,全部使用yum方式安装。selinux关闭状态。

    需要说明的是,killall 最小化安装的系统是没有的,必须yum安装后才可使用该命令

    实验目的:

    需要达成的目标为:第三方访问keepalive的vip时,能够实现网页的动态的负载均衡,keepalive检测到其中一台服务器的httpd服务意外停止时,尝试恢复httpd,如果未成功,自动切换到备用keepalive服务器,故障服务器恢复后并不抢占回keepalive,保持业务的稳定。当然,集群数量比较少,如果规模更大,效果会更明显。(keepalive服务绑定了httpd服务,keepalive是高可用,那么,httpd服务自然也是高可用啦,)

    安装步骤:

    两台机器上执行同样的操作:

    yum install keepalived httpd psmisc -y #安装

    systemctl enable keepalived httpd && systemctl start keepalived httpd#启动服务

    echo "192.168.0.16" > /var/www/html/index.html #16这个机器写入测试页面

    echo "192.168.0.17" > /var/www/html/index.html#17这个机器写入测试页面

    配置步骤:

    192.168.0.16的 /etc/keepalived/keepalived.conf

    global_defs { notification_email { root@localhost #默认三个地址,修改可用地址 } notification_email_from root@localhost smtp_server localhost smtp_connect_timeout 30 router_id centos6 #标识当前节点名字,两个节点的此项需要不相同。 } #默认的配置文件中,使用第三方 smtp 服务器,但这在现实中几乎没有意义,发不出邮件,我们将其指定为 localhost, 我们也可以将通知信息的发送交给本地 sendmail 服务处理。 vrrp_script check_httpd_services { script "/etc/keepalived/check_httpd.sh" interval 3 weight -20 } vrrp_instance apache { #定义一个实例,一个集群就是一个实例。 默认VI_1 可以随意改 state BACKUP #指定 A 节点为主节点 备用节点上设置为 BACKUP 即可 interface ens33 #绑定虚拟 IP 的网络接口 virtual_router_id 51 #VRRP 组名,两个节点的设置必须一样,以指明各个节点属于同一 VRRP 组 priority 100 #主节点的优先级(1-254 之间),备用节点必须比主节点优先级低 nopreempt #不抢占,也就是说,如果slave启用后,同时master恢复了,并不启动master。两个都需要设置为slave advert_int 1 #组播信息发送间隔,两个节点设置必须一样 authentication { #设置验证信息,两个节点必须一致 auth_type PASS auth_pass 1111 } track_script { check_httpd_services } virtual_ipaddress { 192.168.0.15 #指定虚拟 IP, 两个节点设置必须一样 } } #类似添加虚拟一个服务 ipvsadm -A -t 192.168.1.70:80 -s rr virtual_server 192.168.0.15 80 { #对虚拟IP63添加LVS相关内容 delay_loop 6 #Keepalived 多长时间监测一次 RS lb_algo sh #分发算法 lb_kind DR #DR 模式 nat_mask 255.255.255.0 persistence_timeout 50 #同一 IP 50秒内的请求都发到同个real server ,这个会影响LVS的 rr 调度算法, 同一 IP 超过 50 秒后,再次访问,才会被转发到另 #一台 real server 上。 persistence 持久性的意思.这里是注释了,为了测试迅速些。 protocol TCP # ipvsadm -a -t 192.168.2.111:80 -r 192.168.2.64 -g 添加的内容,类似这条命令 # ipvsadm -a -t 192.168.2.111:80 -r 192.168.2.65 –g 添加的内容,类似这条命令 real_server 192.168.0.16 80 { #配置服务节点 1,需要指定 realserver 的真实 IP 地址和端口,IP不端口之间用空格隔开 weight 1 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器 TCP_CHECK { #这段内容手动添加,把以前的内容删除 connect_timeout 3 #表示 3 秒无响应超时 nb_get_retry 3 #表示重试次数 delay_before_retry 3 #表示重试间隔 connect_port 80 #检测端口 } } real_server 192.168.0.17 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }

    192.168.0.17的 /etc/keepalived/keepalived.conf

    global_defs { notification_email { root@localhost #默认三个地址,修改可用地址 } notification_email_from root@localhost smtp_server localhost smtp_connect_timeout 30 router_id centos7 #标识当前节点名字,两个节点的此项需要不相同。 } #默认的配置文件中,使用第三方 smtp 服务器,但这在现实中几乎没有意义,发不出邮件,我们将其指定为 localhost, 我们也可以将通知信息的发送交给本地 sendmail 服务处理。 vrrp_script check_httpd_services { script "/etc/keepalived/check_httpd.sh" interval 3 weight -20 } vrrp_instance apache { #定义一个实例,一个集群就是一个实例。 默认VI_1 可以随意改 state BACKUP #指定 A 节点为主节点 备用节点上设置为 BACKUP 即可 interface ens33 #绑定虚拟 IP 的网络接口 virtual_router_id 51 #VRRP 组名,两个节点的设置必须一样,以指明各个节点属于同一 VRRP 组 priority 90 #主节点的优先级(1-254 之间),备用节点必须比主节点优先级低 nopreempt #不抢占,也就是说,如果slave启用后,同时master恢复了,并不启动master。两个都需要设置为backup advert_int 1 #组播信息发送间隔,两个节点设置必须一样 authentication { #设置验证信息,两个节点必须一致 auth_type PASS auth_pass 1111 } track_script { check_httpd_services } virtual_ipaddress { 192.168.0.15 #指定虚拟 IP, 两个节点设置必须一样 } } #类似添加虚拟一个服务 ipvsadm -A -t 192.168.1.70:80 -s rr virtual_server 192.168.1.15 80 { #对虚拟IP63添加LVS相关内容 delay_loop 6 #Keepalived 多长时间监测一次 RS lb_algo rr #分发算法 lb_kind DR #DR 模式 nat_mask 255.255.255.0 persistence_timeout 50 #同一 IP 50秒内的请求都发到同个real server ,这个会影响LVS的 rr 调度算法, 同一 IP 超过 50 秒后,再次访问,才会被转发到另 #一台 real server 上。 persistence 持久性的意思.这里是注释了,为了测试迅速些。 protocol TCP # ipvsadm -a -t 192.168.2.111:80 -r 192.168.2.64 -g 添加的内容,类似这条命令 # ipvsadm -a -t 192.168.2.111:80 -r 192.168.2.65 –g 添加的内容,类似这条命令 real_server 192.168.0.16 80 { #配置服务节点 1,需要指定 realserver 的真实 IP 地址和端口,IP不端口之间用空格隔开 weight 1 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器 TCP_CHECK { #这段内容手动添加,把以前的内容删除 connect_timeout 3 #表示 3 秒无响应超时 nb_get_retry 3 #表示重试次数 delay_before_retry 3 #表示重试间隔 connect_port 80 #检测端口 } } real_server 192.168.0.17 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }

    /etc/keepalived/check_httpd.sh   两个服务器都要有这个脚本.脚本赋予可执行权限。

    chmod +x   /etc/keepalived/check_httpd.sh

    #!/biu/bash #!author zsk_john #count=`ps -ef|grep httpd|grep -v grep|grep -v $0|wc -l` count=`/sbin/pidof httpd | wc -l` if [ $count -eq 0 ] then systemctl restart httpd sleep 5 if [ $count -eq 0 ] then killall keepalived fi fi

    两台机器都需要执行的脚本(启动lvs的脚本):

    #!/bin/bash #description:start relserver VIP=192.168.0.15 source /etc/init.d/functions #加载环境变量(可以加载所有的环境变量) case $1 in start) echo 'start LVS of Realserver DR' /sbin/ifconfig lo:1 $VIP broadcast $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev lo:1 echo '1' > /proc/sys/net/ipv4/conf/lo/arp_ignore echo '2' > /proc/sys/net/ipv4/conf/lo/arp_announce echo '1' > /proc/sys/net/ipv4/conf/all/arp_ignore echo '2' > /proc/sys/net/ipv4/conf/all/arp_announce ;; stop) /sbin/ifconfig lo:1 down echo 'Close LVS of Realserver DR' echo '0' > /proc/sys/net/ipv4/conf/lo/arp_ignore echo '0' > /proc/sys/net/ipv4/conf/lo/arp_announce echo '0' > /proc/sys/net/ipv4/conf/all/arp_ignore echo '0' > /proc/sys/net/ipv4/conf/all/arp_announce ;; *) echo "Usage:$0 (start|stop)" exit 1 esac

     

    配置说明: 都为backup模式,优先级priority16为100,17为90,weight为 -20,表明触发一次脚本优先级就降低20,那么,如果16触发一次,priority就为80,比17的90低,那么17就作为keepalive的主,从而自动完成了主备的切换。脚本每3秒检测一次脚本内动作,如果执行了,脚本就算触发了一次。

    需要说明的是,vrrp_script模块必须要在定义的实例前面,track_script模块必须在virtual_ipaddress模块下面。

    验证:

    16的httpd服务手动关闭,会很快恢复httpd,如果未能恢复(不让httpd启动成功的方法自己考虑)httpd服务,keepalive服务关闭,17的keepalive启动。(vip漂移了)

    16的httpd服务如果再次成功启动(恢复了),keepalive并不会自动启动,仍然是17的keepalive启动。(非抢占模式成功)

    运行启动lvs的脚本,可以发现是session持久化了,如果有很多第三方访问vip,会看到负载均衡,但,单台连接是持久化50秒,如果耐心等待50秒,也可以发现负载均衡。

    Processed: 0.023, SQL: 10