一、什么是lvs?

LVS是一个开源的软件,由毕业于国防科技大学的章文嵩博士于1998年5月创立,可以实现LINUX平台下的简单负载均衡。LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器。

如图:

lvs的原理及应用_的

二、技术简介

LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。一般来说,LVS集群采用三层结构,其主要组成部分为:

1) 负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。

2) 服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。

3) 共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。

LVS集群种类通常是通过LVS Director中继到集群节点的请求的方法来形容的,目前有三种可用的方法:

1) 网络地址转换(LVS-NAT)

Virtual Server via Network Address Translation(VS/NAT)
通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。

如图:

2) 直接路由(LVS-DR)

Virtual Server via Direct Routing(VS/DR)

VS/DR通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同VS/TUN技术一样,VS/DR技术可极大地提高集群系统的伸缩性。这种方法没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连在同一物理网段上。

如图:

3) IP隧道(LVS-TUN)

Virtual Server via IP Tunneling(VS/TUN)
采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用 VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。

如图:

LVS调度方法

1) 固定(或非动态)调度方法

循环法(RR)

权重循环(WRR)

目标散列法

源散列法

2) 动态调度方法

最少连接(LC)

权重最少连接(WLC)

最短预期延迟(SED)

永不排队(NQ)

基于本地最少连接(LBLC)

基于本地最少连接重复调度(LBLCR)

三、案例 实现lvs负载均衡

案例一 使用lvs_nat模式

1)调度方法为rr

实验拓扑图:

1. Load balancer配置

网络配置

首先查看内核是否支持ipvs

[root@localhost ~]# uname -r

2.6.18-164.el5

[root@localhost ~]# grep -i ip_vs /boot/config-2.6.18-164.el5

打开路由转发功能,如下:

[root@localhost ~]# vim /etc/sysctl.conf

7 net.ipv4.ip_forward = 1

[root@localhost ~]# sysctl –p

##立即生效

[root@localhost ~]# yum install ipvsadm –y

安装成功!

[root@localhost ~]# ipvsadm -A -t 192.168.101.15:80 -s rr

[root@localhost ~]# ipvsadm -a -t 192.168.101.15:80 -r 192.168.2.100 -m

[root@localhost ~]# ipvsadm -a -t 192.168.101.15:80 -r 192.168.2.101 -m

[root@localhost ~]# service ipvsadm save

Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]

[root@localhost ~]# service ipvsadm start

Clearing the current IPVS table: [ OK ]

Applying IPVS configuration: [ OK ]

[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.101.15:80 rr

-> 192.168.2.100:80 Masq 1 0 0

-> 192.168.2.101:80 Masq 1 0 0

2.Realserver1配置

网络配置

安装httpd服务

[root@localhost ~]# cd /mnt/cdrom/Server/

[root@localhost Server]# rpm -ivh httpd-2.2.3-31.el5.i386.rpm

新建一个网页

[root@localhost Server]# cd /var/www/html/

[root@localhost html]# echo "web1" >index.html

启动服务

[root@localhost ~]# service httpd start

3.Realserver2配置

网络配置

安装httpd服务

[root@localhost ~]# cd /mnt/cdrom/Server/

[root@localhost Server]# rpm -ivh httpd-2.2.3-31.el5.i386.rpm

新建一个网页

[root@localhost Server]# cd /var/www/html/

[root@localhost html]# echo "web2" >index.html

启动服务

[root@localhost ~]# service httpd start

测试

2)调度方法wrr

Load balancer配置

设置web1的权重为web2的2倍

[root@localhost ~]# vim /etc/sysconfig/ipvsadm

[root@localhost ~]# ipvsadm -E -t 192.168.101.15:80 -s wrr

[root@localhost ~]# ipvsadm -e -t 192.168.101.15:80 -r 192.168.2.100 -m -w 10

[root@localhost ~]# ipvsadm -e -t 192.168.101.15:80 -r 192.168.2.101 -m -w 5

[root@localhost ~]# service ipvsadm save

Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]

[root@localhost ~]# service ipvsadm restart

Clearing the current IPVS table: [ OK ]

Applying IPVS configuration: [ OK ]

测试

用user用户访问3次

案例二 使用lvs_dr模式

实验拓扑图

Realserver1的配置

[root@localhost ~]# echo "net.ipv4.conf.eth0.arp_announce = 2" >>/etc/sysctl.conf

[root@localhost ~]# echo "net.ipv4.conf.all.arp_announce = 2" >>/etc/sysctl.conf

[root@localhost ~]# echo "net.ipv4.conf.eth0.arp_ignore = 1" >>/etc/sysctl.conf

[root@localhost ~]# echo "net.ipv4.conf.all.arp_ignore = 1" >>/etc/sysctl.conf

[root@localhost ~]# sysctl –p

配置网络信息

添加路由

[root@localhost ~]# route add -host 192.168.2.11 dev lo:0

安装httpd服务

[root@localhost ~]# cd /mnt/cdrom/Server/

[root@localhost Server]# rpm -ivh httpd-2.2.3-31.el5.i386.rpm

新建一个网页

[root@localhost Server]# cd /var/www/html/

[root@localhost html]# echo "web1" >index.html

启动服务

[root@localhost ~]# service httpd start

Realserver2配置

将realserver1的配置copy过来

[root@localhost ~]# scp 192.168.2.100:/etc/sysctl.conf /etc/

配置网络信息

添加路由信息

[root@localhost ~]# route add -host 192.168.2.11 dev lo:0

安装httpd服务

[root@localhost ~]# cd /mnt/cdrom/Server/

[root@localhost Server]# rpm -ivh httpd-2.2.3-31.el5.i386.rpm

新建一个网页

[root@localhost Server]# cd /var/www/html/

[root@localhost html]# echo "web1" >index.html

启动服务

[root@localhost ~]# service httpd start

LinuxDirector配置

配置网络信息

安装ipvsadm服务

[root@localhost ~]# cd /mnt/cdrom/

[root@localhost cdrom]# cd Cluster/

[root@localhost Cluster]# rpm -ivh ipvsadm-1.24-10.i386.rpm

启动服务

[root@localhost Cluster]# service ipvsadm save

Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]

[root@localhost Cluster]# service ipvsadm start

Clearing the current IPVS table: [ OK ]

Applying IPVS configuration: [ OK ]

[root@localhost Cluster]# chkconfig ipvsadm on

[root@localhost Cluster]# ipvsadm -A -t 192.168.2.11:80 -s rr

[root@localhost Cluster]# ipvsadm -a -t 192.168.2.11:80 -r 192.168.2.100 -g

[root@localhost Cluster]# ipvsadm -a -t 192.168.2.11:80 -r 192.168.2.101 -g

[root@localhost Cluster]# 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.2.11:80 rr

-> 192.168.2.101:80 Route 1 0 0

-> 192.168.2.100:80 Route 1 0 0

测试

持久连接

[root@localhost ~]# ipvsadm -A -t 192.168.2.11:0 -s rr -p 60

[root@localhost ~]# ipvsadm -a -t 192.168.2.11:0 -r 192.168.2.100 -g

[root@localhost ~]# ipvsadm -a -t 192.168.2.11:0 -r 192.168.2.101 -g

[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.2.11:0 rr persistent 60

-> 192.168.2.101:0 Route 1 0 0

-> 192.168.2.100:0 Route 1 0 0

[root@localhost ~]#

测试

在60s内访问都是web2