一、lvs简介
LVS是 Linux Virtual Server 的简称,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。这是一个由章文嵩博士发起的,是中国国内最早出现的自由软件开源项目之一,现在 LVS 已经是 Linux 内核标准的一部分。使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层、Server集群层和共享存储。
在已有的IP负载均衡技术中,主要有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation)。在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出了通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性。VS/NAT、VS/TUN和VS/DR技术是LVS集群中实现的三种IP负载均衡技术。
二、lvs组成
1. 安装包
[root@mumu 7-1 ~]# yum -y install ipvsadm
2. 组成
LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。
2.1 ipvs(ip virtual server)
工作在内核空间,是真正生效实现调度的代码。
2.2 ipvsadm
工作在用户空间,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)。
三、lvs工具的简单使用
1、管理集群服务
添加一条新的虚拟服务
ipvsadm -A -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags] -A:添加一条新的虚拟服务 -t:TCP协议的端口,VIP:TCP_POPT -u:UDP协议的端口,UIP:UCP_POP -f:FWM: 防火墙标记;firewall MARK,是一个数字 -p:timeout 指定持久连接时长,默认为360秒,单位是秒,即6分钟 -M:定义Mac地址 --pe:定义持久化引擎 -b:定义进程调度标记 service-address:某集群服务的IP地址 -s:指定集群的调度算法,如:rr, wrr, lc等,默认为wlc
删除一条虚拟服务
ipvsadm -D -t|u|f service-address -D:删除一条虚拟服务
修改一条虚拟服务
ipvsadm -E -t|u|f service-address -E:修改一条虚拟服务
2、管理集群服务中的RS
在一个虚拟服务中添加一个新的真实服务器
ipvsadm -a -t|u|f service-address -r server-address [-g|i|m] [-w weight] -t|u|f service-address:事先定义好的某类型集群服务 -r server-address: 定义某RS的地址,在NAT模型中,可使用IP:PORT实现端口映射; [-g|i|m]: LVS类型 -g: gateway, dr类型 -i: ipip, tun类型 -m: masquerade, nat类型 [-w weight]: 定义服务器权重
删除某个真实服务器
ipvsadm -d -t|u|f service-address -r server-address -d:删除某个真实服务器,即RS
修改某个真实服务器
ipvsadm -e -t|u|f service-address -r server-address -e:修改某个真实服务器,即RS
查看某个真实服务器
ipvsadm -L|l -t|u|f service-address -r server-address -L|l :查看某个真实服务器,即RS
-n: 数字格式显示主机地址和端口 --stats:统计数据 --rate: 速率 --timeout: 显示tcp、tcpfin和udp的会话超时时长 -c: 显示当前的ipvs连接状况
3、管理ipvs规则
ipvsadm -S|R > 文件路径 -C:清除所有的集群服务规则 -S = ipvsadm-save:保存之前所定义的集群服务规则 -R = ipvsadm-restore:重载此前所定义的集群服务规则 文件路径:指定的保存或重载的文件路径
ipvsadm -C:清除所有的集群服务规则
ipvsadm -Z -t|u|f service-address -Z:将当前定义的所有集群服务清零
4、查看统计
查看当前配置的虚拟服务和各个RS的权重
ipvsadm -Ln
查看当前ipvs模块中记录的连接(可用于观察转发情况)
ipvsadm -lnc
查看ipvs模块的转发情况统计
ipvsadm -Ln --stats | --rate
四、lvs的三种工作模式
1、NAT 模式-网络地址转换
1. 模式流程图
2、NAT模式原理
(1)当客户端发送请求报文请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链,此时报文的源IP为CIP,目标IP为VIP
(2)内核空间中的PREROUTING链会检查数据包的目标IP是否是本机IP,若是,将数据包送至INPUT链
(3)判断IPVS比对数据包请求的服务是否为集群服务,若是,调度器会把数据包的目标IP地址修改为后端真实服务器的IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP (此RIP地址是根据调度算法得出的)
(4)POSTROUTING链根据调度算法决定将数据包发送给后端的真实服务器(Real Server)
(5)Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP
(6)Director Server在响应客户端前,此时会将包的源IP地址修改为自己的虚拟地址(VIP),然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP
(7)响应报文最终送达至客户端
3、特点
(1)RIP和DIP必须在同一个IP网络,且应该使用私网地址;RS的网关要指向DIP;
(2)请求报文和响应报文都必须经由Director转发;Director易于成为系统瓶颈;
(3)支持端口映射,可修改请求报文的目标PORT;
(4)vs必须是Linux系统,rs可以是任意系统;
4、优缺点
4.1 优点
集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址。
4.2 缺点
扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢!
2、DR模式-封装新的MAC地址
1. 模式流程图
2、DR模式原理
(1)当客户端发送请求报文请求请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(2)内核空间中的PREROUTING链会检查数据包的目标IP是否是本机IP,若是,将数据包送至INPUT链
(3)IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址,此时报文的源IP为CIP,目标IP为VIP
(4)因为DR模式是通过MAC地址改写机制实现转发,因此所有RS节点和调度器LB只能在一个局域网里面,也可以简单的理解为在同一台交换机上,所以是通过二层来传输,。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server
(5)RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP
(6)响应报文最终送达至客户端
3、特点
(1)确保前端路由器将目标IP为VIP的请求报文发往Director
(2)RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director;
(3)RS跟Director要在同一个物理网络;
(4) 请求报文要经由Director,但响应不能经由Director,而是由RS直接发往Client;
(5)不支持端口映射;
4、优缺点
4.1 优点
和TUN(隧道模式)一样,负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户端。与VS-TUN相比,VS-DR这种实现方式不需要隧道结构,因此可以使用大多数操作系统做为物理服务器。
4.2 缺点
要求负载均衡器的网卡必须与物理网卡在一个物理段上。
3、Tun模式-IP Tunnel封装
1. 模式流程图
2、TUN模式原理
(1)当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(2)PREROUTING检查发现数据包的目标IP是否是本机IP,若是,将数据包送至INPUT链
(3)IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部进行IP Tunnel封装,即在原有的包头加上IP Tunnel的包头,然后发送出去,封装源IP为为DIP,目标IP为RIP。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP
(4)POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。 此时源IP为DIP,目标IP为RIP
(5)RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP Tunnel包头信息后,会发现里面还有一层IP首部,而且目标IP是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递,不需要经过负载均衡器。 此时的源IP地址为VIP,目标IP为CIP
(6)响应报文最终送达至客户端
3、特点
(1)DIP, VIP, RIP都应该是公网地址;
(2)RS的网关不能,也不可能指向DIP;
(3)请求报文要经由Director,但响应不能经由Director;
(4)不支持端口映射;
(5)RS的OS得支持隧道功能;
4、优缺点
4.1 优点
负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。
4.2 缺点
隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。
五、lvs的调度算法
1、算法分类
Lvs的调度算法决定了如何在集群节点之间分布工作负荷。当director调度器收到来自客户端访问VIP的上的集群服务的入站请求时,director调度器必须决定哪个集群节点应该处理请求。Director调度器用的调度方法基本分为两类:
固定调度算法:rr,wrr,dh,sh
动态调度算法:wlc,lc,lblc,lblcr,sed,nq
2、算法介绍
1. 轮叫调度算法 rr(Round Robin)
就是将请求按顺序调度到不同的 RS 上,即是将请求在 RS 中均摊分配,该算法是这些调度算法中最简单的。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去,但只适合于 RS 处理性能差不多的情况。
2. 加权轮询调度算法 wrr(weight Round Robin,加权轮询,以权重之间的比例实现在各主机之间进行调度)
wrr算法是对rr算法的一种优化和补充,因此,wrr算法比rr算法多了一个权重的概念。lvs根据每台服务器的性能,判断给每台服务器要添加的权值,依据这个权值给不同服务器分配任务。如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,将优先获得任务,但处理的请求也越多,并且分配到的连接数将比权值低的服务器更多,权重的取值范围 0 – 100,相同权值的 RS 得到相同数目的连接数。
3. 最小连接数调度算法 lc(Least-Connection)
这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1
4. 加权最小连接数调度算法 wlc(Weighted Least-Connection Scheduling)
wlc是lc的升级版,多了对权重的计算这一步。lvs获得权值后,LB会比较将连接请求发送到当前连接最少的RS。
5. 基于地址的最少连接调度算法 lblc(Locality-Based Least Connection)
这个算法是请求数据包的目标 IP 地址的一种调度算法,这个算法会先根据请求的目标IP地址,寻找该IP地址最近所使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则就将这个请求分配给连接数最小的服务器,并以它作为下一次分配的首先考虑。
6. 复杂的基于局部性最少的连接算法 lblcr(Locality-Based Least Connections withReplication)
记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。
7. 目标地址哈希调度算法 dh(Destination hashing:目标地址散列。把同一个IP地址的请求,发送给同一个server。)
该算法是根据目标 IP 地址为关键字通过散列函数查找一个静态hash表,将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。
8. 源地址哈希调度算法 sh(source hashing,源地址散列。主要实现会话绑定,能够将此前建立的session信息保留了)
与目标地址散列调度算法类似,但它是根据源地址为关键字通过散列函数查找一个静态hash表,发往该目标 IP 的请求会静态分配给固定的服务器。
9. 最短延迟调度算法 sed(Shortest Expected Delay)
是wlc的进一步改进,为了解决当权限过大时,会导致空闲服务器一直处于无连接状态的问题,计算方式:Overhead=(Active+1)*256/加权,不再考虑非活动状态,把当前处于活动状态的数目加一来实现,数目最小的接受下次请求,而+1的目的是为了考虑加权的时候,非活动链接过多。
10. 永不排队/最少对了调度算法 nq(Never Queue Scheduling)
是sed的进一步升级,如果有台RS的连接数等于零就直接分配过去,不需要再进行sed运算,保证不会有任何一个主机空闲。如果RS的连接数不等于零,在sed基础上,无论计算结果如何,第二次客户请求一定会给下一个RS,保证不会有一个RS空闲。
3、算法的生产环境选型
(1)一般的网络服务,如http,mail,mysql等常用的LVS调度算法为:
a. 基本轮询调度rr
b. 加权最小连接调度wlc
c. 加权轮询调度wrc
(2)基于局部性的最小连接lblc和带复制的给予局部性最小连接lblcr主要适用于web cache和DB cache。
(3)源地址散列调度SH和目标地址散列调度DH可以结合使用在防火墙集群中,可以保证整个系统的出入口唯一。实际适用中这些算法的适用范围很多,工作中最好参考内核中的连接调度算法的实现原理,然后根据具体的业务需求合理的选型。
六、lvs的持久性连接
对于电子商务网站来说,用户在挑选商品的时候使用的是80端口来浏览的,当付款的时候则是通过443的ssl加密的方式,当然当用户挑选完商品付款的时候,我们当然不希望https的443跳转到另外一台REAL SERVER上,很显然应该是同一REAL SERVER才对,这时候就要用到基于防火墙标记的持久连接,通过定义端口的姻亲关系来实现。在生产环境中用的最多的也是PNMP即基于防火墙标记的持久连接,好了引子就说到这下面我们就来详细说说LVS的持久连接;
1、PPC(Persistent Port Connections)
将来自于同一个客户端对同一个集群服务的请求,始终定向至此前选定的RS;(持久端口连接)
例如:client---->LVS(80)---->RS1 或 client---->LVS(23)---->RS2
缺陷:期望访问不同的端口到同一台RS上,无法实现。
配置:
ipvsadm -A -t 172.16.100.1:80 -s rr -p 3600 ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.10 -g -w 2 ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.11 -g -w 2
2、PCC(Persistent Client Connections)
将来自于同一个客户端对所有端口的请求,始终定向至此前选定的RS;(持久客户端连接)
说明:PCC是一个虚拟服务没有端口号(或者端口号为0),以"-p" 来标识服务。
缺陷:定向所有服务,期望访问不同的Real Server无法实现。
配置:
ipvsadm -A -t 172.16.100.1:0 -s rr -p 3600 ipvsadm -a -t 172.16.100.1:0 -r 172.16.100.10 -g -w 2 ipvsadm -a -t 172.16.100.1:0 -r 172.16.100.11 -g -w 2
3、PNMPP(Persistent Netfilter Marked Packet Persistence)
持久防火墙标记连接,根据iptables 的规则,将对于某类服务几个不同端口的访问定义为一类;先对某一特定类型的数据包打上标记,然后再将基于某一类标记的服务送到后台的 Real Server上去,后台的Real Server 并不识别这些标记。将持久和防火墙标记结合起来就能够实现端口姻亲功能,只要是来自某一客户端的对某一特定服务(需要不同的端口)的访问都定义到同一台 Real Server上去。
案例:一个用户在访问购物网站时同时使用HTTP(80)和HTTPS(443)两种协议,我们需要将其定义到同一台Real Server上,而其他的服务不受限制。
配置:
iptables -t mangle -A PREROUTING -d 172.16.100.1 -i eth0 -p tcp --dport 80 -j MARK --set-mark 8 iptables -t mangle -A PREROUTING -d 172.16.100.1 -i eth0 -p tcp --dport 443 -j MARK --set-mark 8 ipvsadm -A -f 8 -s rr -p 600 ipvsadm -a -f 8 -r 172.16.100.10 -g -w 2 ipvsadm -a -f 8 -r 172.16.100.11 -g -w 1