一、LVS的简介

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

如图:

 

 技术简介

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

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

2)  服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEBMAILFTPDNS等。

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

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

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

Virtual Server via Network Address TranslationVS/NAT

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

如图:

 

2)     直接路由(LVS-DR

Virtual Server via Direct RoutingVS/DR

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

如图:

 

3)     IP隧道(LVS-TUN)

Virtual Server via IP TunnelingVS/TUN

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

如图:

 

LVS调度方法

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

循环法(RR

权重循环(WRR

目标散列法

源散列法

2)       动态调度方法

最少连接(LC

权重最少连接(WLC

最短预期延迟(SED

永不排队(NQ

基于本地最少连接(LBLC

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

案例 实现lvs负载均衡

案例一:网络地址转换(LVS-NAT

拓扑图:

 

二、实验步骤:

Load balancer配置

1、网络地址的配置

[root@localhost ~]# ifconfig

eth0      Link encap:Ethernet  HWaddr 00:0C:29:5F:B3:A1 

          inet addr:192.168.10.10  Bcast:192.168.10.255  Mask:255.255.255.0

          inet6 addr: fe80::20c:29ff:fe5f:b3a1/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:330 errors:0 dropped:0 overruns:0 frame:0

          TX packets:343 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:30379 (29.6 KiB)  TX bytes:50966 (49.7 KiB)

          Interrupt:67 Base address:0x2000

eth1      Link encap:Ethernet  HWaddr 00:0C:29:5F:B3:AB 

          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0

          inet6 addr: fe80::20c:29ff:fe5f:b3ab/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:57 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:0 (0.0 b)  TX bytes:13417 (13.1 KiB)

          Interrupt:67 Base address:0x2080

2、打开路由功能

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

7 net.ipv4.ip_forward = 1

使之生效

[root@localhost ~]# sysctl -p

3、安装LVSlinux virtual server)的管理工具

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

[root@localhost ~]# mount /dev/cdrom /mnt/cdrom/

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

4、定义虚拟服务,采用轮循调度方法

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

5、定义转发给分层服务器

[root@localhost ~]# ipvsadm -a -t 192.168.10.10:80 -r 192.168.1.100 –m

[root@localhost ~]# ipvsadm -a -t 192.168.10.10:80 -r 192.168.1.200 –m

[root@localhost ~]# service ipvsadm save

Saving IPVS table to /etc/sysconfig/ipvsadm:               [确定]

[root@localhost ~]# service ipvsadm start

Clearing the current IPVS table:                           [确定]

Applying IPVS configuration:                               [确定]

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

  -> 192.168.1.100:80             Masq    1      0          0        

  -> 192.168.1.200:80             Masq    1      0          0    

#活动连接数目和非活动连接数目都是0,转发类型为Masq

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

-A -t 192.168.10.10:80 -s rr

-a -t 192.168.10.10:80 -r 192.168.1.200:80 -g -w 1

-a -t 192.168.10.10:80 -r 192.168.1.100:80 -g -w 1

Realserver1的配置

1、地址配置

 

2、挂载光盘

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

[root@localhost ~]# mount /dev/cdrom /mnt/cdrom/

3、安装httpd服务

cd /mnt/cdrom/Server

rpm -ivh httpd-2.2.3-31.el5.i386.rpm

4、创建web服务器的访问页面

Realserver2的配置

1、地址配置

 

2、创建web页面

 

三、测试

访问http//192.168.10.10,看到如下页面

 

刷新一下页面,可以看到web1的页面,这种轮循的被访问方式成功实现

 

再刷新,游客看到web2的页面,达到负载均衡的目的

我们再来看下活动连接数目

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

-> 192.168.1.100:80 Masq 1 0 3

-> 192.168.1.200:80 Masq 1 0 2

修改TCP为加权轮循,修改权重的值改变服务器1和服务器2的访问次数

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

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

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

我们发现服务器1被访问的次数是服务器2的两倍

[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.10.10:80 wrr

-> 192.168.1.100:80 Masq 5 0 3

-> 192.168.1.200:80 Masq 10 0 6

案例二直接路由(LVS-DR

拓扑图:

 

一、实验步骤:

Server1的配置

1、配置内核参数

[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

2、添加路由,保证访问时候使用VIP返回

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

3、地址的配置

 

 

 

 

4、重启网络服务

[root@localhost ~]# service network restart

Server2的配置

1、配置内核参数

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

net.ipv4.conf.eth0.arp_announce = 2

net.ipv4.conf.all.arp_announce = 2

net.ipv4.conf.eth0.arp_ignore = 1

net.ipv4.conf.all.arp_ignore = 1

使上述内容生效

[root@localhost ~]# sysctl –p

2、地址配置

 

 

3、重启网络服务

[root@localhost ~]# service network restart

4、添加路由

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

[root@localhost ~]# route -n

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

192.168.1.101   0.0.0.0         255.255.255.255 UH    0      0        0 lo

192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0

Director的配置

1、地址的配置

 

增加逻辑接口

 

2、挂在光盘

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

[root@localhost ~]# mount /dev/cdrom /mnt/cdrom/

3、安装LVS的管理工具ipvsadm

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

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

4、开启ipvsadm服务

[root@localhost Cluster]# service ipvsadm save

Saving IPVS table to /etc/sysconfig/ipvsadm:               [确定]

[root@localhost Cluster]# service ipvsadm start

Clearing the current IPVS table:                           [确定]

Applying IPVS configuration:                               [确定]

[root@localhost Cluster]# chkconfig ipvsadm on

5、定义虚拟服务,采用轮循调度方法

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

6、并定义转发给分层服务器

[root@localhost Cluster]# ipvsadm -a -t 192.168.1.101:80 -r 192.168.1.100 -g

[root@localhost Cluster]# ipvsadm -a -t 192.168.1.101:80 -r 192.168.1.200 -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.1.101:80 rr

  -> 192.168.1.200:80             Route   1      0          0        

  -> 192.168.1.100:80             Route   1      0          0   

二、测试

访问http//192.168.1.101,看到如下页面

查看连接数目,达到负载均衡的目的

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

  -> 192.168.1.200:80             Route   1      0                 

  -> 192.168.1.100:80             Route   1      0          5