一、LVS的简介
LVS是一个开源的软件,由毕业于国防科技大学的章文嵩博士于1998年5月创立,可以实现LINUX平台下的简单负载均衡。LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器。
如图:
技术简介
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)
拓扑图:
二、实验步骤:
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、安装LVS(linux 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 5
-> 192.168.1.100:80 Route 1 0 5