LVS架构模型及调度算法

本文详细介绍了LVS负载均衡的概念、组成及工作原理,深入探讨了三种调度模式(NAT、DR、TUN)的特点与优缺点,并概述了LVS支持的多种调度算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、LVS简介

   Internet的快速增长使多媒体网络服务器面对的访问数量快速增加,服务器需要具备提供大量并发访问服务的能力,因此对于大负载的服务器来讲, CPU、I/O处理能力很快会成为瓶颈。由于单台服务器的性能总是有限的,简单的提高硬件性能并不能真正解决这个问题。为此,必须采用多服务器和负载均衡技术才能满足大量并发访问的需要。Linux 虚拟服务器(Linux Virtual Servers,LVS) 使用负载均衡技术将多台服务器组成一个虚拟服务器。它为适应快速增长的网络访问需求提供了一个负载能力易于扩展,而价格低廉的解决方案。LVS通过工作于内核的ipvs模块来实现功能,其主要工作于netfilter 的INPUT链上。LVS具有以下优秀特质:

1.高可用性
     LVS是一个基于内核级别的应用软件,因此具有很高的处理性能,用LVS构架的负载均衡集群系统具有优秀的处理能力,每个服务节点的故障不会影响整个系统的正常使用,同时又实现负载的合理均衡,使应用具有超高负荷的服务能力,可支持上百万个并发连接请求。如配置百兆网卡,采用VS/TUN或VS/DR调度 技术,整个集群系统的吞吐量可高达1Gbits/s;如配置千兆网卡,则系统的最大吞吐量可接近10Gbits/s。

2. 高可靠性
      LVS负载均衡集群软件已经在企业、学校等行业得到了很好的普及应用,国内外很多大型的、关键性的web站点也都采用了LVS集群软件,所以它的可靠性在 实践中得到了很好的证实。有很多以LVS做的负载均衡系统,运行很长时间,从未做过重新启动。这些都说明了LVS的高稳定性和高可靠性。

3.适用性强
     LVS对前端Director Server目前仅支持Linux和FreeBSD系统,但是支持大多数的TCP和UDP协议,支持TCP协议的应用有:HTTP,HTTPS ,FTP,SMTP,,POP3,IMAP4,PROXY,LDAP,SSMTP等等。支持UDP协议的应用有:DNS,NTP,ICP,视频、音频流播放协议等。
LVS对Real Server的操作系统没有任何限制,RealServer可运行在任何支持TCP/IP的操作系统上,包括Linux,各种Unix(如FreeBSD、SunSolaris、HP Unix等),Mac/OS和Windows等。


二、LVS的组成

(1)结构划分

LVS架构从逻辑上可分为调度层、Server集群层和共享存储

LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。

1. ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
2. ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,设置lvs模型、调度方式以及指定后端主机


(2)名词解释
1.调度器:Virtual Server(VS),Director(调度器),Dispatcher(分发器),Balancer(负载均衡器)

      设置lvs模型、调度方式以及指定后端主机

2.真实主机:Real Server(RS)。

      真正提供服务的后端服务器

3.Client IP:

      客户端访问服务时所使用的IP地址,简称CIP

4.Director Virtual IP:

      调度器用于与客户端通信的IP地址,简称为VIP

5.Director IP

      调度器用于与RealServer通信的IP地址,简称为DIP。

6.Real Server : 

      后端主机的用于与调度器通信的IP地址,简称为RIP。



LVS结构与工作原理

一.LVS的结构

  LVS由前端的负载均衡器(Load Balancer,LB)和后端的真实服务器(Real Server,RS)群组成。RS间可通过局域网或广域网连接。LVS的这种结构对用户是透明的,用户只能看见一台作为LB的虚拟服务器(Virtual Server),而看不到提供服务的RS群。当用户的请求发往虚拟服务器,LB根据设定的包转发策略和负载均衡调度算法将用户请求转发给RS。RS再将用户请求结果返回给用户。
  

二.LVS内核模型


1.当客户端的请求到达负载均衡器的内核空间时,首先会到达PREROUTING链。

2.当内核发现请求数据包的目的地址是本机时,将数据包送往INPUT链。

3.LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作,IPVS工作在INPUT链上,当数据包到达INPUT链时,首先会被IPVS检查,如果数据包里面的目的地址及端口没有在规则里面,那么这条数据包将被放行至用户空间。

4.如果数据包里面的目的地址及端口在规则里面,那么这条数据报文将被修改目的地址为事先定义好的后端服务器,并送往POSTROUTING链。

5.最后经由POSTROUTING链发往后端服务器。

三.LVS的三种调度模式

1.NAT模型:


①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP(客户端IP),后面统称为CIP),目标地址为VIP(负载均衡器前端地址,后面统称为VIP)。

②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标地址改为了后端服务器的RIP地址并将报文根据算法发送出去。

③.报文送到Real Server后,由于报文的目标地址是自己,所以会响应该请求,并将响应报文返还给LVS。

④.然后lvs将此报文的源地址修改为本机并发送给客户端。注意:在NAT模式中,Real Server的网关必须指向LVS,否则报文无法送达客户端

从客户端到调度器的数据包的源IP是CIP,目的IP是VIP,然后DNAT把其目的地址从VIP转换为RIP,所有数据包从DIP发送到RIP是,其源IP为CIP,目的IP为RIP。这样客户端的请求就到达了调度器选择的某一个RS上,然后此RS根据请求,向CIP发送一个响应,如果RIP直接响应CIP,不经过调度器,客户端收到一个源IP不是VIP的数据包,肯定莫名奇妙呀,明明我请求的是VIP,怎么会返回RIP的数据包呢?所以,RS响应客户端请求时,得重新把源地址为RIP的数据转换成VIP。然后客户端就收到响应啦

原理:

基于ip伪装MASQUERADES,原理是多目标DNAT。
所以请求和响应都经由Director调度器。

在此模式下 ,我们只用把VIP设置为公网IP,把其他的DIP,RIP设置为私有地址,就可以提供服务器并满足负载均衡的需求了。而且,此模式还支持端口映射~因为调度器只是发送一个请求到后端服务器,所以VS必须是linux,比较LVS是linux上的东东,还加到内核了,RS就可以是任何系统了,能提供服务就好。


LVS-NAT的优点与缺点
优点:
  • 支持端口映射
  • RS可以使用任意操作系统
  • 节省公有IP地址。
    RIP和DIP都应该使用同一网段私有地址,而且RS的网关要指向DIP。
    使用nat另外一个好处就是后端的主机相对比较安全。
缺点:
  • 请求和响应报文都要经过Director转发;极高负载时,Director可能成为系统瓶颈。
    就是效率低的意思。

特点:

  • RS应该使用私有地址,RS的网关必须指向DIP
  • DIP和RIP必须在同一个网段内
  • 请求和响应报文都需要经过Director Server,高负载场景中,Director Server易成为性能瓶颈
  • 支持端口映射
  • RS可以使用任意操作系统
  • 缺陷:对Director Server压力会比较大,请求和响应都需经过director server

2.DR模型:


①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。

②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的源MAC地址改为自己DIP的MAC地址,目标MAC改为了RIP的MAC地址,并将此包发送给RS。

③.RS发现请求报文中的目的MAC是自己,就会将次报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端。注意:需要设置lo接口的VIP不能响应本地网络内的arp请求

当客户端的请求经过无数个路由器,交换机到达我们的调度器时,此过程中源IP是客户端的CIP,目的IP是调度器的VIP,到达调度器的内网时,请求报文的源MAC地址为网关的MAC地址,目的MAC地址就是VIP所在的MAC地址。(这个东东必须明晰!不然后面理解有点困难,此处默认大家有基本的网络知识!)此结构中我们的VIP和DIP其实是同一个,然后我们把请求的数据包转发给处在同一网络中的VS选择的一个RS。此时的请求数据包的源IP依然是CIP,目的IP依然是VIP不变,但是目的MAC地址变为RIP所在接口的MAC地址。(必须知道,IP地址是逻辑上的地址,MAC地址才是真正的通信地址,所以我们才可以通过修改MAC地址发送到指定的RS)。RS接收到数据后,假如她能根据请求进行响应,直接发给客户端。这样就响应报文就不用经过调度器。

网关就通过MAC地址将客户端的请求发送给VIP所在的接口,因为是客户端请求,最后由网关发送到VIP的。所以,从网关出去时源IP为CIP,目的IP为VIP,源MAC为网关接口的MAC,目的IP为VIP所在接口的MAC,VS接收到请求数据包之后,根据调度策略选择一个合适的RS,然后从VIP接口发出,到RS所在的RIP接口,此时,源IP还是CIP,目的IP还是VIP,源MAC是VS的VIP所在的接口MAC,目的MAC是RIP所在接口的MAC,然后RS接收到数据包后,查看一下,嗯目的IP是我接口的IP,目的MAC是我接口的MAC,然后继续解封装到应用层,把请求给对应的服务器程序。服务器收到程序后,再从RS的VIP发送响应数据,此时源IP就为送出接口的IP即VIP,目的IP就是CIP啦~然后就实现所谓的响应报文不经过调度器啦。

不过有个问题还是没解决,RIP收到请求数据包后,在从此接口发出去的时候源IP依然是RIP,怎样才能实现上文提到的源IP为VIP呢?LVS在此处的设计相当精巧。在linux中有个思想就是,ip是属于内核的而不是接口的。即接口a上 有个IP1,接口b上有个ip2,当从a接口收到一个数据包,问接口a你有没有ip2呀,接口a回复说我有ip2,然后接口a收到ip2的数据包之后就转发给接口b。还有一点,一个数据包从哪个接口发出去,它的源 IP就是哪个接口的ip,即从接口a发出去的数据包的源ip为接口a的ip,但是从接口a发出,但转发到接口b发送给另外一个接口,源ip还是接口a的ip。根据这两个常识,第三种的实现如下:RS接收数据包的接口依然是RIP,但是我们把VIP设置到lo0环回接口上,因为接口a都会把lo0接口上的VIP告诉别人,所以我们得通过设置内核参数让ip地址就属于接口本身,不属于接口的ip他不能告诉别人。第二,我们让数据包从lo0口发出,然后从RIP所在的接口发送给外部主机,这样源IP就是lo0接口所在的VIP啦

因为LVS-dr模式是通过修改目的MAC地址来把请求报文从VS发送到RS的,而且MAC不能跨网络,所以LVS-dr模式只能用在同一广播域中。

原理

当Director接收到请求之后,通过调度方法选举出RealServer。
讲目标地址的MAC地址改为RealServer的MAC地址。
RealServer接受到转发而来的请求,发现目标地址是VIP。RealServer配置在lo接口上。
处理请求之后则使用lo接口上的VIP响应CIP。

LVS-DR的优点与缺点
优点:
  • RIP可以使用私有地址,也可以使用公网地址。
    只要求DIP和RIP的地址在同一个网段内。
  • 请求报文经由Director调度,但是响应报文不经由Director。
  • RS可以使用大多数OS
缺点:
  • 不支持端口映射。
  • 不能跨局域网。

特点:
  • 在前端路由器做静态地址路由绑定,将对于VIP的地址仅路由到Director Server
  • 存在问题:用户未必有路由操作权限,因为有可能是运营商提供的,所以这个方法未必实用
  • arptables:在arp的层次上实现在ARP解析时做防火墙规则,过滤RS响应ARP请求。这是由iptables提供的
  • 修改RS上内核参数(arp_ignore和arp_announce)将RS的VIP配置在lo接口的别名上,并限制其不能响应对VIP地址解析请求。


3.TUN模型:


①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。

②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。

③.RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡直接发送给客户端。注意:需要设置lo接口的VIP不能在共网上出现

(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) 响应报文最终送达至客户端

原理:

基于隧道封装技术。在IP报文的外面再包一层IP报文。
当Director接收到请求的时候,选举出调度的RealServer
当接受到从Director而来的请求时,RealServer则会使用lo接口上的VIP直接响应CIP。
这样CIP请求VIP的资源,收到的也是VIP响应。

LVS-TUN的优点与缺点
优点:
  • RIP,VIP,DIP都应该使用公网地址,且RS网关不指向DIP;
    只接受进站请求,解决了LVS-NAT时的问题,减少负载。
    请求报文经由Director调度,但是响应报文不需经由Director。
缺点:
  • 不指向Director所以不支持端口映射。
  • RS的OS必须支持隧道功能。
  • 隧道技术会额外花费性能,增大开销。

特点:

  • RIP、VIP、DIP全是公网地址
  • RS的网关不会也不可能指向DIP
  • 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
  • 不支持端口映射
  • RS的系统必须支持隧道

4.FULL-NAT模型:

客户端向VS发送请求,VS接收到请求后,根据调度策略选择某一个RS,然后把请求的源ip地址从CIP改为DIP,目的IP从VIP改为RIP,发送到后端服务器,后端服务器收到请求后,再向VS响应请求,发送到VS,然后VS在通过地址转换发送到客户端,整个过程就是这么简单

解决异地问题

四.LVS的调度算法

LVS的调度算法分为静态与动态两类。
1.静态算法(4种):只根据算法进行调度 而不考虑后端服务器的实际连接情况和负载情况

①.RR:轮询调度(Round Robin)
  调度器通过”轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。

②.WRR:加权轮叫(Weight RR)
  调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

③.DH:目标地址散列调度(Destination Hash )
  根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

④.SH:源地址 hash(Source Hash)
  源地址散列”调度算法根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

2.动态算法(6种):前端的调度器会根据后端真实服务器的实际连接情况来分配请求

①.LC:最少链接(Least Connections)
  调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。

②.WLC:加权最少连接(默认采用的就是这种)(Weighted Least Connections)
  在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

③.SED:最短延迟调度(Shortest Expected Delay )
  在WLC基础上改进,Overhead = (ACTIVE+1)*256/加权,不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连接过多缺陷:当权限过大的时候,会倒置空闲服务器一直处于无连接状态。

④.NQ永不排队/最少队列调度(Never Queue Scheduling NQ)
  无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空间。在SED基础上无论+几,第二次一定给下一个,保证不会有一个主机不会很空闲着,不考虑非活动连接,才用NQ,SED要考虑活动状态连接,对于DNS的UDP不需要考虑非活动连接,而httpd的处于保持状态的服务就需要考虑非活动连接给服务器的压力。假如有两台RS,从vs过来两个请求,第一个给权重大的那个RS,第二个给空闲的哪个,后面的再根据负载计算进行分配,这样就保证了即使权重小也不会一直控线啦。

⑤.LBLC:基于局部性的最少链接(locality-Based Least Connections)
  基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。不过依然有个问题,假如有两台机器,一台权重为1,另一台权重为10,当地一个请求进来时,经过计算第一台为256,第二个为25.6,然后就把第一个请求给第二台服务器,第二请求过来,经过计算依然给第2台服务器,如果一次过来9个请求,都会全部给第二台主机,那么第一台就一直处于等待状态,就算能力再差也至少得处理一个请求把~所以有下面这种调度方法。

⑥. LBLCR:带复制的基于局部性最少连接(Locality-Based Least Connections with Replication)
  带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

LVS的八种调度方法
静态方法:仅依据算法本身进行轮询调度
  • RR:Round Robin,轮调
    一个接一个,自上而下
  • WRR:Weighted RR,加权论调
    加权,手动让能者多劳。
  • SH:SourceIP Hash
    来自同一个IP地址的请求都将调度到同一个RealServer
  • DH:Destination Hash
    不管IP,请求特定的东西,都定义到同一个RS上。
动态方法:根据算法及RS的当前负载状态进行调度
  • LC:least connections(最小链接数)
    链接最少,也就是Overhead最小就调度给谁。
    假如都一样,就根据配置的RS自上而下调度。

  • WLC:Weighted Least Connection (加权最小连接数)
    这个是LVS的默认算法。

  • SED:Shortest Expection Delay(最小期望延迟)
    WLC算法的改进。

  • NQ:Never Queue
    SED算法的改进。

  • LBLC:Locality-Based Least-Connection,基于局部的的LC算法
    正向代理缓存机制。访问缓存服务器,调高缓存的命中率。
    和传统DH算法比较,考虑缓存服务器负载。可以看做是DH+LC

    如果有两个缓存服务器
    1.只要调度到其中的一个缓存服务器,那缓存服务器内就会记录下来。下一次访问同一个资源的时候也就是这个服务器了。    (DH)                
    2.有一个用户从来没有访问过这两个缓存服务器,那就分配到负载较小的服务器。
  • LBLCR:Locality-Based Least-Connection with Replication(带复制的lblc算法)
  • 缓存服务器中的缓存可以互相复制。因为即使没有,也能立即从另外一个服务器内复制一份,并且均衡负载

ipvsadm命令的用法:由于此命令的选项很多,可归纳为两类,

  ①管理集群服务:

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
/*
   -A:添加
   -E:修改
   -t:TCP
   -u:UDP
   -f:firewall mark 
   service-address:
        -t,tcp,vip:port
        -u,udp,vip:port
        -f,fwm,mark 
   -s scheduler:调度方法,默认是wlc  
*/
ipvsadm -D -t|u|f service-address
//  -D:删除

  ②管理集群上的RS:

ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
/*            
    -a:增加
    -e:修改
    -r server-address:RS的地址,rip[:port]
    -g:gateway,dr(默认)
    -i:ipip,tun
    -m:masquerade,nat
*/    

   ③查看

ipvsadm -L|l [options]
/*           
    -n,--numeric:数字格式显示IP和PORT
    --exact:精确值
    -c,--connection:显示IPVS连接
    --stats:统计数据
    --rate:速率
*/

  ④保存和重载

#保存
ipvsadm -S > /PATH/TO/SOME_RULE_FILE
ipvsadm-save > /PATH/TO/SOME_RULE_FILE
#重载
ipvsadm -R < /PATH/TO/SOME_RULE_FILE
ipvsadm-restore < /PATH/TO/SOME_RULE_FILE

  ⑤清空

ipvsadm -C  清空规则
ipvsadm -Z [-t|u|f service-address] 清空计数器

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值