LVS使用详解
一、LVS概述
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。LVS是开源负载均衡的代表性软件,它工作在内核级别,具备极好的性能和生产环境可用性。普通双CPU,8G服务器,在DR模式下即可承载高达数万甚至数十万的并发连接数。
LVS是四层负载均衡软件,与nginx和haproxy等七层负载均衡不同的是,它只能实现数据包的转发和四层一下内容的修改,无法实现反向代理或者修改七层访问请求。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。
二、LVS的结构及特点
简单来说,LVS的结构主要分为两层,前端用于接收并调度用户请求,我们称之为Load Balance。用户请求在经过LB调度后,会被转发到不同的工作服务器上,这些真正提供服务的服务器被称为Real Server。在大部分场景下,Real Server间可能还需要共享存储,这个可以被称为第三层,总体来说结构如下:
下面针对LVS的各层次进行说明:
1、 LB层。(Load Blance)
位于整个集群系统的最前端,有一台或者多台负载调度器(LB)组成,LVS模块就安装在LB上,而LB的主要作用类似于一个路由器,它含有完成LVS功能所设定的路由转发表,通过这些转发表把用户的请求分发到后端不同的Real Server上。
2、 RS层。(Real Server)
由一组实际运行应用服务的机器组成,Real Server可以是WEB服务器、MAIL服务器、FTP服务器、DNS服务器、视频服务器中的一个或者多个,每个Real Server之间通过高速的LAN或分布在各地的WAN相连接。
3、 共享存储层。(Shared Storage)
为所有Real Server提供共享存储空间和内容一致性的存储区域,在物理上,一般有磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS网络文件系统共享数据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件系统,例如Red hat的GFS文件系统,oracle提供的OCFS2文件系统等。
三、LVS中涉及的概念
VIP:虚拟IP,用户所能看到的唯一IP
RIP:真实IP,也就是Real Server的IP,真正提供数据服务的IP。
1、负载均衡机制
(1)VS/NAT模式
类似于网络中常用到的DNAT功能,它修改请求报文的目的IP地址并转发至指定Real Server。它的数据流程如下
(2)VS/DR模式
在DR模式中,与NAT模式不同的是,它并不修改请求报文的目的IP,而是修改报文的目的MAC,然后将报文直接转送至Real Server。响应数据包不再被送回LB,而是由RS直接发送回客户端。
(3)VS/TUN模式
TUN模式与DR模式有很多相同之处,唯一不同点在于,请求报文在LB处并不是修改MAC,而是再包裹一层IP头,转发到RealServer。响应数据包不再被送回LB,而是由RS直接发送回客户端。
2、负载调度算法
LVS总共有10种调度算法,分为两大类,分别为静态算法和动态算法。
静态算法:
(1) 轮询(rr,Round Robin)
这种算法LB并不考虑其它因素,而是按照列表中RS的顺序,依次派发用户请求(如RS1-->RS2-->RS3-->RS1这种顺序)。它是纯粹的1:1调度,用户的请求会被平均分配到每台RealServer。
(2) 加权轮询(wrr,Weighted Round Robin)
为每台RealServer设置一个权重值,用以区分不同性能服务器对请求的处理能力。LB会根据权重的比值进行请求的转发,比如RS1、RS2、RS3的权重分别为2、1、1,那么LB会以2:1:1的比例平均分配用户请求。可以认为当请求到达时,将以RS1àRS1àRS2àRS3àRS1àRS1这种顺序进行分配。
(3) 目标地址哈希(Destination Hashing)
destination hash,目的地址哈希。只要对同一个目的IP的请求,就会被转向同一个Real Server。它主要应用在Cache服务器环境中,但是具体是怎么应用的还是不清楚。比如,如何定义LVS的VIP
(4) 源地址哈希(Source Hashing)
source hash,源地址哈希。只要来自同一个客户端的请求,就会被转向同一个Real Server。这是Client级的负载。他会在director中保存一个哈希表,当有新请求进来时,首先对源IP进行哈希,然后跟哈希表进行对比,如果存在条目,则直接转发。
动态算法:
1. 最少链接(lc,Least Connections)
通过计算当前后端每个real server的活动连接数和非活动连接数的总数,然后进行对比。
计算公式为“active*256+inactive”
将选用值最小的服务器。
2. 加权最少链接(wlc,Weighted Least Connections)
相比于lc,计算公式发生变化:
(active*256+inactive)/weight
3. sed最小期望延迟
相比于wlc,计算公式又发生变化:
(active+1)/weight
它的效果是,最先到来的请求将被分配到权值最大的服务器上。
4. nq不排队算法
相比于sed,如果有台realserver的连接数=0就直接分配过去,不需要在进行sed运算,在没有连接数为0的Rs时,将继续使用sed算法。
5. 局部性最少链接(Locality-Based Least Connections)
LBLC调度算法先根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于其一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。
6. 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)
它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而 LBLC算法维护从一个目标IP地址到一台服务器的映射。对于一个“热门”站点的服务请求,一台Cache 服务器可能会忙不过来处理这些请求。这时,LBLC调度算法会从所有的Cache服务器中按“最小连接”原则选出一台Cache服务器,映射该“热门”站点到这台Cache服务器,很快这台Cache服务器也会超载,就会重复上述过程选出新的Cache服务器。这样,可能会导致该“热门”站点的映像会出现在所有的Cache服务器上,降低了Cache服务器的使用效率。
LBLCR调度算法将“热门”站点映射到一组Cache服务器(服务器集合),当该“热门”站点的请求负载增加时,会增加集合里的Cache服务器,来处理不断增长的负载;当该“热门”站点的请求负载降低时,会减少集合里的Cache服务器数目。这样,该“热门”站点的映像不太可能出现在所有的Cache服务器上,从而提供Cache集群系统的使用效率。LBLCR算法先根据请求的目标IP地址找出该目标IP地址对应的服务器组;按“最小连接”原则从该服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载;则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
在规划架构时,根据不同的需要选取不同的调度算法。如果不做设置,默认为wlc。
四、LVS的配置详解
4.1、NAT模式配置
NAT模式是最简单的配置模式,适合于较小规模集群中使用,RS的数量在10台以下。它无需对RS做任何修改,RS的操作系统可以为任何类型,只需要将RS的网关指向LB即可。NAT模式可以支持不同端口间的映射,比如vip的80到RIP的8080端口映射,具有较强的灵活性。
LB的环境:
eth0=42.202.144.14
eth1=192.168.1.1
eth0:0(VIP)=42.202.144.15(如果没有多余的IP,42.202.144.14也可以)
RS的环境:
eth0:192.168.1.x
gateway:192.168.1.1
LB基础环境配置:
1、 关闭LB的icmp_redirect数据包的发送
echo"0" >/proc/sys/net/ipv4/conf/all/send_redirects cat /proc/sys/net/ipv4/conf/all/send_redirects echo"0" >/proc/sys/net/ipv4/conf/default/send_redirects cat /proc/sys/net/ipv4/conf/default/send_redirects echo"0" >/proc/sys/net/ipv4/conf/eth1/send_redirects cat /proc/sys/net/ipv4/conf/eth1/send_redirects
2、 开启内核路由转发
echo"1" >/proc/sys/net/ipv4/ip_forward
3、 配置VIP
ifconfig eth1:142.202.144.15 netmask 255.255.255.255 up
lvs配置(以http服务为例)
首先清空lvs的规则条目
ipvsadm -C
(1) 为lvs指定监听的VIP
ipvsadm -A -t42.202.144.15:80 -s wlc
(2) 为lvs指定提供服务器的RS
ipvsadm -a -t 192.168.1.2:80 -m -w 1 ipvsadm -a -t 192.168.1.3:80 -m -w 1 ipvsadm -a -t 192.168.1.4:80 -m -w 1
至此,nat模式配置完成。
4.2、DR模式配置
DR模式在大规模集群中使用,RS的数量在100台以内。DR模式需要RS的操作系统支持,需要修改RS的系统参数。由于RS的数据包回应方式的原因,DR模式不支持端口映射功能,VIP所指定的服务端口,必须和RIP的服务端口相同。DR模式的原理是修改请求数据包的目的MAC地址,所以RS和LB必须在同一个广播域才可以生效。
LB的环境:
eth0=42.202.144.14
eth0:0(VIP)=42.202.144.15(如果没有多余的地址,VIP使用42.202.144.14也可以,RS上lo:0的地址将相应修改。)
RS的环境:
eth0=42.202.144.1x
lo:0=42.202.144.15
gateway=42.202.144.1
LB基础环境配置
1、 关闭路由转发
cat 0 > /proc/sys/net/ipv4/ip_forward
2、 配置VIP地址
ifconfig eth0:0 42.202.144.15 netmask 255.255.255.255 up
RS基础环境配置
1、 修改arp宣告等级,防止lo:0上的vip地址在网络启动时被宣告出去。
cat 2 > /proc/sys/net/ipv4/conf/all/arp_announce cat 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
2、 修改arp响应等级,方式lo:0的vip在从eth0口收到arp时产生回应。
cat 1 >/proc/sys/net/ipv4/conf/all/arp_ignore cat 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
3、关闭数据包合法性校验(如果VIP在lo上,可以不关闭。在TUN模式下必须关闭)
cat 0 > /proc/sys/net/ipv4/conf/all/rp_filter cat 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
3、 配置VIP
ifconfig lo:0 42.202.144.15 netmask 255.255.255.255 up
(注意必须是32位掩码,具体原因请参照arp)
ipvsadm规则配置
ipvsadm-A -t 42.202.144.15:80 -s wlc ipvsadm-a -t 42.202.144.11 -g -w 1 ipvsadm-a -t 42.202.144.12 -g -w 1 ipvsadm-a -t 42.202.144.13 -g -w 1
至此,DR模式配置结束
3、 TUN模式配置
TUN模式中,RS和LB可以不在同一个广播域,甚至不在同一个物理位置,RS可以跨国界。TUN模式与DR模式的原理虽然不同,但是它们的配置方式有很多相同之处,比如RS上的配置,TUN仍然不支持端口映射。不过在生产环境,这种模式并不常用,因为不同运营商之间对网络的配置不尽相同,有些运营商会检查RS回应包的源IP是否合法。从RS上发出的以VIP为源IP的回应包有可能被阻拦,比如,VIP在联通网内,RS在电信网内。这里还是使用DR模式的拓扑图,其实RS可以和LB不在同一个网内。
LB的环境:
eth0=42.202.144.14
eth0:0(VIP)=42.202.144.15(如果没有多余的地址,VIP使用42.202.144.14也可以,RS上lo:0的地址将相应修改。)
RS的环境:
eth0=42.202.144.1x
tunl0=42.202.144.15
gateway=42.202.144.1
LB基础环境配置
4、 关闭路由转发
cat 0 >/proc/sys/net/ipv4/ip_forward
5、 配置VIP地址
ifconfig eth0:0 42.202.144.15netmask 255.255.255.255 up
RS基础环境配置
4、 修改arp宣告等级,防止lo:0上的vip地址在网络启动时被宣告出去。
cat 2 > /proc/sys/net/ipv4/conf/all/arp_announce cat 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
5、 修改arp响应等级,方式lo:0的vip在从eth0口收到arp时产生回应。
cat 1 > /proc/sys/net/ipv4/conf/all/arp_ignore cat 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
4、 关闭数据包合法性校验
cat 0 > /proc/sys/net/ipv4/conf/all/rp_filter cat 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
6、 配置VIP
ifconfig tunl0 42.202.144.15 netmask 255.255.255.255 up
(注意必须是32位掩码,具体原因请参照arp)
ipvsadm规则配置
ipvsadm -A -t 42.202.144.15:80 -s wlc ipvsadm -a -t 42.202.144.11 -i -w 1 ipvsadm -a -t 42.202.144.12 -i -w 1 ipvsadm -a -t 42.202.144.13 -i -w 1
至此,TUN模式配置结束
五、生产环境中lvs实施
1、确认内核是否支持lvs
[root@com1~]# modprobe -l|grep ipvs kernel/net/netfilter/ipvs/ip_vs.ko kernel/net/netfilter/ipvs/ip_vs_rr.ko kernel/net/netfilter/ipvs/ip_vs_wrr.ko kernel/net/netfilter/ipvs/ip_vs_lc.ko kernel/net/netfilter/ipvs/ip_vs_wlc.ko kernel/net/netfilter/ipvs/ip_vs_lblc.ko kernel/net/netfilter/ipvs/ip_vs_lblcr.ko kernel/net/netfilter/ipvs/ip_vs_dh.ko kernel/net/netfilter/ipvs/ip_vs_sh.ko kernel/net/netfilter/ipvs/ip_vs_sed.ko kernel/net/netfilter/ipvs/ip_vs_nq.ko kernel/net/netfilter/ipvs/ip_vs_ftp.ko
2、安装软件
如果可以使用在线安装方式,请在线安装。ipvsadm仅仅是一个规则制定工具,真正工作的是内核中的ip_vs模块,所以ipvsadm工具的版本不重要。
yum install ipvsadm
如果没有在线安装方式,那么只能下载源码包编译安装。编译时需要具备内核的源码包,这个比较恶。如果这个解决不了也不要编译了。
把这个搞定之后,直接在ipvsadm源码目录里make即可。(没测试)
3、集群配置
在实施环境中,肯定要用脚本来跑,快准狠。
(1)NAT配置脚本
LB配置:
#!/bin/sh #------mini-HOWTO-setup-LVS-NAT-director---------- #set ip_forwardON for vs-nat director (1 on, 0 off). cat /proc/sys/net/ipv4/ip_forward echo "1" >/proc/sys/net/ipv4/ip_forward echo "0" >/proc/sys/net/ipv4/conf/all/send_redirects cat /proc/sys/net/ipv4/conf/all/send_redirects echo "0" >/proc/sys/net/ipv4/conf/default/send_redirects cat /proc/sys/net/ipv4/conf/default/send_redirects echo "0" >/proc/sys/net/ipv4/conf/eth0/send_redirects cat /proc/sys/net/ipv4/conf/eth0/send_redirects /sbin/sysctl -p &> /dev/null #setup VIP /sbin/ifconfig eth0:0 42.202.144.15 netmask 255.255.255.255 up #clear ipvsadmtables /sbin/ipvsadm -C #install LVS services with ipvsadm #add telnet to VIP with rr sheduling /sbin/ipvsadm -A -t 192.168.2.110:telnet -s rr #first realserver #forward telnet to realserver 42.202.144.11 using LVS-NAT (-m), with weight=1 /sbin/ipvsadm-a -t 42.202.144.15:telnet -r 42.202.144.11:telnet -m -w 1 #check that realserver is reachable from director ping -c 1 192.168.1.11 #second realserver #forward telnet to realserver 192.168.1.12 using LVS-NAT (-m), with weight=1 /sbin/ipvsadm -a -t 42.202.144.15:telnet -r 42.202.144.12:telnet -m -w 1 #checking if realserver is reachable from director ping -c 1 192.168.1.12 /sbin/ipvsadm
(2)DR模式配置脚本
LB配置
#!/bin/bash #---------------mini-rc.lvs_dr-director------------------------ #set ip_forward OFF forlvs-dr director (1 on, 0 off) #add ethernet device androuting for VIP 192.168.1.110 /sbin/ifconfig eth0:0 42.202.144.15netmask 255.255.255.255 up /sbin/route add -host 42.202.144.15dev eth0:0 #setup_ipvsadm_table #clear ipvsadm table /sbin/ipvsadm -C #installing LVS serviceswith ipvsadm #add telnet to VIP withround robin scheduling /sbin/ipvsadm -A -t 42.202.144.15:telnet-s rr #forward telnet torealserver using direct routing with weight 1 /sbin/ipvsadm -a -t 42.202.144.15:telnet-r 42.202.144.11 -g -w 1 #check realserverreachable from director ping -c 1 42.202.144.11 #forward telnet torealserver using direct routing with weight 1 /sbin/ipvsadm -a -t 42.202.144.15:telnet-r 42.202.144.12 -g -w 1 #check realserverreachable from director ping -c 1 42.202.144.12 #displaying ipvsadmsettings /sbin/ipvsadm
RS配置
#!/bin/bash #----------mini-rc.lvs_dr-realserver------------------ #install_realserver_vip /sbin/ifconfig lo:0 42.202.144.15netmask 255.255.255.255 up #installing route for VIP42.202.144.15 on device lo:0 /sbin/route add -host 42.202.144.15dev lo:0 #hiding interface lo:0,will not arp echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce echo 2 >/proc/sys/net/ipv4/conf/eth0(RIP所在的接口)/arp_announce echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter echo 0 >/proc/sys/net/ipv4/conf/eth0/rp_filter #----------mini-rc.lvs_dr-realserver------------------
(3)TUN模式配置脚本
LB配置
#!/bin/bash #---------------mini-rc.lvs_dr-director------------------------ #set ip_forward OFF forlvs-dr director (1 on, 0 off) #add ethernet device androuting for VIP 192.168.1.110 /sbin/ifconfig eth0:0 42.202.144.15netmask 255.255.255.255 up /sbin/route add -host 42.202.144.15dev eth0:0 #setup_ipvsadm_table #clear ipvsadm table /sbin/ipvsadm -C #installing LVS serviceswith ipvsadm #add telnet to VIP withround robin scheduling /sbin/ipvsadm -A -t 42.202.144.15:telnet-s rr #forward telnet torealserver using direct routing with weight 1 /sbin/ipvsadm -a -t 42.202.144.15:telnet-r 42.202.144.11 -g -w 1 #check realserverreachable from director ping -c 1 42.202.144.11 #forward telnet torealserver using direct routing with weight 1 /sbin/ipvsadm -a -t 42.202.144.15:telnet-r 42.202.144.12 -g -w 1 #check realserverreachable from director ping -c 1 42.202.144.12 #displaying ipvsadmsettings /sbin/ipvsadm
RS配置
#!/bin/bash #----------mini-rc.lvs_dr-realserver------------------ #install_realserver_vip /sbin/ifconfig tunl0 42.202.144.15netmask 255.255.255.255 up #installing route for VIP42.202.144.15 on device lo:0 /sbin/route add -host 42.202.144.15dev tunl0 #hiding interface tunl0,will not arp echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 >/proc/sys/net/ipv4/conf/eth0(RIP所在的接口)/arp_announce echo 0 >/proc/sys/net/ipv4/conf/all/rp_filter echo 0 >/proc/sys/net/ipv4/conf/eth0/rp_filter #----------mini-rc.lvs_dr-realserver------------------
六、其他案例
本文出自 “征途小站” 博客,请务必保留此出处http://doctorz.blog.51cto.com/9674137/1883151
原文地址:http://doctorz.blog.51cto.com/9674137/1883151