【51CTO.com独家特稿】前言:

①如果四台机器均置于IDC机房,前端无防火墙时,这种情况好处理,只需要向你的IDC申请5个公网IP即可,多余的一个公网ip用于VIP;

②如果是上述网络拓扑,后面四台机器均用内网;此时只需要前面的Juniper将内网VIP映射成公网IP即可,注:非映射80和443端口,感谢田逸兄提供的技术性指导意见;

③lvs就比较依赖于网络环境,可以用苛求来形容;要做好LVS管理员,确实得跟进学习很多有关网络通信方面的知识,就不再是一个HTTP那么简单了;相对而言,nginx对网络的依赖较小,理论上只要ping得通,网页访问正常,nginx就能连得通。

④本来我想将公司的web环境生级成LVS+Keepalived架构,却发现lvs怎么都不能转发;结果查了下机器的route情况,发现每台机器都有十几条静态路由,二个网关,而Network engineer也说明了网络环境不可能更改,只能由系统环境牵就网络环境;最后只能将LVS+Keepalvied更改为Nginx+Keepalived架构,甚是遗憾。

 

企业级WEB的负载均衡高可用之LVS+Keepalived(1)_第1张图片

 

这里首先说下LVS/DR的网络拓扑情况,如果均置于电信IDC机房,用5个外网IP的话,整个网络拓扑清晰明了,实施起来也非常方便;但如果是置于Juniper防火墙后,情况就有点小复杂了,这时仍可用内网IP,只要将内网的VIP通过Juniper防火墙转换成一个公网IP即可,注:此时不要做80端口的映射,在这里感谢田逸兄的指导性意见。

服务器故障:(服务器故障包括:服务器宕机、web服务终止、网线松动等等)

①当lvs-master故障时,无法再接受用户请求并将请求转发给真实的web服务器(即便真实web服务器正常)从而导致整个web服务的瘫痪,也就是lvs控制器存在单点故障问题。

②当lvs-master正常时,真实地web服务器如web1-realserver故障。此时lvs-master并不知道真实服务器是否在正常提供web服务,所以仍然在向故障的web1-realserver转发用户请求。这样的结果是用户请求无法被故障web服务器相应,某些用户可以访问网站有些则无法访问。

基于以上的问题,我们需要想办法实现对lvs控制器和web服务器的健康监测,一旦服务出现问题能保证服务不中断的情况下排除故障。即增加lvs控制器实现主备模式避免单点故障以及自动删除故障web服务结点并当它恢复后再自动添加到群集中这样的功能,这就是LVS+keepalived能实现的功能。整个系统的拓扑如下:

  

实施步骤:

①在realserver主机上实行脚本realserver,为lo:0绑定VIP地址192.168.5.188,这步分别在二个web主机上192.168.5.104、192.168.5.105实施。这步提前做,是因为以后的过程中这一步是不会发生更改的。

   
   
   
   
  1. #vim /usr/local/sbin/realserver  
  2. #!/bin/bash  
  3. SNS_VIP=192.168.5.188  
  4. . /etc/rc.d/init.d/functions  
  5. case "$1" in  
  6. start)  
  7.        ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP  
  8.        /sbin/route add -host $SNS_VIP dev lo:0  
  9.        echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore  
  10.        echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce  
  11.        echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore  
  12.        echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce  
  13.        sysctl -p >/dev/null 2>&1  
  14.        echo "RealServer Start OK"   
  15.        ;;  
  16. stop)  
  17.        ifconfig lo:0 down  
  18.        route del $SNS_VIP >/dev/null 2>&1  
  19.        echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore  
  20.        echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce  
  21.        echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore  
  22.        echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce  
  23.        echo "RealServer Stoped"  
  24.        ;;  
  25. *)  
  26.        echo "Usage: $0 {start|stop}"  
  27.        exit 1  
  28. esac  
  29. exit 0 

简单说明下上述脚本的作用:

1)vip(virtual ip)。直接路由模式的vip必须跟服务器对外提供服务的ip地址在同一个网段,并且lvs 负载均衡器和其他所有提供相同功能的服务器都使用这个vip;

2)vip被绑定在环回接口lo0:0上,其广播地址是其本身,子网掩码是255.255.255.255。这与标准的网络地址设置有很大的不同。采用这种可变长掩码方式把网段划分成只含一个主机地址的目的是避免ip地址冲突;

3)echo这段的作用是抑制arp广播。如果不做arp抑制,将会有众多的机器向其他宣称:“嗨!我是奥巴马,我在这里呢!”,这样就乱套了。

②为二台lvs主机安装lvs+keepalived软件。安装lvs软件是必须做的,因为keepalived是运行在lvs之上的,因此lvs及keepalived必须装在一个系统里面。过程如下:

   
   
   
   
  1. #mkdir /usr/local/src/lvs  
  2. #cd /usr/local/src/lvs  
  3. #wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz  
  4. #ln -s /usr/src/kernels/2.6.18-53.el5PAE-i686/ /usr/src/linux  
  5. #tar zxvf ipvsadm-1.24.tar.gz  
  6. #cd ipvsadm-1.24  
  7. #make   
  8. #make install 

 ③编辑keepalived.conf文件,直接用keepalived实现负载均衡及高可用性。

 

a)Keepalved的安装

   
   
   
   
  1. a)Keepalved的安装  
  2. #wget http://www.keepalived.org/software/keepalived-1.1.15.tar.gz  
  3. #tar zxvf keepalived-1.1.15.tar.gz  
  4. #cd keepalived-1.1.15  
  5. #./configure  
  6. #make  
  7. #make install 

将keepalived做成启动脚务,方便管理:

   
   
   
   
  1. #cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/  
  2. #cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/  
  3. #mkdir /etc/keepalived  
  4. #cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/  
  5. #cp /usr/local/sbin/keepalived /usr/sbin/  
  6. #service keepalived start|stop  

b)Keealived的配置

①分别在主从负载均衡服务器上配置keepalived.conf ,内容分别如下:

   
   
   
   
  1. ! Configuration File for keepalived  
  2. global_defs {  
  3.    notification_email {  
  4.          [email protected]  
  5.    }  
  6.    notification_email_from [email protected]  
  7.    smtp_server 127.0.0.1  
  8.    router_id LVS_DEVEL  
  9. }  
  10. vrrp_instance VI_1 {  
  11.     state MASTER               
  12.     interface eth0  
  13.     virtual_router_id 51  
  14.     priority 100      
  15.     advert_int 1  
  16.     authentication {  
  17.         auth_type PASS  
  18.         auth_pass 1111  
  19.     }  
  20.     virtual_ipaddress {  
  21.         192.168.5.188   
  22.     }  
  23. }  
  24. virtual_server 192.168.5.188 80 {  
  25.     delay_loop 6                    
  26.     lb_algo wrr                    
  27.     lb_kind DR                    
  28.     persistence_timeout 60          
  29.     protocol TCP                  
  30.     real_server 192.168.5.104 80 {  
  31.         weight 3                 
  32.         TCP_CHECK {  
  33.         connect_timeout 10         
  34.         nb_get_retry 3  
  35.         delay_before_retry 3  
  36.         connect_port 80  
  37.         }  
  38.     }  
  39.     real_server 192.168.5.105 80 {  
  40.         weight 3  
  41.         TCP_CHECK {  
  42.         connect_timeout 10  
  43.         nb_get_retry 3  
  44.         delay_before_retry 3  
  45.         connect_port 80  
  46.         }  
  47.      }  
   
   
   
   
  1. ! Configuration File for keepalived  
  2. global_defs {  
  3.    notification_email {  
  4.          [email protected]  
  5.    }  
  6.    notification_email_from [email protected]  
  7.    smtp_server 127.0.0.1  
  8.    router_id LVS_DEVEL  
  9. }  
  10. vrrp_instance VI_1 {  
  11.     state BACKUP               
  12.     interface eth0  
  13.     virtual_router_id 51  
  14.     priority 99      
  15.     advert_int 1  
  16.     authentication {  
  17.         auth_type PASS  
  18.         auth_pass 1111  
  19.     }  
  20.     virtual_ipaddress {  
  21.         192.168.5.188   
  22.     }  
  23. }  
  24. virtual_server 192.168.5.188 80 {  
  25.     delay_loop 6                    
  26.     lb_algo wrr                    
  27.     lb_kind DR                    
  28.     persistence_timeout 60          
  29.     protocol TCP                  
  30.     real_server 192.168.5.104 80 {  
  31.         weight 3                 
  32.         TCP_CHECK {  
  33.         connect_timeout 10         
  34.         nb_get_retry 3  
  35.         delay_before_retry 3  
  36.         connect_port 80  
  37.         }  
  38.     }  
  39.     real_server 192.168.5.105 80 {  
  40.         weight 3  
  41.         TCP_CHECK {  
  42.         connect_timeout 10  
  43.         nb_get_retry 3  
  44.         delay_before_retry 3  
  45.         connect_port 80  
  46.         }  
  47.      }