结构图

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,防止脚本意外终止

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

 主机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 

主机2的脚本如下

cat nginx_loadbalance_vip2.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.239 
  6. BIND_VIP2=192.168.16.238 
  7. WEB_IP_RIP1=192.168.16.241 
  8. WEB_IP_RIP2=192.168.16.240 
  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 

注意:本文来自于张宴的nginx书籍对双机热备的讲解,脚本也来自书中,本人对其有小小的改动,大家可以参看原书的详细内容