乐趣区

关于程序员:万字长文吃透负载均衡

关注公众号【高性能架构摸索】,后盾回复【材料】,收费获取

大家好,我是雨乐。

首先通知大家一件事,在十一国庆期间,引擎的机器又又。。。又扛不住了流量。

通过监控剖析,发现某个服务的一个实例所在的虚拟机扛不住了,所以采取长期措施流量管制之后,问题解决了,但还是造成了不小的损失。

写在后面

写本文的目标:

  • 对负载平衡的了解零零散散,不成体系。

浏览这篇文章须要的条件:

  • 对 OSI 模型有些许理解
  • 有急躁。本文波及大量的知识点,且只能用文字能力讲清楚,所以文字比拟多。

播种:

  • 读完此篇文章,从宏观的角度了解了负载平衡的原理以及实现机制。加深对分布式架构的理解

次要内容:

  • 本文首先从概念开始,解说什么是负载平衡,以及负载平衡在分布式系统中所承当的角色以及提供的性能。
  • 解说负载平衡的分类。别离从 软硬件角度 _、_ 地区范畴角度 以及 OSI 模型角度 进行分类解说负载平衡的实现计划。
  • 从负载平衡的策略角度来剖析目前业界的负载平衡算法以及其优缺点

好了,筹备好了么,让咱们开始这次欢快之旅。

引言

首先 _撇开对线上的影响 _,如果线上突发来了流量, 后端服务扛不住,咱们会怎么做呢?
无非两种形式:

  • 晋升机器配置(CPU、内存、硬盘、带宽等)
  • 加机器

下面两种形式,咱们称之为纵向扩大和横向扩大。

纵向扩大,是从单机的角度通过减少硬件解决能力,比方 CPU 解决能力,内存容量,磁盘等方面,实现服务器解决能力的晋升,不能满足大型分布式系统(网站),大流量,高并发,海量数据的问题。

横向扩大,通过增加机器来满足大型网站服务的解决能力。比方:一台机器不能满足,则减少两台或者多台机器,独特承当拜访压力。

概念

负载平衡,英文名称为 Load Balance,其含意就是指将负载(工作工作或者网络申请)进行均衡,摊派到多个操作单元 (服务器或者组件) 上进行运行。目标是尽量将网络流量 均匀 发送到多个服务器上,以保障整个业务零碎的高可用。

在互联网的早起,网络还不是很发达,流量绝对较小,业务也比较简单,单台服务器或者实例就有可能满足拜访须要。但现在在互联网发达的明天,流量申请动辄百亿、甚至上千亿,单台服务器或者实例已齐全不能满足需要,这就有了集群。不论是为了实现高可用还是高性能,都须要用到多台机器来扩大服务能力,用户的申请不论连贯到哪台服务器,都能失去雷同的相应解决。

另一方面,如何构建和调度服务集群这事件,又必须对用户一侧保持足够的通明,即便申请背地是由一千台、一万台机器来独特响应的,也绝非用户所关怀的事件,用户需记住的只有一个域名地址而已。调度前方的多台机器,以对立的接口对外提供服务,承当此职责的技术组件被称为 _负载平衡_。

负载平衡次要有以下作用:

  • 高并发。通过采取肯定的算法策略,将流量尽可能的平均发送给后端的实例,以此进步集群的并发解决能力。
  • 伸缩性。依据网络流量的大小,减少或者缩小后端服务器实例,由负载平衡设施进行管制,这样使得集群具备伸缩性。
  • 高可用。负载均衡器通过算法或者其余性能数据来监控候选实例,当实例负载过高或者异样时,缩小其流量申请或者间接跳过该实例,将申请发送个其余可用实例,这使得集群具备高可用的个性。
  • 平安防护。有些负载均衡器提供了平安防护性能。如:黑白名单解决、防火墙等。

分类

依据载体类型分类

从反对负载平衡的载体来看,能够将负载平衡分为两类:

  • 硬件负载平衡
  • 软件负载平衡

    硬件负载平衡

    硬件负载平衡器是一种硬件设施,具备专门的操作系统。硬件负载平衡器位于传入流量和外部服务器之间,实质上充当“流量警察”。当用户拜访网站或者应用 app 某个性能时,它们首先被发送到负载均衡器,而后负载均衡器依据肯定的策略,将流量转发到后端不同的服务器。为确保最佳性能,硬件负载均衡器依据自定义规定调配流量,免得后端实例不堪重负。

传统上,硬件负载平衡器和应用服务器部署在本地数据中心,负载平衡器的数量取决于预期的峰值流量。负载均衡器通常成对部署,以防其中一个失败。

目前业界当先的两款硬件负载均衡器:F5 和 A10

长处

功能强大:反对全局负载平衡并提供较全面的、简单的负载平衡算法。

性能强悍:硬件负载平衡因为是在专用处理器上运行,因而吞吐量大,可反对单机百万以上的并发。

安全性高:往往具备防火墙,防 DDos 攻打等平安性能。

毛病

老本低廉:购买和保护硬件负载平衡的老本都很高(:F5 价格在 15w~55w 不等,A10 价格在 55w-100w 不等)。

扩展性差:当访问量突增时,超过限度不能动静扩容。

软件负载平衡

软件负载平衡指的是在服务器的操作系统上装置负载平衡软件,从此服务器收回的申请经软件负载平衡算法路由到后端集群的某一台机器上。

常见负载平衡软件有:LVS、Nginx、Haproxy。

长处

扩展性好:适应动态变化,能够通过增加软件负载平衡实例,动静扩大到超出初始容量的能力。

老本低廉:软件负载平衡能够在任何规范物理设施上运行,升高了购买和运维的老本。

毛病

性能略差:相比于硬件负载平衡,软件负载平衡的性能要略低一些。

软硬件负载均衡器的区别

  • 硬件负载平衡器与软件负载平衡器之间最显著的区别在于,硬件负载平衡器须要专有的机架重叠硬件设施,而软件负载平衡器只需装置在规范 x86 服务器或虚拟机上。网络负载平衡器硬件通常是适度配置的——换句话说,它们的大小可能解决偶然的顶峰流量负载。此外,每个硬件设施都必须与一个额定的设施配对以取得高可用性,以防其余负载均衡器呈现故障。
  • 硬件和软件负载平衡器之间的另一个要害区别在于扩大能力。随着网络流量的增长,数据中心必须提供足够的负载均衡器以满足峰值需要。对于许多企业来说,这意味着大多数负载均衡器在顶峰流量工夫(例如彩色星期五)之前始终处于闲暇状态。
  • 如果流量意外超出容量,最终用户体验会受到显着影响。另一方面,软件负载平衡器可能弹性扩大以满足需要。无论网络流量是低还是高,软件负载平衡器都能够简略地实时主动扩大,打消适度配置老本和对意外流量激增的担心。
  • 此外,硬件负载平衡器配置可能很简单。基于软件定义准则构建的软件负载平衡器跨多个数据中心和混合 / 多云环境。事实上,硬件设施与云环境不兼容,而软件负载均衡器与裸机、虚构、容器和云平台兼容。

依据地区范畴分类

负载平衡从其利用的天文构造上分为本地负载平衡 (Local Load Balance) 和全局负载平衡(Global Load Balance,也叫地区负载平衡)。

本地负载平衡

本地负载平衡是指对本地的服务器群做负载平衡。

本地负载平衡针对本地范畴的服务器群做负载平衡,本地负载平衡不须要破费高额老本购买高性能服务器,只需利用现有设施资源, 就可无效防止服务器单点故障造成数据流量的损失,通常用来解决数据流量过大、网络负荷过重的问题。同时它领有形式多样的平衡策略把数据流量正当平衡的调配到各台服务器。如果须要在当初服务器上降级裁减,不需扭转现有网络结构、进行现有服务,仅须要在服务群中简略地增加一台新服务器。

本地负载平衡能无效地解决数据流量过大、网络负荷过重的问题,并且不需破费低廉开销购买性能卓越的服务器,充分利用现有设施,防止服务器单点故障造成数据流量的损失。

其有灵活多样的平衡策略把数据流量正当地调配给服务器群内的服务器独特累赘。即便是再给现有服务器裁减降级,也只是简略地减少一个新的服务器到服务群中,而不需扭转现有网络结构、进行现有的服务。

全局负载平衡

全局负载平衡是指对别离搁置在不同的地理位置、有不同网络结构的服务器群间作负载平衡。

全局负载平衡次要用于在一个多区域领有本人服务器的站点,为了使寰球用户只以一个 IP 地址或域名就能拜访到离本人最近的服务器,从而取得最快的访问速度,也可用于子公司扩散站点散布广的大公司通过 Intranet(企业外部互联网)来达到资源对立正当调配的目标。

全局负载平衡,目前实现形式有以下几种:

  • 通过运营商线路调度:这个次要是指国内,因为非凡起因国内不同运营商互联互通存在很大问题,比方联通用户拜访电信机房服务器提早很大,甚至有可能无法访问的状况。如果您的业务部署在不同运营商机房,能够通过运营商线路解析来实现调度,联通线路用户域名解析到联通机房 IP,电信线路用户域名解析电信机房 IP,这样保障不同用户拜访最佳的服务器。
  • 通过地区线路调度:

    • 咱们都晓得,网站服务器越近,访问速度越快,比方天津用户拜访北京服务器会比广州服务器快很多。如果您的业务部署在华北,华南两个 Region,能够通过地区线路解析,设置华北,西南,东南,华中用户拜访域名解析到北京服务器 IP,华东,华南,东北用户拜访域名解析到广州服务器 IP,这样用户拜访离本人最近的服务器能够晋升拜访体验。
    • 如果您的业务是面向寰球的,国内部署有业务,海内也部署有业务,能够抉择中国用户拜访域名解析到国内服务器,海内用户拜访域名解析到海内服务器。当然海内的还能够细分,比方抉择亚太 – 新加坡的用户等,能够具体到洲,国家。
  • 权重轮询:比方一个域名解析到多个 IP,能够依据不同 IP 服务器的配置,业务状况设置解析比重,比方 2:1 或者 1:1 等等。
  • 健康检查,故障转移:能够创立监控工作实时监控后端服务器 IP 的衰弱状态,如果发现后端服务器异样,能够把解析流量切换到其余失常的服务器或者备用服务器,保障业务不会中断。

CDN 的全称是 Content Delivery Network,即内容散发网络。其就是采纳的全局负载平衡。如果咱们将图片存储在 CDN 上,且该 CDN 所在厂家在北京、杭州均有服务器。那么:

  • 当天津的用户须要下载该图片的时候,会主动将流量申请转发至间隔其最近的 CDN 服务器,也就是北京
  • 当安徽的用户须要下载图片的时候,就会将流量申请转发至杭州。

依据 OSI 网络模型分类


OSI 是一个开放性的通信零碎互连参考模型,如上图所示。在 OSI 参考模型中,别离有:

  • 应用层
  • 表示层
  • 会话层
  • 传输层
  • 网络层
  • 数据链路层
  • 物理层

从上图能够看出:

TELNET、HTTP、FTP、NFS、SMTP、DNS 等属于第七层应用层的概念。

TCP、UDP、SPX 等属于第四层传输层的概念。

IP、IPX 等属于第三层网络层的概念。

ATM、FDDI 等属于第二层数据链路层的概念。

依据负载平衡技术实现在 OSI 七层模型的不同档次,咱们给负载平衡分类:

  • 七层负载平衡:工作在应用层的负载平衡称
  • 四层负载平衡:工作在传输层的负载平衡称
  • 三层负载平衡:工作在网络层的负载平衡,
  • 二层负载平衡:工作在数据链路层的负载平衡。

上面内容十分重要,关注下再往下看

_其中最罕用的是四层和七层负载平衡_。

上面咱们将从 OSI 模型从下往上的程序,来想西解说上述几种负载平衡。

二层负载平衡

工作在数据链路层的负载平衡称之为二层负载平衡(又称为数据链路层负载平衡),通过在通信协议的数据链路层批改 mac 地址进行负载平衡。

二层负载平衡是基于数据链路层的负载平衡,即让负载平衡服务器和业务服务器绑定同一个虚构 IP(即 VIP),客户端间接通过这个 VIP 进行申请集群。集群中不同的机器采纳雷同 IP 地址,然而机器的 MAC 地址不一样。当负载平衡服务器承受到申请之后,通过改写报文的指标 MAC 地址的形式将申请转发到指标机器实现负载平衡。

数据链路层负载平衡所做的工作,是批改申请的数据帧中的 MAC 指标地址,让用户本来是发送给负载均衡器的申请的数据帧,被二层交换机依据新的 MAC 指标地址转发到服务器集群中对应的服务器(实在服务器)的网卡上,这样实在服务器就取得了一个本来指标并不是发送给它的数据帧。

为了便于了解,咱们假如负载均衡器所在的 ip 地址为 192.168.1.1,后端服务实例的 mac 地址别离为 52:54:00:A1:CB:F7,61:52:00:A2:BD, 71:63:52:A3:CA。如下图所示:

在上图中,用户的申请首先达到 ip 为 192.168.1.1 的二层负载均衡器,而后二层负载均衡器通过采取肯定的策略,选中了 mac 地址为 71:63:52:A3:CA,而后将流量转发至该服务实例。

须要留神的是, 上述只有申请通过负载均衡器,而服务的响应毋庸从负载均衡器原路返回的工作模式,整个申请、转发、响应的链路造成一个“三角关系”,所以这种负载平衡模式也常被很形象地称为“三角传输模式”,也有叫“单臂模式”或者“间接路由”。

二层负载均衡器间接改写指标 MAC 地址的工作原理决定了它与实在的服务器的通信必须是二层可达的,艰深地说就是必须位于同一个子网当中,无奈跨 VLAN。劣势(效率高)和劣势(不能跨子网)独特决定了数据链路层负载平衡最适宜用来做数据中心的第一级平衡设施,用来连贯其余的上级负载均衡器。

三层负载平衡

三层负载平衡是基于网络层的负载平衡,因而又叫网络层负载平衡。艰深的说就是依照不同机器不同 IP 地址进行转发申请到不同的机器上。

依据 OSI 七层模型,在第三层网络层传输的单位是分组数据包,这是一种在分组替换网络中传输的结构化数据单位。以 IP 协定为例,一个 IP 数据包由 Headers 和 Payload 两局部组成,Headers 长度最大为 60Bytes,其中包含了 20Bytes 的固定数据和最长不超过 40Bytes 的可选的额定设置组成。

三层负载平衡服务器对外仍然提供一个 VIP(虚 IP),然而集群中不同的机器采纳不同的 IP 地址。当负载平衡服务器承受到申请之后,依据不同的负载平衡算法,通过 IP 将申请转发至不同的实在服务器。

学过计算机网络的都晓得,在 IP 分组的数据报 header 中有 源 IP 和 _指标 IP_。源 IP 和指标 IP 代表分组替换中从数据是从哪台机器到哪台机器的,那么,咱们能够采纳跟批改二层负载平衡中 MAC 地址的形式一样,间接批改指标 IP,以达到数据转发的目标。

批改指标 IP 的形式有两种:
1、原有的数据包放弃不变,生成一个新的数据包,原数据包的 Header 和 Payload 作为新数据包的 Payload,在这个新数据包的 Headers 中写入实在服务器的 IP 作为指标地址,而后把它发送进来。

实在服务器收到数据包后,必须在接管入口处设计一个针对性的拆包机制,把由负载均衡器主动增加的那层 Headers 扔掉,还原出原来的数据包来进行应用。这样,实在服务器就同样拿到了一个本来不是发给它(指标 IP 不是它)的数据包,达到了流量转发的目标。这种数据传输方式叫做 IP 隧道 传输。

只管因为要封装新的数据包,IP 隧道的转发模式比起间接路由模式效率会有所降落,但因为并没有批改原有数据包中的任何信息,所以 IP 隧道的转发模式依然具备三角传输的个性,即负载均衡器转发来的申请,能够由实在服务器去间接应答,毋庸在通过均衡器原路返回。而且因为 IP 隧道工作在网络层,所以能够逾越 VLAN,因而解脱了间接路由模式中网络侧的束缚。

此模式从申请到响应如下图所示:

长处:

  • 能够逾越 VLAN
    毛病:
  • 要求实在服务器必须反对 IP 隧道协定,也就是说服务器得本人会拆包
  • 必须通过专门的配置,必须保障所有的实在服务器与均衡器有着雷同的虚构 IP 地址,因为回复该数据包时,须要应用这个虚构 IP 作为响应数据包的源地址,这样客户端收到这个数据包时能力正确解析。

基于以上起因,就有了第二中批改形式。
2、扭转指标数据包。

间接把数据包 Headers 中的指标地址改为实在服务器地址,批改后本来由用户发给均衡器的数据包,也会被三层交换机转发送到实在服务器的网卡上,而且因为没有通过 IP 隧道的额定包装,也就无须再拆包了。

因为这种模式是通过批改指标 IP 地址才达到实在服务器的,如果实在服务器间接将应答包返回客户端的话,这个应答数据包的源 IP 是实在服务器的 IP,也即均衡器批改当前的 IP 地址,客户端不可能意识该 IP,天然就无奈再失常解决这个应答了。因而,只能让应答流量持续回到负载平衡,由负载平衡把应答包的源 IP 改回本人的 IP,再发给客户端,这样能力保障客户端与实在服务器之间的失常通信。

这种批改指标 IP 的形式叫 NAT 模式,这种通过批改指标 IP 的形式达到负载平衡目标的形式叫做 NAT 负载平衡。如下图所示:

四层负载平衡

所谓四层负载平衡,也就是次要通过报文中的指标地址和端口,再加上负载平衡设施设置的服务器抉择形式,决定最终抉择的外部服务器。

因为四层负载平衡是作用在传输层,因而,咱们就以常见的 TCP 进行举例。

负载平衡设施在接管到第一个来自客户端的 SYN 申请时,即通过上述形式抉择一个最佳的服务器,并对报文中指标 IP 地址进行批改(改为后端服务器 IP),间接转发给该服务器。TCP 的连贯建设,即三次握手是客户端和服务器间接建设的,负载平衡设施只是起到一个相似路由器的转发动作。在某些部署状况下,为保障服务器回包能够正确返回给负载平衡设施,在转发报文的同时可能还会对报文原来的源地址进行批改。

四层负载平衡次要是基于 tcp 协定报文,能够做任何基于 tcp/ip 协定的软件的负载平衡,比方 Haproxy、LVS 等。

七层负载平衡

所谓七层负载平衡,也称为“内容替换”,也就是次要通过报文中的真正有意义的应用层内容,再加上负载平衡设施设置的服务器抉择形式,决定最终抉择的外部服务器。

应用层协定较多,罕用 http、radius、dns 等。七层负载就能够基于这些协定来负载。

咱们依然以 TCP 为例。负载平衡设施如果要依据真正的应用层内容再抉择服务器,只能先代理最终的服务器和客户端建设连贯 (三次握手) 后,才可能承受到客户端发送的真正应用层内容的报文,而后再依据该报文中的特定字段,再加上负载平衡设施设置的服务器抉择形式,决定最终抉择的外部服务器。负载平衡设施在这种状况下,更相似于一个代理服务器。负载平衡和前端的客户端以及后端的服务器会别离建设 TCP 连贯。所以从这个技术原理上来看,七层负载平衡显著的对负载平衡设施的要求更高,解决七层的能力也必然会低于四层模式的部署形式。

七层负载均衡器会与客户端 以及 后端的服务实例别离建设连贯

七层负载平衡根本都是基于 http 协定的,实用于 web 服务器的负载平衡,比方 Nginx 等。

比照(四层和七层)

  • 智能性

    • 七层负载平衡因为具备 OIS 七层的所有性能,所以在解决用户需要上能更加灵便,从实践上讲,七层模型能对用户的所有跟服务端的申请进行批改。例如对文件 header 增加信息,依据不同的文件类型进行分类转发。
    • 四层模型仅反对基于网络层的需要转发,不能批改用户申请的内容。
  • 安全性

    • 七层负载平衡因为具备 OSI 模型的全副性能,能更容易抵挡来自网络的攻打
    • 四层模型从原理上讲,会间接将用户的申请转发给后端节点,无奈间接抵挡网络攻击。
  • 复杂度

    • 四层模型个别比较简单的架构,容易治理,容易定位问题
    • 七层模型架构比较复杂,通常也须要思考联合四层模型的混用状况,呈现问题定位比较复杂。
  • 效率比

    • 四层模型基于更底层的设置,通常效率更高,但利用范畴无限
    • 七层模型须要更多的资源损耗,在实践上讲比四层模型有更强的性能,当初的实现更多是基于 http 利用。

算法与实现

罕用的负载平衡算法分为以下两类:

  • 动态负载平衡
  • 动静负载平衡

常见的动态平衡算法:轮询法、随机法、源地址哈希法、一致性哈希法、加权轮询法、加权随机法。

常见的动静负载平衡算法:最小连接数法、最快响应速度法。

随机法(Random)

将申请随机调配到各个节点。由概率统计实践得悉,随着客户端调用服务端的次数增多,其实际效果越来越靠近于平均分配,也就是轮询的后果。

随机策略会导致配置较低的机器 Down 机,从而可能引起雪崩,个别采纳随机算法时倡议后端集群机器配置最好等同的,随机策略的性能取决与随机算法的性能。

  • 长处:简略高效,易于程度扩大,每个节点满足字面意义上的平衡;
  • 毛病:没有思考机器的性能问题,依据木桶最短木板实践,集群性能瓶颈更多的会受性能差的服务器影响。

实现:

std::string Select(const std::vector<int> &ips) {size_t size = ips.size();
  if (size == 0) {return "";}
  
  return ips[random() % size];
}

轮询法(Round Robin)

每一次来自网络的申请轮流调配给外部中的服务器,从 1 至 N 而后从新开始。此种平衡算法适宜于服务器组中的所有服务器都有雷同的软硬件配置并且均匀服务申请绝对平衡的状况。

假如 10 台机器,从 0 -9,申请来长期从 0 号机器开始,后续每来一次申请对编号加 1,这样始终循环,下面的随机策略其实最初就变成轮询了,这两种策略都不关怀机器的负载和运行状况,而且对变量操作会引入锁操作,性能也会下会降落。

  • 长处:简略高效,易于程度扩大,每个节点满足字面意义上的平衡;
  • 毛病:没有思考机器的性能问题,依据木桶最短木板实践,集群性能瓶颈更多的会受性能差的服务器影响。

代码实现:

static int idx = 0;
std::string Select(const std::vector<int> &ips) {size_t size = ips.size();
  if (size == 0) {return "";}
  
  if (idx == ips.size()) {idx = 0;}
  
  return ips[idx++];
}

加权轮询法(Weighted Round Robin)

不同的后端服务器可能机器的配置和以后零碎的负载并不相同,因而它们的抗压能力也不雷同。给配置高、负载低的机器配置更高的权重,让其解决更多的请;而配置低、负载高的机器,给其调配较低的权重,升高其零碎负载,加权轮询能很好地解决这一问题,并将申请程序且依照权重调配到后端。

假如后端有 3 台服务器,别离为 a b c,当初在负载均衡器中配置 a 服务器的权重为 7,b 服务的权重为 2,c 服务的权重为 1。当来了 10 次申请的时候,其中有 7 次申请 a,2 次申请 b,1 次申请 c。即最终后果是

aaaaaaabbc
  • 长处:能够将不同机器的性能问题纳入到考量范畴,集群性能最优最大化;
  • 毛病:生产环境复杂多变,服务器抗压能力也无奈准确估算,动态算法导致无奈实时动静调整节点权重,只能毛糙优化。

不同的后端服务器可能机器的配置和以后零碎的负载并不相同,因而它们的抗压能力也不雷同。给配置高、负载低的机器配置更高的权重,让其解决更多的请;而配置低、负载高的机器,给其调配较低的权重,升高其零碎负载,加权轮询能很好地解决这一问题,并将申请程序且依照权重调配到后端。

加权随机法(Weighted Random)

在之前的文章权重随机分配器咱们有具体讲过各种实现计划,此处咱们不再赘述,从外面摘抄了一种实现计划作为本计划的实现。

  • 长处:能够将不同机器的性能问题纳入到考量范畴,集群性能最优最大化;
  • 毛病:生产环境复杂多变,服务器抗压能力也无奈准确估算,动态算法导致无奈实时动静调整节点权重,只能毛糙优化。

代码实现

srtuct Item {
  std::string ip;
  int weight;
};
std::string select(const std::vector<Item> &items) {
  int sum = 0;
  for (auto elem : items) {sum += elem.weight;}
  
  int rd = rand() % sum;
  int s = 0;
  std::string res;
  for (auto elem : items) {
    s += elem.weight;
    if (s >= rd) {
      res = elem.ip;
      break;
    }
  }
  return res;
}

最快响应速度法(Response Time)

依据申请的响应工夫,来动静调整每个节点的权重,将响应速度快的服务节点调配更多的申请,响应速度慢的服务节点调配更少的申请

负载平衡设施对外部各服务器收回一个探测申请(例如 Ping),而后依据外部中各服务器对探测申请的最快响应工夫来决定哪一台服务器来响应客户端的服务申请。此种平衡算法能较好的反映服务器的以后运行状态,但这最快响应工夫仅仅指的是负载平衡设施与服务器间的最快响应工夫,而不是客户端与服务器间的最快响应工夫。

  • 长处:动静,实时变动,管制的粒度更细,跟灵活;
  • 毛病:复杂度更高,每次须要计算申请的响应速度;

起码连接数法(Least Connections)

将申请散发到连接数 / 申请数起码的候选服务器,已达到负载平衡的目标

客户端的每一次申请服务在服务器停留的工夫可能会有较大的差别,随着工作工夫加长,如果采纳简略的轮循或随机平衡算法,每一台服务器上的连贯过程可能会产生极大的不同,并没有达到真正的负载平衡。起码连接数平衡算法对外部中需负载的每一台服务器都有一个数据记录,记录以后该服务器正在解决的连贯数量,当有新的服务连贯申请时,将把以后申请调配给连接数起码的服务器,使平衡更加符合实际状况,负载更加平衡。此种平衡算法适宜长时解决的申请服务,如 FTP。

  • 长处:动静,依据节点情况实时变动
  • 毛病:进步了复杂度,每次连贯断开须要进行计数

源地址哈希法(Source Hashing)

依据申请源 IP,通过哈希计算失去一个数值,用该数值在候选服务器列表的进行取模运算,失去的后果便是选中的服务器。

可能让同一客户端的申请或者同一用户的申请总是申请在后端同一台机器上,这种算法依据客户端 IP 求出 Hash 值而后对端集群总数求余失去值就是服务器汇合的下标,个别这种算法用于缓存命中,或者同一会话申请等,但这种算法也有肯定的毛病,某一用户访问量 (黑产) 十分高时可能造成服务端压力过大或者后端服务 Down 掉,那么客户端就会无法访问,所以也须要肯定的降级策略。

  • 长处:将来自同一 IP 地址的申请,同一会话期内,转发到雷同的服务器;实现会话粘滞
  • 毛病:指标服务器宕机后,会话会失落

一致性哈希(Consistency hash)

一些场景心愿同样的申请尽量落到一台机器上,比方拜访缓存集群时,咱们往往心愿同一种申请能落到同一个后端上,以充分利用其上已有的缓存,不同的机器承载不同的稳固申请量(也能够了解为固定批用户的申请)。而不是随机地散落到所有机器上,那样的话会迫使所有机器缓存所有的内容,最终因为存不下造成平稳而体现蹩脚。咱们都晓得 hash 能满足这个要求,比方当有 n 台服务器时,输出 x 总是会发送到第 hash(x) % n 台服务器上。但当服务器变为 m 台时,hash(x) % n 和 hash(x) % m 很可能都不相等,这会使得简直所有申请的发送目的地都发生变化,如果目的地是缓存服务,所有缓存将生效,继而对本来被缓存遮挡的数据库或计算服务造成申请风暴,触发雪崩。一致性哈希是一种非凡的哈希算法,在减少服务器时,发向每个老节点的申请中只会有一部分转向新节点,从而实现平滑的迁徙。

长处:

  • 平衡性: 每个节点被选到的概率是 O(1/n)。
  • 枯燥性: 当新节点退出时,不会有申请在老节点间挪动,只会从老节点挪动到新节点。当有节点被删除时,也不会影响落在别的节点上的申请。
  • 分散性: 当上游的机器看到不同的上游列表时(在上线时及不稳固的网络中比拟常见), 同一个申请尽量映射到大量的节点中。
  • 负载: 当上游的机器看到不同的上游列表的时候,保障每台上游分到的申请数量尽量统一。

毛病:

  • 在机器数量较少的时候,区间大小会不均衡。
  • 当一台机器故障的时候,它的压力会齐全转移到另外一台机器,可能无奈承载。

结语

负载平衡并不是真正确保网络流量可能 ” 平均 ” 的调配到后端服务实例上。它只是抱着在意外状况产生时候,也能保障用户体验。良好的架构设计和弹性扩容,可能使得负载平衡的性能 _事倍功半_。

退出移动版