化整为零:一文读懂分布式系统中的负载均衡实现

1. 场景

2012年春节,小明通过12306抢火车票的时候,每当整点放票时,他感觉整个APP处于无响应状态,甚至刷不出票?如何在高QPS请求下,用户能很平滑的订购火车票。

基于上述需求,我们要使用统一的流量入口来对外提供服务,本质上就是需要一个流量调度器,通过均衡的算法,将用户大量的请求流量均衡地分发到集群中不同的服务器上。这就需要再用户和服务直接实现一个桥接模块,这个模块就是网关模块,它提供的一大功能就是负载均衡(Load Balancer)策略。从这个设计来看,负载均衡模块可以保障系统的高可用,提供系统的吞吐能力,更好地做服务升级以及扩缩容。

2. 负载均衡类型

广义上的负载均衡器按软硬件可以分为2 类,包括:硬件负载均衡、软件负载均衡。

2.1. 硬件负载均衡

硬件负载均衡是通过专门的硬件设备来实现负载均衡的功能,是专用的负载均衡设备。目前业界典型的硬件负载均衡设备有F5、A10、Citrix Netscaler等比如用Citrix NetScaler硬件负载设备。这种专门为流量负载均衡而设计的硬件提供了强大和高效的L4/L7流量管理,但是也有两个比较明显的缺点:一个是贵,这决定了硬件负载均衡设备数目不会太多,尤其是在测试环境。另外一个缺点是不够弹性化,负载均衡设备带宽是固定的,比如有的是30GB,而随着流量的增加容易导致LB流量过高,尤其是在购物季的时候,通常就会需要LB运维的同事们做很多LB VIP的迁移,将一些流量过高的VIP拆分迁移到流量相对较少的LB上。

这类设备性能强劲、功能强大,但价格非常昂贵,一般只有土豪公司才会使用此类设备,中小公司一般负担不起,业务量没那么大,用这些设备也是挺浪费的。

硬件负载均衡的优点:

硬件负载均衡的缺点也很明显:

2.2. 软件负载均衡

软件负载均衡,可以在普通的服务器上运行负载均衡软件,实现负载均衡功能。目前常见的有 Nginx、HAproxy、LVS。其中的区别:

软件负载均衡的优点:

2.2. 按照实现技术

根据实现技术不同,可分为DNS负载均衡,HTTP负载均衡,IP负载均衡,链路层负载均衡等。

DNS负载均衡

最早的负载均衡技术,利用域名解析实现负载均衡,在DNS服务器,配置多个A记录,这些A记录对应的服务器构成集群。大型网站总是部分使用DNS解析,作为第一级负载均衡。

优点:

缺点:

实践建议:将DNS作为第一级负载均衡。

IP负载均衡

IP负载均衡,在网络层通过修改请求目标地址进行负载均衡。

优点:在内核进程完成数据分发,比在应用层分发性能更好。

缺点:所有请求响应都需要经过负载均衡服务器,集群最大吞吐量受限于负载均衡服务器网卡带宽。

链路层负载均衡

在通信协议的数据链路层修改mac地址,进行负载均衡。

数据分发时,不修改ip地址,指修改目标mac地址,配置真实物理服务器集群所有机器虚拟ip和负载均衡服务器ip地址一致,达到不修改数据包的源地址和目标地址,进行数据分发的目的。

优点:性能好。

缺点:配置复杂。

实践建议:直接路由(DR)模式最常用。

混合型负载均衡

2.3. 按照OSI层次

由于多个服务器群内硬件设备、规模、提供服务等差异,可以考虑给每个服务器群采用最合适的负载均衡方式,然后又在这多个服务器群间再一次负载均衡或群集起来以一个整体向外界提供服务,从而达到最佳的性能,将这种方式称之为混合型负载均衡。

四层负载均衡( L4 load balancing )

主要工作于处于OSI模型中间位置的传输层( transport layer ),这一层的主要协议就是TCP/UDP,负载均衡器在这一层能够看到数据包里面的源端口地址以及目的端口地址,并且基于这些信息通过一定的负载均衡算法将数据包转发到后端真实服务器。它主要处理消息的传递,而不管消息的内容。在互联网上,TCP就是HTTP传输方式的四层协议( Layer 4 Protocol )。四层负载均衡只针对由上游服务发送和接收的网络包,而并不检查包内的具体内容是什么。四层负载均衡可以通过检查TCP流中的前几个包,从而决定是否限制路由。常用方案:LVS、DPVS。

七层负载均衡( L7 load balancing )

主要工作于处于OSI模型顶层位置的应用层( application layer ),它主要处理每条消息中的真正内容。在互联网上,HTTP是网络通讯中占据主导地位的七层协议( Layer 7 Protocol )。七层负载均衡在路由网络传输时比四层负载均衡更加复杂和巧妙,特别适合像HTTP这种基于TCP传输的方式。 一个七层负载均衡器终止网络传输并读取消息中的内容。它可以基于消息中内容( 比如URL或者cookie中的信息 )来做出负载均衡的决定。之后,七层负载均衡器建立一个新的TCP连接来选择上游服务( 或者再利用一个已经存在的TCP连接,通过 HTTP keepalives 的方式。常用方案:NGINX。会终结TCP、TLS协议,分析HTTP请求,会对每个请求进行负载均衡。

3. 负载均衡算法

负载均衡服务器在决定将请求转发到具体哪台真实服务器时,是通过负载均衡算法来实现的。负载均衡算法可以分为两类:静态负载均衡算法和动态负载均衡算法。

静态负载均衡算法包括:轮询、比率、优先权。

动态负载均衡算法包括:最少连接数、最快响应速度、观察方法、预测法、动态性能分配、动态服务器补充、服务质量、服务类型、规则模式。

3.1 轮询

轮询(Round Robin):顺序循环将请求一次顺序循环地连接每个服务器。以轮询的方式依次请求调度不同的服务器;实现时,一般为服务器带上权重。

优点:服务器请求数目相同;实现简单、高效;易水平扩展。

缺点:服务器压力不一样,不适合服务器配置不同的情况;请求到目的结点的不确定,造成其无法适用于有写操作的场景。

应用场景:数据库或应用服务层中只有读的场景。

3.2 比率(Ratio)

给每个服务器分配一个加权值为比例,根椐这个比例,把用户的请求分配到每个服务器。

3.3 优先权(Priority)

给所有服务器分组,给每个组定义优先权。当最高优先级中所有服务器出现故障,将请求送给次优先级的服务器组。这种方式,实际为用户提供一种热备份的方式。

3.4 最少连接

将请求分配到连接数最少的服务器(目前处理请求最少的服务器)。

优点:根据服务器当前的请求处理情况,动态分配;

缺点:算法实现相对复杂,需要监控服务器请求连接数;

3.5 最快模式(Fastest)

传递连接给那些响应最快的服务器。

3.6 观察模式(Observed)

连接数目和响应时间这两项的最佳平衡为依据为新的请求选择服务器。

3.7 预测模式(Predictive)

利用收集到的服务器当前的性能指标,进行预测分析,选择一台服务器在下一个时间片内,其性能将达到最佳的服务器相应用户的请求。

3.8 动态性能分配(Dynamic Ratio-APM)

根据收集到的应用程序和应用服务器的各项性能参数,动态调整流量分配。

3.9 动态服务器补充(Dynamic Server Act)

当主服务器群中因故障导致数量减少时,动态地将备份服务器补充至主服务器群。

3.10 服务质量(QoS)

按不同的优先级对数据流进行分配。

3.11 服务类型(ToS)

按不同的服务类型(在 Type of Field 中标识)负载均衡对数据流进行分配。

3.12 规则模式

针对不同的数据流设置导向规则,用户可自行设置。

4. 网络分层负载均衡架构

互联网领域对于负载均衡的架构是随着网站规模提升不断演进的,大致分为如下几个阶段:

第一阶段:利用Nginx或HAProxy进行单点的负载均衡,该阶段服务器刚从单机向集群转变,需要在七层做转发。

第二阶段:随着网络规模扩大,Nginx单点瓶颈突出,这时使用LVS或者商用Array就是首要选择,Nginx此时就作为LVS或者Array的节点来使用,具体LVS或Array的是选择是根据公司规模和预算来选择。

第三阶段:这时网络服务已经成为主流产品,此时随着公司知名度也进一步扩展,相关人才的能力以及数量也随之提升,这时无论从开发适合自身产品的定制,以及降低成本来讲开源的LVS,已经成为首选,这时LVS会成为主流。

常见互联网分布式架构可分为用户层、反向代理层、Web站点层、业务服务层、数据存储层。互联网分层架构:

每层之间交互都有相应的负载均衡方案:

客户端层->反向代理层:DNS轮询。

反向代理层->Web站点层:Ngnix(均衡策略:请求轮询/最少连接路由/IP哈希)。

Web站点层->业务服务层:连接池。

业务服务层->数据存储层:数据分片,读写分离。

4. 负载均衡软件实现

4.1 LVS(Linux Virtual Server 虚拟服务器)

一个虚拟的四层路由交换器集群系统,根据目标地址和目标端口实现用户请求转发。LVS由两段代码组成。

软件负载均衡基于IPVS,它实现了传输层负载均衡,也就是我们常说的4层LAN交换。作为 Linux 内核的一部分,IPVS运行在主机上,在真实服务器集群前充当负载均衡器。IPVS可以将基于TCP和UDP的服务请求转发到真实服务器上,并使真实服务器的服务在单个 IP 地址上显示为虚拟服务。在内核2.4.22之后,IPVS直接被收录进内核源码树了,只要启用了相关功能就可以直接拿来使用。IPVS相当于工作在netfilter中的INPUT链,它挂接在IP报文遍历的LOCAL_IN链和IP_FORWARD链两处,用于截取/改写IP报文,然后再转发出去,如图所示:

IP报文在内核的遍历图

IPVS工作原理如下:

  1. 客户端向负载均衡调度器(Director Server)发起请求,调度器将用户请求发送到内核空间。
  2. PREROUTING收到用户请求后,先判断目的IP是否为本机IP,如果是就将报文发到INPUT链。
  3. 由于IPVS工作在INPUT链上,当用户请求到达INPUT时,IPVS会将用户请求的目的和已经定义好的IPVS规则进行对比,如果请求目的地为VIP地址,IPVS调度器会选择一个后端真实服务器然后修改数据包里的目标IP地址,并将新的数据包发往POSTROUTING链。
  4. POSTROUTING链接收数据包后发现目标IP地址是自己的后端服务器,那么此时通过路由决策,将数据包发送给后端的服务器。

IPVS+IPTables的报文处理流程如图所示:

IPVS模式报文经过的模块

4.2. IPVS调度算法

IPVS在内核中的负载均衡调度是基于连接进行操作的,每个客户端请求与服务器端都需要建立一个TCP连接,调度算法负责将不同用户的连接均匀分配到后端的真实服务器上,这样可以避免单个服务器创建过多的连接而导致服务器之间的负载不平衡。

在内核中的连接调度算法上,IPVS已实现多种调度算法,下面是最常见的几种:

轮询调度Round-Robin Scheduling这种算法通过轮询的方式依次将请求调度到后端真实的服务器。假设有n台真实服务器,每次执行i = (i + 1) mod n,并选出第i台服务器。这种算法不需要记录连接的状态,所以它是一种无状态的调度,由于它假设集群中的服务处理性能是一样的,当用户请求时间变化比较快的时候,可能导致服务器之间负载不平衡。

加权轮询调度Weighted Round-Robin Scheduling在轮询算法的基础上引入一个权重,按权重的比例来调度真实的服务器。

最小连接调度Least-Connection Scheduling这种算法会把新的连接请求发送给当前连接数最少的后端服务器。调度器会记录每个服务器当前的连接数,当一个请求被调度到一个服务器时,连接计数器加一,反之当连接断开时,计数器减一。内核中每种调度算法均被实现为一个内核模块,在需要时加载。其中ip_vs_tbl是我们使用的自定义的调度器,会在后文介绍。

4.3. IPTables/Netfilter

IPTables是一个配置Linux内核防火墙的命令行工具,它基于内核的Netfilter机制。Netfilter是Linux内核的包过滤框架,它提供了一系列的钩子(Hook)供其它模块控制数据包的流动,这中间涉及到“四表五链”,即在两个维度(规则功能以及规则所处链路)对规则进行分组,“四表”存放着功能一致的规则,“五链”存放着数据包所处链路一致的规则,具体如下:四表:Filter表:过滤数据包。NAT表:用于网络地址转换(IP、端口)。Mangle表:修改数据包的服务类型、TTL,并且可以配置路由实现QOS。Raw表:决定数据包是否被状态跟踪机制处理。

五链:INPUT链:经过路由查找后,送往本机(目的地址在本地)数据包应用此规则链中的规则。OUTPUT链:本地生成的发往其他机器的数据包应用此规则链中的规则。FORWARD链:非本地产生的并且目的地不是本地的包(转发数据包)应用此规则链中的规则。PREROUTING链:刚通过数据链路层解包进入网络层的数据包,在做出路由选择前应用此链中的规则。POSTROUTING链:数据包离开本机之前以及作路由选择后应用此链中的规则。IPTables的表和链的流程如图所示:

IPtables的表和链

其中PREROUTING和POSTROUTING是最重要的两个链:

1)PREROUTING负责处理刚从网卡进入的数据包,在此之前还没有做路由决策,所以还不确认这个数据包是应该交给本机处理,还是要转发到连接着另外一个网卡的计算机。数据包通过PREROUTING链后,将做出路由决策。如果数据包是发往本地计算机,则该数据包将被转发到相应的进程。如果目的地址不是在本地,那么就会将数据包转发到相应的接口,或者通过默认网关转发出去。

2)在数据包离开机器之前,它通过POSTROUTING链,然后通过网络接口离开本机。对于本地生成的数据包,这里有一点差别:数据包不会经过PREROUTING链,而是通过OUTPUT链,然后转移到POSTROUTING链。因此,只有本地应用程序生成的数据包才会经过OUTPUT链,而所有数据包(包括从其他地方路由的数据包)都会经过POSTROUTING链。

展开阅读全文

页面更新:2024-04-01

标签:均衡器   化整为零   目的   分布式   负载   路由   内核   算法   规则   地址   服务器   用户   系统

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top