1、真实服务器健康状态检测

我们可以通过Shell脚本,实现对LVS后端的真实服务器开放服务的健康状态检测功能。当真实服务器服务出现问题,则自动将其从集群服务中移除,当真实服务器服务恢复,则自动将其加入到负载均衡集群服务中。


1.1 基于端口的健康检测

脚本思路:

通过扫描后端服务器的端口来判断真实服务器是否健康!

若端口开放则表示真实服务器健康,则将其加入到LVS集群中。若已存在集群中则不做任何操作。

若端口未开发则表示真实服务器故障,则将其从LVS集群中移除。若不存在则不做任何操作。


Shell脚本内容如下:

# cat lvs_port_health.sh

#配置集群服务地址和真实服务器地址池

vip="172.16.16.100"

vport="80"

rspool="172.16.16.2 172.16.16.3"

rsport="80"

#本地时间

localtime=`date +%Y-%m-%d\ \%H:%M:%S`

#安装NMAP扫描端口工具

nmap=`rpm -qa |grep nmap |wc -l`

if [ $nmap = 0 ]

then

yum -y install nmap

fi

#真实服务器健康检测机制:

#当真实服务器故障时自动从集群服务中移除

#当真实服务器恢复时自动加入集群服务

while :;

do

sleep 3;

for i in $rspool

do

openport=`nmap $i -p $rsport |awk 'NR==6{print $2}'`

rstesting=`ipvsadm -ln|grep $i:$rsport|wc -l`

       if [ $openport = open ]

       then

               if [ $rstesting = 0 ]

               then

               ipvsadm -a -t $vip:$vport -r $i:$rsport -g >/dev/null 2>&1

               echo "$localtime 真实服务器[$i:$rsport]加入集群服务[$vip:$vport]!"

               fi

       else

               if [ $rstesting != 0 ]

               then

               ipvsadm -d -t $vip:$vport -r $i:$rsport

               echo "$localtime 真实服务器[$i:$rsport]从集群服务[$vip:$vport]中移除!"

               fi

       fi

done

done


1.2 基于访问的健康检测

在WEB集群中,基于端口的健康检测并不够精确,端口开放不代表WEB服务是正常工作的,所以我们更好的解决方法就是直接去访问一下。


脚本思路:

通过直接访问WEB来判断真实服务器是否健康!

若可访问则表示真实服务器健康,则将其加入到LVS集群中。若已存在集群中则不做任何操作。

若访问失败则表示真实服务器故障,则将其从LVS集群中移除。若不存在则不做任何操作。


Shell脚本内容如下:

# cat lvs_access_health.sh

#配置集群服务地址和真实服务器地址池

vip="172.16.16.100"

vport="80"

rspool="172.16.16.2 172.16.16.3"

rsport="80"

#本地时间

localtime=`date +%Y-%m-%d\ \%H:%M:%S`

#安装CURL工具

curl=`rpm -qa |grep curl |wc -l`

if [ $curl = 0 ]

then

yum -y install curl

fi

#真实服务器健康检测机制:

#当真实服务器故障时自动从集群服务中移除

#当真实服务器恢复时自动加入集群服务

while :;

do

sleep 3;

for i in $rspool

do

rstesting=`ipvsadm -ln|grep $i:$rsport|wc -l`

curl $i:$rsport >/dev/null 2>&1

       if [ $? = 0 ]

       then

               if [ $rstesting = 0 ]

               then

               ipvsadm -a -t $vip:$vport -r $i:$rsport -g >/dev/null 2>&1

               echo "$localtime 真实服务器[$i:$rsport]加入集群服务[$vip:$vport]!"

               fi

       else

               if [ $rstesting != 0 ]

               then

               ipvsadm -d -t $vip:$vport -r $i:$rsport

               echo "$localtime 真实服务器[$i:$rsport]从集群服务[$vip:$vport]中移除!"

               fi

       fi

done

done