实验环境:rhel5.8

Director

DIP:192.168.88.132        VIP:192.168.88.120

RealServer

RIP1:192.168.88.129       VIP:192.168.88.120

RIP1:192.168.88.134       VIP:192.168.88.120

DR模型,调度算法为wlc

        需求实现:模型正常工作,及Director实现自动检测,当任意RS故障时,自动将其移除,当检测到其状态正常时,再将其添加进来,并保证其原有属性不变。

        Director的脚本放置为:/etc/init.d/director和/etc/init.d/lvs,其中director脚本可使用chkconfig -add director进行管理。  lvs仅作函数放置即可,其功能笔者已将其整合进director脚本,负责进行检测RS的状态并做操作的,也只有这个是笔者自己写的,并为其提供了简单的配置文件(/etc/sysconfig/lvs.conf) ,默认为两秒检测一次,如需修改,直接修改lvs.conf里面的sec=n秒 即可。废话不多,上代码:

        对了,为了方便各位看官,相关文件可以直接附件下载。

Director第一个脚本:

 

  1. cat /etc/init.d/director  
  2. #!/bin/sh  
  3. #  
  4. # LVS script for VS/DR  
  5. #  
  6. # chkconfig: 345 99 99  
  7. # description: LVS DR  
  8. #  
  9. # processname: director  
  10. #  
  11. . /etc/rc.d/init.d/functions  
  12.  
  13.  
  14. VIP=192.168.88.120  
  15. RIP1=192.168.88.129  
  16. RIP2=192.168.88.134  
  17. PORT=80  
  18.  
  19. #  
  20. case "$1" in 
  21. start)             
  22.  
  23.   /sbin/ifconfig eth1:1 $VIP broadcast $VIP netmask 255.255.255.255 up  
  24.   /sbin/route add -host $VIP dev eth1:1  
  25.  
  26. # Since this is the Director we must be able to forward packets  
  27.   echo 1 > /proc/sys/net/ipv4/ip_forward  
  28.  
  29. # Clear all iptables rules.  
  30.   /sbin/iptables -F  
  31.  
  32. # Reset iptables counters.  
  33.   /sbin/iptables -Z  
  34.  
  35. # Clear all ipvsadm rules/services.  
  36.   /sbin/ipvsadm -C  
  37.  
  38. Add an IP virtual service for VIP 192.168.0.219 port 80  
  39. In this recipe, we will use the round-robin scheduling method.   
  40. In production, however, you should use a weighted, dynamic scheduling method.   
  41.   /sbin/ipvsadm -A -t $VIP:80 -s wlc  
  42.  
  43. # Now direct packets for this VIP to 
  44. # the real server IP (RIP) inside the cluster  
  45.   /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 9  
  46.   /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 8  
  47.  
  48.   /bin/touch /var/lock/subsys/ipvsadm &> /dev/null 
  49. ;;   
  50. stop)  
  51. #  NUM1=`ps aux|grep lvs|grep -v grep|awk '{print $2}'`  
  52. #   `kill $NUM1`  
  53.  
  54. # Stop forwarding packets  
  55.   echo 0 > /proc/sys/net/ipv4/ip_forward  
  56.  
  57. # Reset ipvsadm  
  58.   /sbin/ipvsadm -C &>/dev/null 
  59.  
  60. # Bring down the VIP interface  
  61.   /sbin/ifconfig eth1:1 down &>/dev/null 
  62.   /sbin/route del $VIP &>/dev/null 
  63.     
  64.   /bin/rm -f /var/lock/subsys/ipvsadm &>/dev/null 
  65.     
  66.   echo "ipvs is stopped..." 
  67. ;;  
  68. status)  
  69.   if [ ! -e /var/lock/subsys/ipvsadm ]; then 
  70.     echo "ipvsadm is stopped ..." 
  71.   else 
  72.     echo "ipvs is running ..." 
  73.     ipvsadm -L -n  
  74.   fi  
  75. ;;  
  76. *)  
  77.   echo "Usage: $0 {start|stop|status}" 
  78. ;;  
  79. esac  
  80.  
  81. [ -x /etc/rc.d/init.d/lvs ] && . /etc/rc.d/init.d/lvs  
  82.  
  83.     LVS_DIRECTOR & 

        完成后,记得执行 chkconfig -add director 表急着启动哈;下面上lvs脚本代码:

 

  1. #!/bin/sh  
  2. #  
  3. # LVS script for VS/DR  
  4. #  
  5. # chkconfig: 345 95 93  
  6. # description: LVS DR Check 
  7. #  
  8. # processname: lvs.sh  
  9. #  
  10. # Author: MOS  
  11. # Script name: lvs.sh  
  12. Date & Time: 2012-11-25/00:41:17  
  13. # Version: 1.0.1  
  14. # Description:  
  15. #  
  16.  
  17. LVS_DIRECTOR(){  
  18.  
  19. [ ! -x /sbin/ipvsadm ] && exit 1   
  20. [ ! -x /sbin/ipvsadm-save ] && exit 1   
  21. #[ ! -x /sbin/ipvsadm ] && echo "no such command: ipvsadm" 
  22. #[ ! -x /sbin/ipvsadm-save ] && echo "no such command: ipvsadm" 
  23.  
  24. [ -f /etc/sysconfig/lvs.conf ] && . /etc/sysconfig/lvs.conf  
  25.  
  26.  
  27. Test=${Test:-.mos.html}  
  28. TestStr=${TestStr:-MOS}  
  29. Sec=${Sec:-10}  
  30. Log=${Log:-Off}  
  31. [ $Log = "On" ] && Logfile=${Logfile:-/var/log/ipvs.log}  
  32.  
  33. VIP=`ipvsadm-save -n 2>/dev/null|awk '{print $3}'|uniq`  
  34. #[ -z $VIP ] && echo "Not such VIP" && exit 1   
  35. [ -z $VIP ] && exit 1   
  36. RIP=(`ipvsadm-save -n 2>/dev/null|awk '{print $5}'|grep "^[0-9].*[0-9]$"`)  
  37. #[ -z "${RIP[0]}" ] && echo "Not such RIP" && exit 2   
  38. [ -z "${RIP[0]}" ] && exit 2   
  39.  
  40. Tmpfile=`mktemp /tmp/lvs.XXXXXX 2> /dev/null`  
  41. `ipvsadm-save -n > $Tmpfile`  
  42. Rtmp=${Rtmp:-On}  
  43. [ $Rtmp = "On" ] && `find /tmp -type f -mtime +2 -name "lvs.*" -exec rm -rf {} \;`  
  44.  
  45. while :;do  
  46.  
  47.     for i in ${RIP[*]};do  
  48.       
  49.     Str=`elinks -dump "$i"/"$Test" 2>/dev/null|awk '{print $1}'`  
  50.     [[ "$Str" != "$TestStr" ]] && `ipvsadm -d -t $VIP -r $i 2>/dev/null` && continue 
  51. #   [[ "$Str" != "$TestStr" ]] && Restore=`ipvsadm-save -n|grep $i` && `ipvsadm -d -t $VIP -r $i 2>/dev/null` && continue 
  52.  
  53.     RIP_1=`ipvsadm -Ln 2>/dev/null|grep $i`  
  54.     [[ -n "$RIP_1" ]] && continue 
  55.  
  56.     if [[ "$Str" == "$TestStr" ]] ;then 
  57.         Restore=`grep $i $Tmpfile 2>/dev/null|uniq`  
  58.         ResN=`grep $i $Tmpfile 2>/dev/null|uniq|wc -l`  
  59.         [ $ResN -ne 1 ] && [[ "$Log" == "On" ]] && echo "Warn: Please RIP quantity." >> $Logfile  
  60.          `ipvsadm $Restore &>/dev/null`  
  61.     fi  
  62.  
  63.     done  
  64.         Quit=`ipvsadm-save -n 2>/dev/null`  
  65.         [[ -z "$Quit" ]] && exit 0  
  66. sleep $Sec  
  67. done  
  68. }  
  69.  
  70. #LVS_DIRECTOR 

记得完成后给执行权限,其配置文件如下:

  1. cat /etc/sysconfig/lvs.conf  
  2. Test=.mos.html  
  3. TestStr=MOS  
  4. Log=Off 
  5. Logfile=/var/log/ipvs.log  
  6. Sec=2  
  7. Rtmp=On 

简单说一下:

Test是检查RS的网页根目录必须要有个您自己的html文件,您写上你自己的,并保证其能被正常访问例如您的是 test.html那么 http://192.168.88.129/test.html必须可以访问才行。

TestStr第二个是这个网页的内容,脚本就是通过判断这个测试页内的内容,如果您的test.html里面是test,那么此处记得把MOS换成test即可

Log相关的只是个设想,笔者做的时候,有个测试,笔者试着写入自定义日志记录,后来一直没用,不管即可

Sec是每个几秒会重新检测一下RS有没有故障的,这个默认2秒,看您需求

Rtmp笔者的lvs脚本每次启动会自动生成一个临时文件,用以记录当前的vip和rip,一直开着脚本还好说,测试的话,每次都会生成不同的...你懂的,这个的意思就是会自动删除之前的,貌似笔者设置的是自动删除两天前的。

 

下面提供RealServer脚本,上代码:

 

  1. #!/bin/bash  
  2. #  
  3. # Script to start LVS DR real server.  
  4. # chkconfig: - 95 15  
  5. # description: LVS DR real server  
  6. #  
  7. .  /etc/rc.d/init.d/functions  
  8.  
  9. VIP=192.168.88.120  
  10. host=`/bin/hostname`  
  11.  
  12. case "$1" in 
  13. start)  
  14.        # Start LVS-DR real server on this machine.  
  15.         /sbin/ifconfig lo down  
  16.         /sbin/ifconfig lo up  
  17.         echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore  
  18.         echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce  
  19.         echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore  
  20.         echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce  
  21.  
  22.         /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up  
  23.         /sbin/route add -host $VIP dev lo:0  
  24.  
  25. ;;  
  26. stop)  
  27.  
  28.         # Stop LVS-DR real server loopback device(s).  
  29.         /sbin/ifconfig lo:0 down  
  30.         echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore  
  31.         echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce  
  32.         echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore  
  33.         echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce  
  34.  
  35. ;;  
  36. status)  
  37.  
  38.         # Status of LVS-DR real server.  
  39.         islothere=`/sbin/ifconfig lo:0 | grep $VIP`  
  40.         isrothere=`netstat -rn | grep "lo:0" | grep $VIP`  
  41.         if [ ! "$islothere" -o ! "isrothere" ];then 
  42.             # Either the route or the lo:0 device  
  43.             # not found.  
  44.             echo "LVS-DR real server Stopped." 
  45.         else 
  46.             echo "LVS-DR real server Running." 
  47.         fi  
  48. ;;  
  49. *)  
  50.             # Invalid entry.  
  51.             echo "$0: Usage: $0 {start|status|stop}" 
  52.             exit 1  
  53. ;;  
  54. esac 

记得chkconfig --add 并修改权限..到此完成...