一.LVS介绍
Linux 虚拟服务器(Linux Virtual Servers,LVS) 使用负载均衡技术将多台服务器组成一个虚拟服务器。它为适应快速增长的网络访问需求提供了一个负载能力易于扩展,而价格低廉的解决方案。
LVS (Linux Virtual Server)其实是一种集群(Cluster)技术,采用IP负载均衡技术(LVS 的 IP 负载均衡技术是通过 IPVS 模块来实现的,linux内核2.6版本以上是默认安装IPVS的)和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。
LVS负载均衡调度技术是在LINUX内核中实现的,因此被称之为LINUX虚拟服务器。我们使用该软件配置LVS时候,不能直接配置内核中的IPVS,而需要使用IPVS的管理工具ipvsadm进行管理,当然我们也可以通过keepalived软件直接管理IPVS及负载均衡器的高可用,并不是通过ipvsadm来管理ipvs。
二.LVS集群结构
(官网文件位置http://www.linuxvirtualserver.org/zh/lvs2.html)
LVS由前端的负载均衡器(Load Balancer,LB)和后端的真实服务器(Real Server,RS)群组成。RS间可通过局域网或广域网连接。LVS的这种结构对用户是透明的,用户只能看见一台作为LB的虚拟服务器(Virtual Server),而看不到提供服务的RS群。当用户的请求发往虚拟服务器,LB根据设定的包转发策略和负载均衡调度算法将用户请求转发给RS。RS再将用户请求结果返回给用户。
一般来说,LVS集群采用三层结构,其体系结构如图1所示,三层主要组成部分为:
负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务如mysql,网络文件系统或者分布式文件系统。
lvs可伸展的架构模型:可伸缩Web服务,可伸缩媒体服务,可伸缩Cache服务
三.LVS的工作模式:
LVS 的 IP 负载均衡技术是通过 IPVS 模块来实现的,IPVS 是 LVS集群系统的核心软件,它的主要作用是:安装在 DS(Director Server-lvs部署的服务器)上,同时在 DS(Director Server)上虚拟出一个 IP 地址,用户必须通过这个虚拟的 IP 地址访问服务器。这个虚拟 IP 一般称为 LVS 的VIP,即 Virtual IP。访问的请求首先经过 VIP 到达负载调度器,然后由负载调度器从 RS(Real Server)列表中选取一个服务节点响应用户的请求。
四.LVS三种工作模式:
客户端的ip地址定义为CIP,真实服务器的IP定义为RIP,lvs上的真实ip定义为:DIP,lvs上的虚拟ip定义为VIP
1.NAT模式-----网络地址转换(ip的转换)
1)NAT模式下ip报文改变图
2)NAT模式数据包走向说明:
a). 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
b). PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
c). IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP
d). POSTROUTING链通过选路,将数据包发送给Real Server
e). Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP
f). Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP。
3)NAT模式的特点:
a)RS应该使用私有地址,RS的网关必须指向DIP,否则报文无法送达客户端,DIP和RIP必须在同一个网段内
b)NAT 模式支持对 IP 地址和端口进行转换。即用户请求的端口和真实服务器的端口可以不一致
4)NAT模式优缺点:
优点:集群中的RS可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址
缺点:扩展性有限,一般要求最多之能 10-20 台节点。当服务器节点增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢!
2.DR模式--------->MAC地址的转换
1)DR模式下ip报文转换图:
2)DR模式数据包走向说明:
a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
b) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
c) IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
d) 由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
e) RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP
f) 响应报文最终送达至客户端
3)DR模式的特点:
a)请求的报文经过DS,而 RS 响应处理后的报文无需经过调度器DS ,因此并发访问量大时使用效率很高(和 NAT 模式比)。RS的网关绝不允许指向DIP(因为我们不允许他经过director)
b)由于 DR 模式的调度器仅做 MAC 地址的改写,所以不支持端口映射,端口必须一致
c)RS 主机需要绑定 VIP 地址在 LO 接口(掩码32 位)上,并且需要配置 ARP 抑制
d)因为 DR 模式是通过 MAC 地址改写机制实现转发,因此所有 RS 节点和DS 只能在一个局域网里面
3.TUN模型
在原有的IP报文外再次封装多一层IP首部,内部IP首部(源地址为CIP,目标IIP为VIP),外层IP首部(源地址为DIP,目标IP为RIP)
1) TUN模式下的ip报文转换图:
2)TUN模式数据包走向:
(a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。
(b) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(c) IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为为DIP,目标IP为RIP。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP
(d) POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。 此时源IP为DIP,目标IP为RIP
(e) RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。 此时的源IP地址为VIP,目标IP为CIP
(f) 响应报文最终送达至客户端
3)TUN模式的特点:
a)TUNNEL 模式必须在所有的 realserver 机器上面绑定 VIP 的 IP 地址
b)TUNNEL 模式的 vip ------>realserver 的包通信通过 TUNNEL 模式,不管是内网和外网都能通信,所以不需要 lvs vip 跟 realserver 在同一个网段内
c)TUNNEL 模式 realserver 会把 packet 直接发给 client 不会给 lvs 了
d)TUNNEL 模式走的隧道模式,所以运维起来比较难,所以一般不用。
4)TUN模式的优缺点:
优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发
缺点:隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上
4.FULLNAT模式
无论是 DR 还是 NAT 模式,不可避免的都有一个问题:LVS 和 RS 必须在同一个 VLAN 下,否则 LVS 无法作为 RS 的网关。
这引发的两个问题是:
a、同一个 VLAN 的限制导致运维不方便,跨 VLAN 的 RS 无法接入。
b、LVS 的水平扩展受到制约。当 RS 水平扩容时,总有一天其上的单点 LVS 会成为瓶颈
1)FULL-NAT模式数据包走向图:
2)FULL-NAT模式数据包走向说明:
a)在包从 LVS 转到 RS 的过程中,源地址从客户端 IP 被替换成了 LVS 的内网 IP,目的地址转换成RS的IP
b)当 RS 处理完接受到的包,返回时,会将这个包返回给 LVS 的内网 IP
c ) LVS 收到包后,在 NAT 模式修改源地址的基础上,再把 RS 发来的包中的目标地址从 LVS 内网 IP 改为客户端的 IP
3)Full-NAT 主要的思想是把网关和其下机器的通信,改为了普通的网络通信,从而解决了跨 VLAN 的问题。采用这种方式,LVS 和 RS 的部署在 VLAN 上将不再有任何限制,大大提高了运维部署的便利性
4)Full-NAT优缺点:
优点:FULL NAT 模式也不需要 LBIP 和 realserver ip 在同一个网段。保证 RS 回包一定能够回到 LVS。
五.LVS负载均衡调度算法
Lvs的调度算法决定了如何在集群节点之间分布工作负荷。当lvs收到来自客户端访问VIP的上的集群服务的入站请求时,lvs必须决定哪个集群节点应该处理请求。
1.静态算法:只根据算法进行调度而不考虑后端服务器的实际连接情况和负载情况
1)rr 轮询调度算法
均等的将外部请求按顺序轮流分配到集群中的真实服务器上
2)WRR 加权轮询调度算法
根据一定的权重将外部请求分配到集群中的真实服务器上,可以保证处理能力强的服务器处理更多的访问流量
3)SH 基于源地址hash调度算法
根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
4)DH 基于目的地址hash调度算法
根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
2.动态算法:前端的调度器会根据后端真实服务器的实际连接情况来分配请求,RS的负载状态通常由活动链接(active),非活动链接(inactive)和权重来计算
1)LC 最少连接
动态地将网络请求调度到已建立的链接数最少的服务器上
2)WLC 加权最少连接
在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。
3)LBLC:基于局部型最少连接
根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。主要用于Cache集群系统。
4)LBLCR 带复制的基于局部性最少连接
目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
LBLCR与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。
5)SED 最短延迟调度
在WLC基础上改进,Overhead = (ACTIVE+1)*256/加权,不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连接过多缺陷:当权限过大的时候,会倒置空闲服务器一直处于无连接状态。
6)NQ 永不排队/最少队列调度
无需队列。如果有台 RS的连接数=0就直接分配过去,不需要再进行sed(最短延迟调度)运算,保证不会有一个主机很空间。在SED基础上无论+几,第二次一定给下一个,保证不会有一个主机不会很空闲着,不考虑非活动连接,才用NQ,SED要考虑活动状态连接,对于DNS的UDP不需要考虑非活动连接,而httpd的处于保持状态的服务就需要考虑非活动连接给服务器的压力
4.生产环境中的调度算法的选择
1)一般的网络服务,如 www,mail,mysql 等常用的 LVS 调度算法为:
基本轮询调度 rr
加权最小连接调度 wlc
加权轮询调度 wrr
2)基于局部性的最小连接 lblc 和带复制的给予局部性最小连接 lblcr 主要适用于 web cache 和 DB cache ,一般不这么用。
3、源地址散列调度 SH 和目标地址散列调度 DH 可以结合使用在防火墙集群中,可以保证整个系统的出入口唯一。
实际适用中这些算法的适用范围很多,工作中最好参考内核中的连接调度算法的实现原理,然后根据具体的业务需求合理的选型。
rr,wrr,wlc是常用的。