一、什么是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模式
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