1.用户通过DNS查询,得到随机的VIP1和VIP2。

2.VIP1和VIP2属于热备,负载均衡,高可用

当RIP1无法访问,主机2会检测到,将VIP1的ip加到的eth0:ha2,即在任何时候都有高可用

3.shell脚本vip和rip要对应,nginx_loadbalance_vip1.sh运行于主机1,运行命令为

#nohup ./nginx_loadbalance_vip1.sh >/dev/null & 后台运行

4.对于2台机器的监控,只需监控RIP即可,同时可以写一个监控脚本运行的crontab,防止脚本意外终止

结构图

120715072781341.jpg

--------------------------------------------------------------------

主机1的脚本如下

cat nginx_loadbalance_vip1.sh

  1. #!/bin/bash 

  2.  

  3. LANG=C 

  4. date=$(date -d "today" +"%Y-%m-%d %H:%M:%S") 

  5. BIND_VIP1=192.168.16.238 

  6. BIND_VIP2=192.168.16.239 

  7. WEB_IP_RIP1=192.168.16.240 

  8. WEB_IP_RIP2=192.168.16.241 

  9. NETMASK=255.255.255.0 

  10. GATEWAY=192.168.16.1 

  11. BROADCAST=219.232.254.255 

  12. function_bind_vip1() 

  13.     /sbin/ifconfig eth0:ha1 ${BIND_VIP1} broadcast ${BROADCAST} netmask ${NETMASK} up 

  14.     /sbin/route   add -host ${GATEWAY}   dev eth0:ha1 

  15.  

  16.  

  17. function_bind_vip2() 

  18.     /sbin/ifconfig eth0:ha2 ${BIND_VIP2} broadcast ${BROADCAST} netmask ${NETMASK} up 

  19.     /sbin/route  add  -host ${GATEWAY}   dev eth0:ha2 

  20.  

  21. function_restart_nginx() 

  22.     kill -USR1 `cat /var/log/nginx/nginx.pid` 

  23.  

  24. function_remove_vip1() 

  25.    /sbin/ifconfig eth0:ha1 ${BIND_VIP1} broadcast ${BROADCAST} netmask ${NETMASK} down 

  26.  

  27. function_remove_vip2() 

  28.    /sbin/ifconfig eth0:ha2 ${BIND_VIP2} broadcast ${BROADCAST} netmask ${NETMASK} down 

  29.  

  30. function_vip_arping1() 

  31.    /sbin/arping -I eth0 -c 3 -s ${BIND_VIP1} ${GATEWAY} > /dev/null 2>&1 

  32.  

  33. function_vip_arping2() 

  34.    /sbin/arping -I eth0 -c 3 -s ${BIND_VIP2} ${GATEWAY} > /dev/null 2>&1 

  35.  

  36. bind_time_vip1="N"

  37. bind_time_vip2="N"

  38.  

  39.  

  40.  

  41.  

  42. while true 

  43. do 

  44.       httpcode_rip1=`/usr/bin/curl -o /dev/null -s -w %{http_code} http://${WEB_IP_RIP1}/status.htm` 

  45.       httpcode_rip2=`/usr/bin/curl -o /dev/null -s -w %{http_code} http://${WEB_IP_RIP2}/status.htm` 

  46. #vip1 

  47. if [ x$httpcode_rip1 == "x200" ]; 

  48. then 

  49.    if [ $bind_time_vip1="N" ]; 

  50.    then 

  51.        function_bind_vip1 

  52.        function_vip_arping1 

  53.        function_restart_nginx 

  54.        bind_time_vip1="Y" 

  55.    fi  

  56.       function_vip_arping1 

  57. else 

  58.    if [ $bind_time_vip1 == "Y" ]; 

  59.    then 

  60.         

  61.  

  62.        function_remove_vip1 

  63.        bind_time_vip1="N" 

  64.    fi 

  65. fi 

  66.  

  67. #vip2 

  68. if [ x$httpcode_rip2 == "x200" ]; 

  69. then 

  70.    if [ $bind_time_vip2="Y" ]; 

  71.    then 

  72.        function_remove_vip2 

  73.        bind_time_vip2="N" 

  74.    fi  

  75. else 

  76.    if [ $bind_time_vip2 == "N" ]; 

  77.    then 

  78.        function_bind_vip2 

  79.        function_vip_arping2 

  80.        function_restart_nginx 

  81.        bind_time_vip2="Y" 

  82.    fi 

  83.        function_vip_arping2 

  84. fi 

  85. sleep 5 

  86. done