一、 LVS简介
LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目.

LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。

二、 LVS体系结构

使用LVS架设的服务器集群系统有三个部分组成:最前端的负载均衡层,用Load Balancer表示,中间的服务器群组层,用Server Array表示,最底端的数据共享存储层,用Shared Storage表示,在用户看来,所有的内部应用都是透明的,用户只是在使用一个虚拟服
务器提供的高性能服务。

Load Balancer层:位于整个集群系统的最前端,有一台或者多台负载调度器(Director Server)组成,LVS模块就安装在Director Server上,而Director的主要作用类似于一个路由器,它含有完成LVS功能所设定的路由表,通过这些路由表把用户的请求分发给Server Array层的应用服务器(Real Server)上。同时,在Director Server上还要安装对Real Server服务的监控模块Ldirectord,此模块用于监测各个Real Server服务的健康状况。在Real Server不可用时把它从LVS路由表中剔除,恢复时重新加入。

Server Array层:由一组实际运行应用服务的机器组成,Real Server可以是WEB服务器、MAIL服务器、FTP服务器、DNS服务器、视频服务器中的一个或者多个,每个Real Server之间通过高速的LAN或分布在各地的WAN相连接。在实际的应用中,Director Server也可以同时兼任Real Server的角色。

Shared Storage层:是为所有Real Server提供共享存储空间和内容一致性的存储区域,在物理上,一般有磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS网络文件系统共享数据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件系统,如Red hat的GFS文件系统,oracle提供的OCFS2文件系统等。

从整个LVS结构可以看出,Director Server是整个LVS的核心,linux2.6内核以后不用任何设置就可以支持LVS功能.

三、  LVS集群的特点

3.1  IP负载均衡与负载调度算法

1.IP负载均衡技术

负载均衡技术有很多实现方案,有基于DNS域名轮流解析的方法、有基于客户端调度访问的方法、有基于应用层系统负载的调度方法,还有基于IP地址的调度方法,在这些负载调度算法中,执行效率最高的是IP负载均衡技术。

LVS的IP负载均衡技术是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。当用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的Real Server节点,而Real Server节点如何返回数据给用户,是IPVS实现的重点技术,IPVS实现负载均衡机制有三种,分别是NAT、DR和TUN(这里不做说明).

 LVS/NAT:(Virtual Server via Network AddressTranslation)

网络地址翻译技术实现虚拟服务器,当用户请求到达调度器时,调度器将请求报文的目标地址(即虚拟IP地址)改写成选定的Real Server地址,同时报文的目标端口也改成选定的Real Server的相应端口,最后将报文请求发送到选定的Real Server。在服务器端得到
数据后,Real Server返回数据给用户时,需要再次经过负载调度器将报文的源地址和源端口改成虚拟IP地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。可以看出,在NAT方式下,用户请求和响应报文都必须经过Director Server地址重写,当用户请求越来越多时,调度器的处理能力将称为瓶颈。

 LVS/DR:(Virtual Server via Direct Routing)
 
直接路由技术实现虚拟服务器。它的连接调度和管理与LVS/NAT和LVS/TUN中的一样,但它的报文转发方法又有不同,LVS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户,免去了LVS/TUN中的IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求Director Server与Real Server都有一块网卡连在同一物理网段上。

2.负载调度算法

固定调度方法:在调度前不查看realserver本身具有连接的个数.

动态调度方法:director在选定realserver的时候通常会判断当前realserver上处于活动状态的连接个数和非活动状态的连接个数,并从中选择最空闲的realserver。

静态的调度算法有:

 轮调调度RR(Round Robin)

“轮叫”调度也叫1:1调度,调度器通过“轮叫”调度算法将外部用户请求按顺序1:1的分配到集群中的每个Real Server上,这种算法平等地对待每一台Real Server,而不管服务器上实际的负载状况和连接状态。

 加权轮调调度WRR(Weighted Round Robin) 

“加权轮叫”调度算法是根据Real Server的不同处理能力来调度访问请求。可以对每台Real Server设置不同的调度权值,对于性能相对较好的Real Server可以设置较高的权值,而对于处理能力较弱的Real Server,可以设置较低的权值,这样保证了处理能力强的服务器处理更多的访问流量。充分合理的利用了服务器资源。同时,调度器还可以自动查询Real Server的负载情况,并动态地调整其权值。

动态的调度算法有:

最少链接调度LC(Least Connections)
 “最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。 负载=当前处于活动状态的个数x256+非活动状态的个数,如果都相当,则选择列
表上最上面的那个realserver。

加权最少链接调度WLC(Weighted Least Connections)
 “加权最少链接调度”是“最少连接调度”的超集,每个服务节点可以用相应的权值表示其处理能力,而系统管理员可以动态的设置相应的权值,缺省权值为1,加权最小连接调度在分配新连接请求时尽可能使服务节点的已建立连接数和其权值成正比。负载=LC负载结果/权重wlc是集群中最优的算法

LVS ,实现负载均衡
模型一:NAT模型的配置
实验环境:
虚拟机1:充当Director:网卡1(挢接):192.168.0.1(对外),网卡2172.16.4.1(对内)
虚拟机2:充当RS1ip:172.16.4.2
虚拟机3:充当RS2: IP: 172.16.4.3
工作环境配置:
LVS实现负载均衡_第1张图片 
Yum install ipvsadm                      #Director上安装ipvsadm
 
#RS1RS2上这样配置
Yum install httpd mysql-server php php-mysql php-mbstring
Route add default gw 172.16.4.1
Hostname server1/server2
 
#RS1上配置网页
Echo “

server1” > /var/www/html/index.html

 
#RS2上配置网页
Echo “

server2” > /var/www/html/index.html

 
#分别在RS1RS2上开启服务
Server httpd start
 
#Director上开启路由转发功能
Echo 1 > /proc/sys/net/ipv4/ip_forward
 
#Director上配置ipvsadm的定义:使用模式以及算法
Ipvsadm –A –t 192.168.0.1:80 –s rr
Ipvsadm –a –t 192.168.0.1:80 –r 172.16.4.2 –m
Ipvsadm –a –t 192.168.0.1:80 –r 172.16.4.3 –m
Ipvsadm –L –n
 
我们打开浏览器输入 http:192.168.0.1刷新页面的时候的确出现了不同的页面,也就是说我们的系统在内部的确实现了调度回到终端查看我们的IPVSADM的状态
Ipvsadm –L –n
查看是否是按照RR算法进行高度的

模型二:DR模型的配置

实验环境:

    采用VMware虚拟机,版本6.0.5

    操作系统:Red Hat Enterprise Linux 5 (2.6.18)
 虚拟机1:Director:

        DIP配置在接口上 192.168.1.59

        VIP配置在接口别名上:192.168.1.100

    虚拟机1:RS1:RIP配置在接口上:172.16.19.60 ;VIP配置在lo别名上

    虚拟机2:RS2:RIP配置在接口上:172.16.19.61 ;VIP配置在lo别名上
# Director配置
[root@localhost ~]#setup
[root@localhost ~]# ifconfig eth0:0 192.168.1.100 broadcast 192.168.1.1 

netmask 255.255.255.255 up
[root@localhost ~]# ifconfig
[root@localhost ~]# route add -host 192.168.1.100 dev eth0:0
[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use 

Iface
192.168.1.100   *               255.255.255.255 UH    0      0        0 eth0
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0
169.254.0.0     *               255.255.0.0     U     0      0        0 eth0
default         192.168.1.1     0.0.0.0         UG    0      0        0 eth0
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

# 在Director上配置Ipvs
[root@localhost ~]# yum install ipvsadm -y

[root@localhost ~]# ipvsadm -A -t 192.168.1.100:80 -s wlc
[root@localhost ~]# ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.60 -g -w 2
[root@localhost ~]# ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.61 -g -w 4
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.100:80 wlc
  -> 192.168.1.61:80              Route   4      0          0         
  -> 192.168.1.60:80              Route   2      0          0


# RS1和RS2配置

定义内核参数,禁止响应对VIP的ARP广播请求
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
# 配置VIP
[root@localhost ~]# ifconfig lo:0 192.168.1.100 broadcast 192.168.1.1 

netmask 255.255.255.255 up
[root@localhost ~]# ifconfig
# 凡是到192.168.1.100主机的一律使用lo:0响应
[root@localhost ~]# route add -host 192.168.1.100 dev lo:0
[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use 

Iface
192.168.1.100   *               255.255.255.255 UH    0      0        0 lo
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0
169.254.0.0     *               255.255.0.0     U     0      0        0 eth0
[root@localhost ~]# yum install httpd -y
# 在RS1上配置网页
echo "

RealServer1" > /var/www/html/index.html


[root@localhost ~]# service httpd start
Starting httpd:                                            [  OK  ]

# 在RS2上配置网页
echo "

RealServer2" > /var/www/html/index.html

[root@localhost ~]# service httpd start
Starting httpd:                                            [  OK  ]


我们通过物理机对192.168.1.100访问查看wlc算法的实现结果
#在 Director 上查看
[root@localhost ~]# ipvsadm -Ln

 查看调度是不是按wlc算法进行调度的