龙之介大人

LVS内核原理与LVS十种调度算法
1. 集群基本原理系统可扩展性: scale up:向上扩展 sclae out: 向外扩展 ...
扫描右侧二维码阅读全文
25
2020/02

LVS内核原理与LVS十种调度算法

1. 集群基本原理

  • 系统
可扩展性:
    scale up:向上扩展
    sclae out: 向外扩展
        Cluster: 集群
        构建高扩展性系统的重要原则:在系统内部尽量避免串行化和交互
高可用性:99% 99.9% 99.999%

# 集群的基本术语:
调度器(director): dispatcher balancer
HA: High Availability
    MTBF: 平均无故障时间
    MTTR: 平均恢复前时间(故障时间)
    总时间: 无故障时间/总时间
    指标A: MTBF/(MTBF+MTTR) #值越高 高可用越好
LB: Load Balancing
CDN: Content Delivery Network 
  • 集群的类型
LB: 扩展、伸缩
HA:高可用
HP:High Performance
    向量机
    并行处理集群


LB: (应用层、传输层)
    软件:
        lvs (传输层)
        haproxy, nginx (应用层)
    硬件:
        F5 BIG-IP
        Citrix Netscaler
        A10 A10
        Array
        Redware
HA:
    heartbeat 
    corosync + pacemaker
    RHCS: cman + rgmanager
    cman + pacemaker
    keepalived
HA:
    heartbeat 
    corosync + pacemaker
    RHCS: cman + rgmanager
    cman + pacemaker
    keepalived
HP: 
    hadoop

2. LVS是什么

LVS,全称Linux Virtual Server,是国人章文嵩发起的一个开源项目。
在社区具有很大的热度,是一个基于四层、具有强大性能的反向代理服务器。
早期使用lvs需要修改内核才能使用,但是由于性能优异,现在已经被收入内核。

早期使用lvs需要修改内核才能使用,但是由于性能优异,现在已经被收入内核。

LVS通过工作于内核的ipvs模块来实现功能,其主要工作于netfilter 的INPUT链上。
而用户需要对ipvs进行操作配置则需要使用ipvsadm这个工具。
ipvsadm主要用于设置lvs模型、调度方式以及指定后端主机。

3. LVS结构

  • LVS集群分为三层结构:
  • 负载调度器(Load Blancer):是整个LVS集群对外的前端机器,负责client的请求发送到一组服务器【多台 LB IP】上执行,而client则认为返回来是同一个IP(通常把这个IP成为虚拟ip或VIP)
  • 服务器池(server pool):一组真正执行clinet请求的服务器,一般是web服务器;除了web,还有FTP、MAIL、DNS等.
  • 共享存储(shared stord):它为server pool提供了一个共享的存储区,很容易让服务器池拥有相同的内容,提供相同的服务

4. LVS相关术语

  • LVS的模型中有两个角色:调度器:Director,又称为Dispatcher,Balancer. 调度器主要用于接受用户请求
  • 真实主机:Real Server,简称为RS。用于真正处理用户的请求
  • VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址
  • DIP:Director Server IP,主要用于和内部主机通讯的IP地址
  • RIP:Real Server IP,后端服务器的IP地址
  • CIP:Client IP,访问客户端的IP地址
  • 如下图所示:

5. LVS工作原理

当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUTIPVS是工作在INPUT链上的,
当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTINGPOSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器

  • LVS 内核模型图

LVS的组成

LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。
  1. ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
  2. ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)

6. LVS负载均衡四种模型

原生只有3种模式(NAT,TUN,DR), fullnat工作模式默认不支持

LVS是四层负载均衡,也就是说建立在OSI模型的第四层——传输层之上,传输层上有我们熟悉的TCP/UDP,LVS支持TCP/UDP的负载均衡。因为LVS是四层负载均衡,因此它相对于其它高层负载均衡的解决办法,比如DNS域名轮流解析、应用层负载的调度、客户端的调度等,它的效率是非常高的。

LVS的IP负载均衡技术是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。 当用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的Real Server节点,而Real Server节点如何返回数据给用户,是IPVS实现的重点技术,IPVS实现负载均衡机制有几种,分别是NAT、DR、TUN及FULLNAT。

LVS-DR (Direct Routing)

重点将请求报文的目标MAC地址设定为挑选出的RS的MAC地址
  • LVS DR原理:
  1. 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
  2. PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
  3. IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
  4. 由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server
  5. RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP
  6. 响应报文最终送达至客户端
LVS DR模型特点:
  • 特点1:保证前端路由将目标地址为VIP报文统统发给Director Server,而不是RS
  • RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问
  • RS跟Director Server必须在同一个物理网络中
  • 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
  • 不支持地址转换,也不支持端口映射
  • RS可以是大多数常见的操作系统
  • RS的网关绝不允许指向DIP(因为我们不允许他经过director)
  • RS上的lo接口配置VIP的IP地址
  • 缺陷:RS和DS必须在同一机房中
特点1的解决方案:
  • 在前端路由器做静态地址路由绑定,将对于VIP的地址仅路由到Director Server
  • 存在问题:用户未必有路由操作权限,因为有可能是运营商提供的,所以这个方法未必实用
  • arptables:在arp的层次上实现在ARP解析时做防火墙规则,过滤RS响应ARP请求。这是由iptables提供的
  • 修改RS上内核参数(arp_ignorearp_announce)将RS上的VIP配置在lo接口的别名上,并限制其不能响应对VIP地址解析请求。
DR(Direct Routing 直接路由模式)此模式时LVS 调度器只接收客户发来的请求并将请求转发给后端服务器,后端服务器处理请求后直接把内容直接响应给客户,而不用再次经过LVS调度器。LVS只需要将网络帧的MAC地址修改为某一台后端服务器RS的MAC,该包就会被转发到相应的RS处理,注意此时的源IP和目标IP都没变。RS收到LVS转发来的包时,链路层发现MAC是自己的,到上面的网络层,发现IP也是自己的,于是这个包被合法地接受,RS感知不到前面有LVS的存在。而当RS返回响应时,只要直接向源IP(即用户的IP)返回即可,不再经过LVS。
  • 需要注意:
  1. 确保前端路由器将目标IP为VIP的请求报文发往Director
1. 在前端网关做静态绑定;
2. 在RS上使用arptables;
3. 在RS上修改内核参数以限制arp通告及应答级别;
    arp_announce
    arp_ignore
  1. RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director
  2. RS跟Director要在同一个物理网络;
  3. 请求报文要经由Director,但响应不能经由Director,而是由RS直接发往Client;
  4. 此模式不支持端口映射;
缺点:唯一的缺陷在于它要求LVS 调度器及所有应用服务器在同一个网段中,因此不能实现集群的跨网段应用。

优点:可见在处理过程中LVS Route只处理请求的直接路由转发,所有响应结果由各个应用服务器自行处理,并对用户进行回复,网络流量将集中在LVS调度器之上。

LVS NAT(Network Address Transform)

重点理解NAT方式的实现原理和数据包的改变。
  • LVS NAT原理:
  1. 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
  2. PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT
  3. IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP
  4. POSTROUTING链通过选路,将数据包发送给Real Server
  5. Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP
  6. Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP
LVS NAT模型特性:
  • RS应该使用私有地址,RS的网关必须指向DIP
  • DIP和RIP必须在同一个网段内
  • 请求和响应报文都需要经过Director Server,高负载场景中,Director Server易成为性能瓶颈
  • 支持端口映射
  • RS可以使用任意操作系统
  • 缺陷:对Director Server压力会比较大,请求和响应都需经过director server
NAT(Network Address Translation 网络地址转换)是一种外网和内外地址映射的技术,内网可以是私有网址,外网可以使用NAT方法修改数据报头,让外网与内网能够互相通信。NAT模式下,网络数据报的进出都要经过LVS的处理。LVS需作为RS(真实服务器)的网关。当包到达LVS时,LVS做目标地址转换(DNAT),将目标IP改为RS的IP。RS接收到包以后,仿佛是客户端直接发给它的一样。RS处理完,返回响应时,源IP是RS IP,目标IP是客户端的IP。这时RS的包通过网(LVS)中转,LVS会做源地址转换(SNAT),将包的源地址改为VIP,这样,这个包对客户端看起来就仿佛是LVS直接返回给它的。客户端无法感知到后端RS的存在。
  1. RIP和DIP必须在同一个IP网络,且应该使用私网地址;RS的网关要指向DIP;
  2. 请求报文和响应报文都必须经由Director转发;Director易于成为系统瓶颈;
  3. 支持端口映射,可修改请求报文的目标PORT;
  4. vs必须是Linux系统,rs可以是任意系统;

LVS TUN(IP Tuneling)

在原有的IP报文外再次封装多一层IP首部,内部IP首部(源地址为CIP,目标IIP为VIP),外层IP首部(源地址为DIP,目标IP为RIP)
  • LVS TUN原理:
  1. 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。
  2. PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
  3. IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为DIP,目标IP为RIP。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP
  4. POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。 此时源IP为DIP,目标IP为RIP
  5. RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。 此时的源IP地址为VIP,目标IP为CIP
  6. 响应报文最终送达至客户端
LVS TUN模型特点:
  • RIP、VIP、DIP全是公网地址
  • RS的网关不会也不可能指向DIP
  • 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
  • 不支持端口映射
  • RS的系统必须支持隧道
企业中最常用的是 DR 实现方式,而 NAT 配置上比较简单和方便,之后实践中会总结 DR 和 NAT 具体使用配置过程。

TUN(virtual server via ip tunneling IP 隧道)调度器把请求的报文通过IP隧道转发到真实的服务器。真实的服务器将响应处理后的数据直接返回给客户端。这样调度器就只处理请求入站报文。此转发方式不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP),由于一般网络服务应答数据比请求报文大很多,采用lvs-tun模式后,集群系统的最大吞吐量可以提高10倍

  • 需要注意:
  1. DIP, VIP, RIP都应该是公网地址;
  2. RS的网关不能,也不可能指向DIP;
  3. 请求报文要经由Director,但响应不能经由Director
  4. 此模式不支持端口映射;
  5. RS的操作系统得支持隧道功能
缺点:由于后端服务器RS处理数据后响应发送给用户,此时需要租借大量IP(特别是后端服务器使用较多的情况下)。
优点:实现lvs-tun模式时,LVS 调度器将TCP/IP请求进行重新封装并转发给后端服务器,由目标应用服务器直接回复用户。应用服务器之间是通过IP 隧道来进行转发,故两者可以存在于不同的网段中。

LVS FULLNAT

lvs-fullnat工作模式默认不支持
  • LVS FULLNAT特性:
  1. VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP;
  2. FULLNAT和NAT相比的话:会保证RS的回包一定可到达LVS
  3. FULLNAT需要更新源IP,所以性能正常比NAT模式下降10%
  • 需要注意:
  1. RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client;
  2. 请求和响应报文都经由Director;
  3. 支持端口映射;

三种模型的比较

  • 三种模式的主要区别
server infoVS/NATVS/TUNVS/DR
serveranytunnelingnon-arp device
server networkprivateLAN/WANLAN
server numberlow(10~20)highhigh
server gatewayload balanceown routerown router
  • 三种模式的比较
特点NAT模型IPIP模型DR模型
对服务器的要求服务节点可以使任何操作系统必须支持 IP 隧道,目前只有 Linux 系统支持服务器节点支持虚拟网卡设备,能够禁用设备的 ARP 响应
网络要求拥有私有 IP 地址的局域网络拥有合法 IP 地址的局域,网或广域网拥有合法 IP 地址的局域,服务器节点与负载均衡器必须在同一个网段
通常支持节点数量10 到 20 个,根据负载均衡器的处理能力而定较高,可以支持 100 个服务节点较高,可以支持 100 个服务节点
网关负载均衡器为服务器节点网关服务器的节点同自己的网关或者路由器连接,不经过负载均衡器服务节点同自己的网关或者路由器连接,不经过负载均衡器
服务节点安全性较好,采用内部 IP,服务节点隐蔽较差,采用公用 IP 地址,节点安全暴露较差,采用公用 IP 地址,节点安全暴露
IP 要求仅需要一个合法的 IP 地址作为 VIP 地址除了 VIPO 地址外,每个服务器界定啊需要拥有合法的 IP 地址,可以直接从路由到客户端除了 VIP 外,每个服务节点需拥有合法的 IP 地址,可以直接从路由到客户端
特点地址转换封装 IP修改 MAC 地址
配置复杂度简单复杂复杂
  • 四种模式性能比较

DR模式、IP TUN模式都是在包进入的时候经过LVS,在包返回的时候直接返回给client;所以二者的性能比NAT高

但TUN模式更加复杂,所以性能不如DR

FULLNAT模式不仅更换目的IP还更换了源IP,所以性能比NAT下降10%

性能比较:DR > TUN > NAT > FULLNAT

7. LVS十种调度算法

静态调度(Fixed Scheduling Method)

轮询(Round Robin,rr)

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

大锅饭调度:rr - 纯轮询方式,比较垃圾。把每项请求按顺序在真正服务器中分派

加权轮询(Weighted Round Robin,wrr)

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

带权重的大锅饭调度:wrr -带权重轮询方式。把每项请求按顺序在真正服务器中循环分派,但是给能力较大的服务器分派较多的作业。

目标地址散列(Destination Hashing,dh)

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

目标散列调度:realserver中绑定两个ip。ld判断来者的ISP商,将其转到相应的IP。

源地址散列(Source Hashing,sh)

源地址散列调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。了解这些算法原理能够在特定的应用场合选择最适合的调度算法,从而尽可能地保持Real Server的最佳利用性。当然也可以自行开发算法,不过这已超出本文范围,请参考有关算法原理的资料。
  
源散列调度:源地址散列。基于client地址的来源区分。(用的很少)

动态调度算法(Dynamic Scheduling Method)

最少链接(Least Connnections,lc)

调度器通过最少连接调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。
  
谁不干活就给谁分配:lc - 根据最小连接数分派

加权最少链接(Weighted Least Connnections,wlc)

在集群系统中的服务器性能差异较大的情况下,调度器采用加权最少链接调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
  
带权重的谁不干活就给谁分配:wlc - 带权重的。机器配置好的权重高

最短期望延迟(Shortest Expected Delay,sed)

基于wlc算法。这个必须举例来说了ABC三台机器分别权重123 ,连接数也分别是123。那么如果使用WLC算法的话一个新请求进入时它可能会分给ABC中的任意一个。使用sed算法后会进行这样一个运算A:(1+1)/1B:(1+2)/2C:(1+3)/3根据运算结果,把连接交给C 。

最少队列调度(Never Queue Scheduling)

无需队列。如果有台realserver的连接数=0就直接分配过去,不需要在进行sed运算。

基于局部性的最少链接(Locality-Based Least Connections,lblc)

基于局部性的最少链接调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接” 的原则选出一个可用的服务器,将请求发送到该服务器。
  
基于地区的最少连接调度:lblc - 缓存服务器集群。基于本地的最小连接。把请求传递到负载小的服务器上

带复制的基于局部性最少链接(Locality-Based Least Connections with Replication,lblcr)

带复制的基于局部性最少链接调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标 IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
  
带有复制调度的基于地区的最少连接调度:lblcr - 带复制调度的缓存服务器集群。某页面缓存在服务器A上,被访问次数极高,而其他缓存服务器负载较低,监视是否访问同一页面,如果是访问同一页面则把请求分到其他服务器。

最后修改:2020 年 02 月 25 日 07 : 47 PM

发表评论