安装环境
环境配置

虚拟服务器2台:

Red Hat Enterprise Linux Server release 5.4  1C 内存:512M 
应用服务器: 
Red Hat Enterprise Linux Server release 5.4  1C 内存:1G 
Red Hat Enterprise Linux Server release 5.4  1C 内存:1G 
VIP:192.168.90.100 
GATEWAY:192.168.90.200 
Vserver1:192.168.90.220 
Vserver2:192.168.90.221 
RealServer1:192.168.90.223 
RealServer2:192.168.90.224

系统架构
概念了解

这在整个负载均衡+Ha的高可用架构中主要采用ipvsadm和KeepAlived来实现。

1、  LVS:

是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR)八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)。

2、  ipvsadm

IPVS基本上是一种高效的Layer-4交换机,它提供负载平衡的功能。当一个TCP连接的初始SYN报文到达时,IPVS就选择一台服务器,将报文转发给它。此后通过查发报文的IP和TCP报文头地址,保证此连接的后继报文被转发到相同的服务器。这样,IPVS无法检查到请求的内容再选择服务器,这就要求后端的服务器组是提供相同的服务,不管请求被送到哪一台服务器,返回结果都应该是一样的。

3、  KeepAlived

keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。

实现架构

在上图的结构中:

主要由ipvsadm负责分发数据实现负载均衡的作用,由keepalived检测各应用服务器是否正常工作,实现双机高可用性能。

实现功能

通过该方案能够实现WEB应用服务器访问的负载均衡功能,通过Virtual Server 的HA来保证负载均衡服务器的高可用性。

使用LVS+KeepAlived的优缺点

1、  优点:整个架构完全开源免费,而且有很多相对比较标准活跃的论坛作为技术支撑

2、  缺点:功能简单,缺少收费产品的服务,出现问题之后必须依靠自己来处理。

安装ipvsadm
下载ipvsadm软件
#lsmod|grep ip_vs 
如果没有则进行下面的安装,ipvsadm软件一般Linux系统光盘中都会自带,或者从官方上下载(http://www.linuxvirtualserver.org/software/ipvs.html#kernel-2.6) 
#uname –r 
2.6.18-164.el5 
查看系统版本然后下载相应版本的ipvsadm 
安装ipvsadm
先为linux内核建立一个连接文件,在配置ipvsadm时需要用到内核中的一些函数库。 
# ln -s /usr/src/kernels/2.6.18-164.el5 /  /usr/src/linux 
#tar –zxvf ipvsadm-1.24.tar.gz 
#cd ipvsadm-1.24 
#configure 
#make(这一步显示成功之后再进行make install) 
#make install 
然后在命令行中敲入ipvsadm确认是否已经安装成功 
[root@wpg u01]# ipvsadm 
IP Virtual Server version 1.2.1 (size=4096) 
Prot LocalAddress:Port Scheduler Flags 
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn 
如上则表明正确安装了ipvsadm 
安装keepalived
下载keepalived
官网下载地址:http://www.keepalived.org/download.html 
安装kee
#tar zxvf keepalived-1.1.15.tar.gz 
#cd keepalived-1.1.15 
#./configure 
Keepalived configuration 
------------------------ 
Keepalived version : 1.1.15 
Compiler : gcc 
Compiler flags : -g -O2 
Extra Lib : -lpopt -lssl -lcrypto 
Use IPVS Framework : Yes 
IPVS sync daemon support : Yes 
Use VRRP Framework : Yes 
Use LinkWatch : Yes 
Use Debug flags : No 
执行完configure之后会出现上面的显示结果,红色标出部分为LVS所需服务状态必须为YES。 
#make(这一步成功之后进行安装) 
#make install 
安装完成之后查看一下是否安装成功。 
#find / -name keepalived  # 查看keepalived位置以便于后面复制文件 
#cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ 
#cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/ 
#mkdir /etc/keepalived 
#cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/ 
#cp /usr/local/sbin/keepalived /usr/sbin/ 
#chkconfig --add keepalived #设置为开启启动 
#chkconfig keepalived on 
到此keepalived也已经安装完毕,后面我需要对其进行配置来实现,负载均衡+双机的功能。 
配置LVS
这一步需要在做负载均衡的两台vserver上都要执行 
编写LVS配置脚本
vi /usr/local/sbin/lvs-dr.sh 
 #!/bin/bash 
 # description: start LVS of DirectorServer 
GW=192.168.90.254 
 # website director vip. 
 WEB_VIP=192.168.90.200 
 WEB_RIP1=192.168.90.220 
 WEB_RIP2=192.168.90.221 
 . /etc/rc.d/init.d/functions 
 logger $0 called with $1 
 case "$1" in 
 start) 
         # Clear all iptables rules. 
         /sbin/iptables -F 
         # Reset iptables counters. 
         /sbin/iptables -Z 
         # Clear all ipvsadm rules/services. 
         /sbin/ipvsadm -C 
 #set lvs vip for dr 
         /sbin/ipvsadm --set 30 5 60 
         /sbin/ifconfig eth0:0 $WEB_VIP broadcast $WEB_VIP netmask 255.255.255.255 up 
         /sbin/route add -host $WEB_VIP dev eth0:0 
         /sbin/ipvsadm -A -t $WEB_VIP:80 -s wrr -p 3 
         /sbin/ipvsadm -a -t $WEB_VIP:80 -r $WEB_RIP1:80 -g -w 1 
         /sbin/ipvsadm -a -t $WEB_VIP:80 -r $WEB_RIP2:80 -g -w 1 
         touch /var/lock/subsys/ipvsadm >/dev/null 2>&1 
         # set Arp 
         /sbin/arping -I eth0 -c 5 -s $WEB_VIP $GW >/dev/null 2>&1 
         /sbin/ipvsadm -ln 
       ;; 
 stop) 
         /sbin/ipvsadm -C 
         /sbin/ipvsadm -Z 
         ifconfig eth0:0 down 
         route del $WEB_VIP  >/dev/null 2>&1 
         rm -rf /var/lock/subsys/ipvsadm >/dev/null 2>&1 
         /sbin/arping -I eth0 -c 5 -s $WEB_VIP $GW 
         echo "ipvsadm stoped" 
        ;; 
 status) 
         if [ ! -e /var/lock/subsys/ipvsadm ];then 
                 echo "ipvsadm is stoped" 
                 exit 1 
         else 
                 ipvsadm -ln 
                 echo "..........ipvsadm is OK." 
         fi 
       ;; 
 *) 
         echo "Usage: $0 {start|stop|status}" 
         exit 1 
 esac 
 exit 0 
#------------------------The end of the Scripts------------------------------------------- 
脚本编写完成之后分别在分别在两个节点上跑一次如果跑成功之后应该显示如下结果: 
[root@wpg u01]# ./lvsdr.sh status 
IP Virtual Server version 1.2.1 (size=4096) 
Prot LocalAddress:Port Scheduler Flags 
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn 
TCP  192.168.90.100:80 wrr persistent 3 
  -> 192.168.90.221:80            Route   1      0          0         
  -> 192.168.90.220:80            Local   1      0          0         
..........ipvsadm is OK. 
192.168.90.100为我们设置的虚拟IP下面的两个为Real Server的IP。 
这时候查看系统IP会发现多了一个浮动IP地址。 
eth0      Link encap:Ethernet  HWaddr 00:0C:29:18:CB:8D  
          inet addr:192.168.90.220  Bcast:192.168.90.255  Mask:255.255.255.0 
          inet6 addr: fe80::20c:29ff:fe18:cb8d/64 Scope:Link 
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1 
          RX packets:2973 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:10151 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:1000 
          RX bytes:297588 (290.6 KiB)  TX bytes:533370 (520.8 KiB) 
          Interrupt:67 Base address:0x2024 
eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:18:CB:8D  
          inet addr:192.168.90.100  Bcast:192.168.90.100  Mask:255.255.255.255 
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1 
          Interrupt:67 Base address:0x2024

到此我们就完成了负载均衡的配置。

配置KeepaLived
Vserver1端配置
编辑keepalived的配置文件,在/etc/keepalived/目录下 
#vi /etc/keepalived/keepalived.conf 
! Configuration File for keepalived 
global_defs { 
   router_id LVS_DEVEL 
} 
vrrp_sync_group lvs_1 { 
           group { 
                 VI_1 
                 VI_GATEWAY 
                   } 
} 
vrrp_instance VI_1 { 
    state MASTER 
    interface eth0 
    virtual_router_id 51 
    priority 100 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        192.168.90.100 
    } 
} 
vrrp_instance VI_GATEWAY { 
    state MASTER 
    interface eth0 
    virtual_router_id 52 
    priority 100 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
     } 
     virtual_ipaddress { 
         192.168.90.200 
     } 
} 
virtual_server 192.168.100 80 { 
    delay_loop 6 
    lb_algo wlc 
    lb_kind NAT 
    nat_mask 255.255.255.0 
    persistence_timeout 1200 
    protocol TCP 
    real_server 192.168.90.223 80 { 
        weight 1 
        inhibit_on_failure 
        TCP_CHECK { 
            connect_port 80 
            connect_timeout 4 
        } 
    } 
    real_server 192.168.90.224 80 { 
        weight 1 
        TCP_CHECK { 
            connect_port 80 
            connect_timeout 4 
        } 
    } 
} 
#-----------------------The End------------------- 
Vserver2配置
#vi /etc/keepalived/keepalived.conf 
! Configuration File for keepalived 
global_defs { 
   router_id LVS_DEVEL 
} 
vrrp_sync_group lvs_1 { 
           group { 
                 VI_1 
                 VI_GATEWAY 
                   } 
} 
vrrp_instance VI_1 { 
    state BACKUP 
    interface eth0 
    virtual_router_id 51 
    priority 90 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        192.168.90.100 
    } 
} 
vrrp_instance VI_GATEWAY { 
    state BACKUP 
    interface eth0 
    virtual_router_id 52 
    priority 100 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
     } 
     virtual_ipaddress { 
         192.168.90.200 
     } 
} 
virtual_server 192.168.100 80 { 
    delay_loop 6 
    lb_algo wlc 
    lb_kind NAT 
    nat_mask 255.255.255.0 
    persistence_timeout 1200 
    protocol TCP 
    real_server 192.168.90. 223 80 { 
        weight 1 
        inhibit_on_failure 
        TCP_CHECK { 
            connect_port 80 
            connect_timeout 4 
        } 
    } 
    real_server 192.168.90.224 80 { 
        weight 1 
        TCP_CHECK { 
            connect_port 80 
            connect_timeout 4 
        } 
    } 
} 
开启IP转发
分别在两台vserver服务器的/etc/sysctl.conf文件中添加如下配置: 
net.ipv4.ip_forward=1 
配置RealServer
配置IP转发功能
每个web服务器节点都需要进行配置 
#vim /etc/sysctl.conf 
net.ipv4.ip_forward=1 
net.ipv4.conf.lo.arp_ignore = 1 
net.ipv4.conf.lo.arp_announce = 2 
net.ipv4.conf.all.arp_ignore = 1 
net.ipv4.conf.all.arp_announce = 2 
配置网关
#vim /etc/sysconfig/network-scripts/ifcfg-eth0添加 
    GATEWAY=172.168.90.200 
#service network restart

设置开启启动

将编写的lvsdr.sh配置脚本拷贝到/usr/local/sbin/目录下,然后将下面两个命令添加到/etc/rc.local文件中这样,就能在开机之后自动启动LVS服务了。

# /usr/local/sbin/lvsdr.sh start (把这条语句写到/etc/rc.local中,开机启动)

#/etc/init.d/keepalived start  启动keepalived 服务,keepalived就能利用keepalived.conf 配置文件,实现负载均衡和高可用.

功能测试
负载均衡测试
双机切换测试
压力测试
LVS基本管理
启动、关闭
1、  ipvsadm 的启动和关闭 
使用编写的lvsdr.sh脚本即可 
#lvsdr.sh start  启动 
#lvsdr.sh stop 关闭 
2、   keepalived的启动和关闭 
#/etc/init.d/keepalived start   启动 
#/etc/init.d/keepalived stop   关闭 
查看服务状态
1、  ipvsadm的服务状态 
#ipvsadm -ln 
2、  keepalived的服务状态 
#/etc/init.d/keepalived status 
添加节点
#/sbin/ipvsadm -a -t $WEB_VIP:port -r $WEB_RIP2:port -g -w 1

通过该命令来添加节点 $WEB_VIP:port代表 虚拟服务器的IP和端口,$WEB_RIP2:port

代表真实应用服务器的IP和端口。

监控日志

通过监控日志来检测服务信息:

#tail –f /var/log/messages

LVS之IP负载均衡

在下面我们主要介绍三种IP负载均衡技术的原理

VS/NAT

通过 NAT 实现虚 拟服务器( VS/NAT )。

NAT 的工作原理是报文头(目标地址、源地址和端口等) 被正确改写后,客户相信它们连接一个 IP 地址,而不同 IP 地址的服务器组也认为它们是与客户直接相连的。由此,可以用 NAT 方法将不同 IP 地址的并行网络服务变成在一个 IP 地址上的一个虚拟服务。

客户通过 Virtual IP Address (虚拟服务的 IP 地址)访问网络服务时,请求报文到达调度器,调度器根据连接调度算法从一组真实服务器中选出一台服务器,将报文的目标地址 Virtual IP Addres s改写成选定服务器的地址,报文的目标端口改写成选定服务器的相应端口,最后将修改后的报文发送给选出的服务器。同时,调度器在连接 Hash 表中记录这个连接,当这个连接的下一个报文到达时,从连接 Hash 表中可以得到原选定服务器的地址和端口,进行同样的改写操作,并将报文传给原选定的服务器。当来自真实服务器的响应 报文经过调度器时,调度器将报文的源地址和源端口改为 Virtual IP Address 和相应的端口,再把报文发给用户。我们在连接上引入一个 状态机,不同的报文会使得连接处于不同的状态,不同的状态有不同的超时值。在 TCP 连接中,根据标准的 TCP 有限状态机进行状态迁移;在 UDP 中,我们只设置一个 UDP 状态。不同状态的超时值是可以设置的,在缺省情况下, SYN 状态的超时为 1 分钟, ESTABLISHED 状态的超时为15 分钟, FIN 状态的超时为 1 分钟; UDP 状态的超时为 5 分钟。当连接终止或超时,调度器将这 个连接从连接 H ash 表中删除。

这样,客户所看到的只是在 Virtual IP Address 上提供的服务,而服务器集群的结构对用户是透明的。

如下是我的测试环境:

Prot LocalAddress:Port Scheduler Flags 
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn 
TCP  192.168.130.200:80 wrr persistent 3 
  -> 192.168.130.184:80           Route   1      0          0   
  -> 192.168.130.183:80           Route   1      0          0  
现在有一个web请求从客户端:202.100.1.123:80端口发出,这时调度器会把该请求均衡的分配到每个真实的服务器,假设选择了192.168.130.183这台应用服务器。这样调度器(Vserver)收到的请求报文中源地址和目标地址为: 
SOURCE             202.100.1.123:80           DES                    192.168.130.200:80 
这时调度器会选择一台这时服务器来处理这个请求,该报文就会被改写为: 
SOURCE               202.100.1.123:80           DES                    192.168.130.183:80 
然后应用服务器处理完请求之后,返回到调度器的报文为: 
  SOURCE                192.168.130.183:80          DES                    202.100.1.123:80 
调度器会将响应的报文中的源地址改为虚拟VIP然后发给客户端: 
  SOURCE                192.168.130.200:80          DES                    202.100.1.123:80

这样就完成了一个请求和相应的过程。对client端来看这些都是不可见的,client会认为是VIP的服务器处理并相应的请求。