LVS负载均衡(三) LVS后端服务健康状态检查

时间:2024-05-19 20:26:21

LVS负载均衡(三) LVS后端服务健康状态检查

                                                    

上一篇分别配置NAT和DR的应用,下面将利用前面配置好的DR工作方式集群来实现LVS后端服务健康状态检查。

1、为什么需要进行LVS后端服务健康状态检查

      像前面配置好了,整个集群开始工作,但如果某些Real Server出现问题,不能正常访问,我们就要使Director的ipvs配置做出相应改变,删除出问题的Real Server;当Real Server又能正常访问时,也要把其添加回ipvs的调度列表,这就需要实时检查各Real Server的健康状态,以此来保证整个集群能够提供稳定可用的服务。

2、怎么实现LVS后端服务健康状态检查

      实时检查各Real Server的健康状态,实现的方式很多,如四层TCP健康检测、七层HTTP健康检测,如访问某个端口、请求一个专用的服务接口等,也可用ldirectord、keepalived等高可用组件来实现,这些后面介绍到高可用时再实现;我们这里使用上面配置好的DR方式的WEB集群来测试,所以使用的是比较常见的间隔访问HTTP页面的方式来检测健康状态,类似脚本网上很多,更改一下就可以用,下面是本次测试用的脚本,自己新加入了全部Real Server掉线后,使用Director本机提供错误提示给用户的功能,lvs_health_check.sh脚本如下:

[plain] view plain copy
  1. #!/bin/bash  
  2.   
  3. #  
  4.   
  5. VIP=192.168.1.100  
  6.   
  7. CPORT=80  
  8.   
  9. FAIL_BACK=127.0.0.1            #全部RS掉线后,使用DIR本机提供错误提示给用户  
  10.   
  11. RS=("192.168.1.102" "192.168.1.103")  
  12.   
  13. declare -a RSSTATUS  
  14.   
  15. RW=("1" "3")                #调度权重  
  16.   
  17. RPORT=80  
  18.   
  19. TYPE=g  
  20.   
  21. CHKLOOP=3                    #掉线的时候,多检查几次再删除  
  22.   
  23. LOG=/var/log/ipvsmonitor.log        #日志  
  24.   
  25.    
  26.   
  27. declare -i AddRsCount=0            #在线的rs数量              
  28.   
  29. declare -i     FailBackStartFlag=0        #FAIL_BACK启用标志  
  30.   
  31.    
  32.   
  33. addrs() {            #添加RS  
  34.   
  35. ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2  
  36.   
  37. [ $? -eq 0 ] && return 0 || return 1  
  38.   
  39. }  
  40.   
  41.    
  42.   
  43. delrs() {            #删除RS  
  44.   
  45. ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT  
  46.   
  47. [ $? -eq 0 ] && return 0 || return 1  
  48.   
  49. }  
  50.   
  51.    
  52.   
  53. checkrs() {            #不断循环访问各RS,根据返回,判断各RS的健康状态  
  54.   
  55. local I=1  
  56.   
  57. while [ $I -le $CHKLOOP ]; do #掉线的时候,多检查几次再删除  
  58.   
  59. if curl --connect-timeout 1 http://$1 &> /dev/null; then  
  60.   
  61. return 0  
  62.   
  63. fi  
  64.   
  65. let I++          
  66.   
  67. done  
  68.   
  69. return 1  
  70.   
  71. }  
  72.   
  73.    
  74.   
  75. initstatus() {                    #初始化各RS的状态  
  76.   
  77. local I  
  78.   
  79. local COUNT=0;  
  80.   
  81. for I in ${RS[*]}; do  
  82.   
  83. if ipvsadm -L -n | grep "$I:$RPORT" && > /dev/null ; then  
  84.   
  85. RSSTATUS[$COUNT]=1  
  86.   
  87. let AddRsCount++            #初始在线RS数量  
  88.   
  89. else  
  90.   
  91. RSSTATUS[$COUNT]=0  
  92.   
  93. fi  
  94.   
  95. let COUNT++  
  96.   
  97. done  
  98.   
  99. }  
  100.   
  101.    
  102.   
  103. initstatus  
  104.   
  105. while :; do  
  106.   
  107. let COUNT=0  
  108.   
  109.    
  110.   
  111. for I in ${RS[*]}; do  
  112.   
  113. if checkrs $I; then        #不断循环访问各RS,根据返回,判断各RS的健康状态  
  114.   
  115. if [ ${RSSTATUS[$COUNT]} -eq 0 ]; then  
  116.   
  117. addrs $I ${RW[$COUNT]}    #刚上线,添加  
  118.   
  119. #[ $? -eq 0 ] && RSSTATUS[$COUNT]=1 && let AddRsCount++ && echo "`date +'%F %H:%M:%S'`, $I is back." >> $LOG  
  120.   
  121. if [ $? -eq 0 ]; then  
  122.   
  123. RSSTATUS[$COUNT]=1  
  124.   
  125. let AddRsCount++  
  126.   
  127. echo "`date +'%F %H:%M:%S'`, $I is back." >> $LOG  
  128.   
  129. fi  
  130.   
  131. fi  
  132.   
  133. else  
  134.   
  135. if [ ${RSSTATUS[$COUNT]} -eq 1 ]; then  
  136.   
  137. delrs $I                                #刚掉线,删除  
  138.   
  139. #[ $? -eq 0 ] && RSSTATUS[$COUNT]=0 && let AddRsCount--    && echo "`date +'%F %H:%M:%S'`, $I is gone." >> $LOG  
  140.   
  141.      if [ $? -eq 0 ]; then  
  142.   
  143. RSSTATUS[$COUNT]=0  
  144.   
  145. let AddRsCount--  
  146.   
  147. echo "`date +'%F %H:%M:%S'`, $I is gone." >> $LOG  
  148.   
  149. fi  
  150.   
  151. fi  
  152.   
  153. fi  
  154.   
  155. let COUNT++  
  156.   
  157. done  
  158.   
  159.    
  160.   
  161. if [ $AddRsCount -eq 0 ] && [ $FailBackStartFlag -eq 0 ]; then  
  162.   
  163. addrs $FAIL_BACK 1        #在线RS数量为0,且FailBack没启用,则启用  
  164.   
  165. [ $? -eq 0 ] && FailBackStartFlag=1 && echo "`date +'%F %H:%M:%S'`, $FAIL_BACK is start." >> $LOG  
  166.   
  167. fi  
  168.   
  169.    
  170.   
  171. if [ $AddRsCount -gt 0 ] && [ $FailBackStartFlag -eq 1 ]; then  
  172.   
  173.      delrs $FAIL_BACK        #在线RS数量大于为0,且FailBack启用,则停用  
  174.   
  175. [ $? -eq 0 ] && FailBackStartFlag=0 && echo "`date +'%F %H:%M:%S'`, $FAIL_BACK is stop." >> $LOG  
  176.   
  177. fi  
  178.   
  179. sleep 5  
  180.   
  181. done  


3、测试

      执行bash -x lvs_health_check.sh,然后手动停止/启用各Real Server的htttpd,可以到看ipvs规则自动做出了相应改变,日志中也记录下了相应变化,测试情况如下:

LVS负载均衡(三) LVS后端服务健康状态检查

 

下一篇将会尝试解决LVS持久连接相关的问题……