- 企业云计算:原理、架构与实践指南
- 方国伟等
- 7034字
- 2021-04-02 01:20:08
3.6 负载均衡技术
负载均衡(Load Balance)技术是一项重要的网络均衡转发技术,它构建于网络基础之上,提供透明、无感知、低成本、高性能的均衡分发服务。负载均衡技术从整体上提升了网络设备、服务器设备的响应能力,增强了网络对数据的处理能力,同时提升具体应用的对外服务能力、应用的吞吐量和应用的稳定性。除此以外,在云环境中,负载均衡产品还能够加强网络安全,为应用带来更多的安全控制能力。
但也不能简单地通过以上定义固化负载均衡技术的含义,因为随着传统网络向云平台的演进,发现了更多负载均衡技术所带来的好处。下面通过两种情况来说明负载均衡技术的典型优势。
(1)应用服务要响应海量的并发请求,接纳大量的数据流量,经过负载均衡技术的处理后,不仅可以实现应用高可用的需求,同时减少了请求等待响应的时间。
(2)负载均衡改善了单台服务器重负载的现象,在运算请求负荷很大的情况下,负载均衡技术实现了计算的并行处理,系统处理能力大大提升。
总体来讲,负载均衡技术的优点在于它可以根据应用流量进行判断,自动完成请求的分发,同时通过弹性伸缩资源策略,来应对流量变化对计算能力的需求。
3.6.1 负载均衡技术原理
负载均衡技术的原理是一个值得探讨和讲述的话题,因为客户端发起的每一次请求传递到服务器的过程中,有很多环节可以实现负载均衡,各个云厂商在架构自己的负载均衡时,实现方式不同,所以负载均衡技术的原理是灵活多变的。
1.负载均衡分类
根据架设负载均衡的环节的不同,负载均衡大致分为以下几类。
1)数据链路层负载均衡
数据链路层负载均衡使用虚拟MAC地址的方式提供服务,请求数据包中的二层目的地址封装的是对外服务的虚拟MAC地址,负载均衡接收请求后,会将请求分配到具有实际MAC地址的设备上进行响应。
在这个过程中,负载均衡利用修改目的MAC地址的方式进行请求转发,而不修改IP,因为组建这样的负载均衡模型时,真实物理服务器集群的IP和负载均衡服务IP是一致的。这种方式的好处是不需要修改数据包的源IP和目的IP就可以实现数据分发。
如图3.12所示,服务器的服务IP地址和数据请求的目的IP一致时,负载均衡不需要转换IP地址,可将应答的数据包直接返回给客户端。如果公网IP地址充足,甚至可以为每一台服务器都配置自己的公网IP,服务器便可以使用自己的公网IP进行请求的应答,在一定程度上,巧妙地规避负载均衡服务器本身的网卡带宽成为系统瓶颈的问题。不过这种情况下,要为每一台服务器都绑定负载均衡的服务IP,才能确保服务器收到请求报文。这种三角传输的负载均衡方式也称为直接路由(DR)方式。这种方式被非常广泛地用于应用业务中以获取最好的工作性能,只是配置起来略显复杂。
图3.12 数据链路层负载均衡模型
2)网络层负载均衡
网络层负载均衡(三层负载均衡)采用虚拟IP地址的方式提供服务。请求数据包中的IP地址为负载均衡服务IP,并且请求将通过实际互联IP地址分配到后端实际的服务器上进行响应。在这一原理中,请求数据包将被负载均衡服务器的内核进行处理,通过负载均衡算法得到一个目标真实服务器的地址,并修改请求数据包中的目的IP为真实服务器IP,来完成请求的分发。而真实服务器处理请求后,会将响应返回给负载均衡服务器,在负载均衡服务器上再次完成源IP的修改,用负载均衡自身的服务IP对客户端进行回应。
如图3.13所示,负载均衡在修改目的IP地址的同时修改了响应的源IP地址,所以又被称为SNAT方式的负载均衡。所有的请求报文和响应报文都需要经过负载均衡服务器的处理,集群的吞吐能力将受到服务器网卡带宽的限制。
图3.13 网络层负载均衡模型
有三层的负载均衡,就有四层的负载均衡,四层负载均衡在图3.13所示的技术特点的基础之上,增加了四层协议TCP/UDP的端口,根据IP+端口来调度请求,分发到后端的服务器上进行响应。
3)反向代理负载均衡
利用反向代理实现负载均衡已经成为很多云平台厂商常用的方法。反向代理位于服务提供侧,部署在服务器的前端,替服务接收HTTP请求。服务器也不直接暴露于公网提供服务,因此并不需要部署外网IP,所以反向代理还有保护网站安全的作用。
如图3.14所示,反向代理服务接收到HTTP的访问请求后,按照负载均衡算法将请求分配到服务器端获取响应,当接收到响应报文后对外提供代理应答,所以也同时充当了负载均衡器的作用。反向代理服务器需要拥有两块网卡,分别用于配置内部互联IP和外部服务IP。
图3.14 反向代理负载均衡模型
反向代理得到服务器的响应内容后,同时可以缓存到本地,当内容再次被请求时,代理可以通过缓存内容对用户进行响应,很大程度上降低了服务器的负载。
由于反向代理负载均衡大多用于应用层请求,可以针对域名、URL甚至是主机名接收的请求做负载均衡,所以也被称为应用层负载均衡或HTTP负载均衡。
反向代理负载均衡集成了反向代理和负载均衡两种功能,所以部署相对简单,但反向代理是所有应用层请求的中转站,其性能会有一定的瓶颈,在架构和部署时要充分考虑扩容和性能提升的问题。
4)DNS负载均衡
DNS负载均衡是利用处理DNS域名解析请求的同时进行负载均衡。可以在DNS服务中为同一个域名配置多条A记录,使得每一次的域名解析请求根据负载均衡算法分配到不同的服务IP。
如图3.15所示,当yun.pingan.com存在3条不同的A记录时,用户的每一次解析请求可以获得不同的结果,从而使不同用户的请求分配到不同的服务器上,这就是DNS实现负载均衡的方式。
图3.15 DNS负载均衡模型
在DNS环节部署负载均衡的好处是可以将负载均衡的工作交给DNS来完成,规避了服务侧网络功能部署的复杂性,但由于DNS对A记录具有缓存性,受网站服务侧变更控制有较长的延迟,不容易在第一时间发生连动。
事实上,很多大型线上服务的应用都将DNS作为负载均衡的第一级手段,然后再在其他环节部署负载均衡。
DNS负载均衡使用起来非常简单,并且DNS的域名解析性能很高,反应速度快,如果可以解析成距离用户最近的服务位置,还可以提升用户的访问速度。但DNS负载均衡也有一些不足,如:由运营商控制的DNS多级服务新增和修改起来有延迟,而且不方便对DNS做更多的改善和扩展,只能寄希望于域名提供商的维护;同时DNS离真实的服务端较远,不能区分后端真实设备性能的好坏。了解了这些优点和不足之处便可以更灵活地将DNS负载均衡运用于网络服务中了。
5)HTTP重定向负载均衡
HTTP重定向负载均衡中需要有一个重定向服务器来完成HTTP请求的重定向任务,通过重定向建立连接的目的地址来完成负载均衡。但是这一过程会使客户端的浏览器发起两次链接请求才能正常访问,并且即使是重定向的过程,对于重定向服务器而言也是一次标准的HTTP请求响应过程,重定向服务器会回复302响应状态码给浏览器。
如图3.16所示,假设重定向服务器后端有4台服务器,那么重定向服务器的流量将是后端集群请求的4倍。如果是100台服务器的集群,结果就是100倍。
图3.16 HTTP重定向负载均衡模型
除了以上介绍的5种类型的负载均衡外,还有很多其他方式的负载均衡。在云平台的构建中,一般不仅仅使用上述的一种负载均衡方式,而是根据特定的场景和需求来判断使用,并且会组合运用多种负载均衡方式来提升服务的能力。
2.负载均衡的主流技术
下面介绍负载均衡的几种主流技术。
1)四层负载均衡技术
四层负载均衡是基于IP+端口的负载均衡。常见的四层负载均衡组件包括LVS、Nginx和HAProxy等。LVS四层负载均衡是非常常见的负载均衡技术,具有三种工作模式:NAT模式、TUN模式和DR模式,并且支持10种负载均衡调度算法,下文中将详细介绍。Nginx是一种反向代理服务器,同时具有缓存等高级功能,也支持轮询、权重、IP哈希算法以及其他第三方转发策略的方式来实现负载均衡。HAProxy是一款支持四层高性能负载均衡的开源代码,自带强大的监控服务器状态页面。
2)七层负载均衡技术
七层负载均衡是基于URL等应用层信息的负载均衡。常见的支持七层负载均衡的组件包括HAProxy、Nginx、Apache和MySQL Proxy等。HAProxy支持七层负载均衡,并提供全面七层代理和会话保持功能,HAProxy作为MySQL、邮件等应用的负载均衡也具有非常突出的性能。Nginx实现的七层负载均衡在HTTP和HTTPS上可以发挥出很好的能力。Apache和MySQLProxy也可以实现七层负载均衡,但功能一般,这里不多作介绍。
3)负载均衡算法
每一个负载均衡服务器上都有一个调度器(LB),依靠它将客户请求按照一定的规则分发到后端服务器,这些规则是预先定义好的调度算法。常见的调度算法有:
(1)轮询(Round Robin)。
这是最简单的调度算法,LB按照顺序将请求一次性转发给后端的真实服务器(RS),并不参考后端RS的处理能力和响应速度。但是在大多数的真实环境中,RS的状态各不相同,这种算法无法满足合理利用资源的要求。
(2)加权轮询(Weighted Round Robin)。
带权重的轮询是在轮询算法的基础上为后端RS赋予权重值,权重值越高的RS被分配的请求越多,这种方式适合按照服务器性能的高低赋予不同的权重值,从而达到合理的资源利用。
(3)最少连接(Least Connections)。
该算法会将请求分发到连接数最少的RS上,连接数越少,说明RS相对空闲,从而实现均衡的负载。
(4)加权最少连接(Weighted Least Connections)。
该算法在采用最少连接数的同时为RS分配权重,目的是在资源实际使用的基础上,达到人为控制连接请求的分配。
(5)基于局部性的最少连接(Locality-Based Least Connections,LBLC)。
这是一种基于报文目的IP的负载均衡调度方式,常用于Cache集群系统。Cache集群中客户请求报文的目的IP地址是变化的,目的是将相同目的IP的请求调度到同一台RS上响应,以便提高每台RS的访问局部性和主存Cache的命中率,从而提升整个集群的处理能力。该算法根据请求的目的IP地址首先找出该目的IP地址最近使用的服务器,若该服务器是可用的且没有超载,会将请求发送到该服务器;若服务器不存在,或者该服务器超载且有其他服务器处于较低的工作负载状态,则用“最少连接”原则选出一个可用的服务器,将请求发送到该服务器。
(6)带复制的基于局部性最少连接(Locality-Based Least Connections with Replication,LBLCR)。
与LBLC场景相同,常用于Cache集群系统。但是LBLC是维护一个目的IP到一台服务器的映射,而LBLCR算法是用于维护一个目的IP到一组服务器的映射。即,根据请求的目标IP找出对应的服务器组,按“最少连接”原则从服务器组中选出一台服务器来响应,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个Cache集群中选出一台服务器,将该服务器加入到服务器组中,再将请求发送到该服务器。
(7)目标地址散列(Destination Hashing,DH)。
该算法是一种静态映射算法,针对请求报文的目的IP,通过一个哈希函数将一个目的IP映射到一台服务器。DH算法将请求的目的IP作为Hash Key并从静态分配的散列表中找出对应的服务器。如果该服务器是可用的并且没有超载,则将请求发送给该服务器,否则返回空。
(8)源地址散列(Source Hashing,SH)。
SH算法与DH算法相反,它根据请求中的源IP地址作为Hash Key并从静态分配的散列表中找出对应的服务器。如果该服务器是可用的并且没有超载,则将请求发送给该服务器,否则返回空。
(9)Fair调度算法。
该算法按照后端服务器的响应时间来分配请求,响应时间越短越优先分配。
(10)URL哈希算法。
该算法按访问URL的Hash结果来分配请求,使每个URL定向到一个后端服务器,后端服务器有缓存功能时,可以有效地提升处理能力。
4)健康检查技术
负载均衡的健康检查是用来判断后端服务器的业务可用性的,也是负载均衡提升业务整体可用性的一种机制。负载均衡开启健康检查功能后,通过健康检查规则判断后端服务器的异常状态。当服务器异常时,负载均衡会自动将新的请求发送给其他健康的服务器进行处理;而当异常服务器恢复正常时,负载均衡又会让该服务器正常参与请求的处理。这种机制主要是为了保证业务层面的可用。健康检查的种类有如下几种:
(1)TCP健康检查机制。
TCP健康检查针对四层TCP监听,是一种较为高效的检查机制。它通过使用TCP建立连接的方式探测后端服务器的健康状况,即向后端RS的互联IP+端口发起TCPSYN报文,并得到后端RS的响应报文SYN+ACK。如果后端RS在预定义的响应超时时间内完成回应,则认为服务器正常;如果没在响应超时时间内收到应答,则判定为异常状态。
(2)UDP健康检查机制。
该方式是通过UDP报文向后端服务器IP+端口发起探测,如果后端RS的端口未正常监听,则系统会返回portxxunreachable的ICMP报错信息,反之正常情况不会做任何响应处理。如果在预先定义的响应超时时间内收到了后端RS的上述回应,则认为服务器异常,如果没在响应超时时间内收到应答,则判定为正常状态。
(3)HTTP健康检查机制。
HTTP健康检查机制针对七层HTTP/HTTPS协议监听生效。HTTP健康检查通过向后端“服务器IP+健康检查端口+检查路径”发送HTTPHEAD请求进行探测,后端服务器在收到请求后,会根据相应的业务运行情况返回HTTP状态码,例如2xx、3xx、4xx、5xx等。如果在预先定义的响应超时时间内收到了后端服务返回的状态码,则与预定义的健康状态码比对,判定业务的健康状态;如果在响应超时时间内,没有收到任何回应,则判断业务不可达,处于异常状态。
3.6.2 负载均衡应用场景
为什么要使用负载均衡呢?在原始的场景中,当应用面临大量的用户访问时,这个应用系统的负载是很高的,并且负载分配不均匀。最初会通过增加服务器数量的方式横向扩展,以便通过提升集群整体能力的方式来提升处理能力。后来又将相同的应用部署在不同的高性能集群上,为了解决统一出口和访问调度的问题,在这种横向扩展的基础上,采用负载均衡的调度方式,就有了图3.17所示的经典的负载均衡模型。
图3.17 经典的负载均衡模型
●应用集群上部署的是相同的应用,组成高可用处理集群,用于接收负载均衡设备分发的请求;
●负载均衡服务器主要提供负载均衡算法,将用户请求分配到可用的真实服务器上进行处理。
但是不能简单地理解为负载均衡的应用场景就是将请求分发到不同的服务器上去响应,目的是让服务器的负载达到均衡的状态。现阶段负载均衡之所以能成为每一个在线应用必不可少的环节,成为网络架构中不可或缺的组件,是因为负载均衡在服务的过程中发挥以下作用:
(1)解决并发压力,提升应用处理性能;
(2)避免单点故障,实现应用高可用;
(3)弹性伸缩扩展,节省服务器资源消耗;
(4)对资源进行压缩传递,SSL证书卸载,减轻服务器负担;
(5)提供访问控制的黑名单/白名单功能,实现安全防护。
基于上述作用,负载均衡被用于很多商业应用场景来解决问题,尤其是在云平台的网络配置中,负载均衡是用户使用最多的一款产品。
下面介绍负载均衡在云环境中常见的五个应用场景。
(1)Web服务器负载均衡。
通过负载均衡对Web服务器建立有效的健康检查和负载均衡机制,而不改动原有的网络架构,从而提供一种高性价比、透明的容错方法对网络设备进行扩容,并提升服务器的带宽利用率、吞吐量和数据处理能力,提高Web业务的灵活性和可用性。
(2)云网络内部系统间业务调用。
如果VPC内部不同的系统间的访问量很高,可以通过负载均衡在VPC内部的系统间建立有效的负载均衡机制,将流量分发到不同的后端服务器上,从而分担系统之间的业务请求负荷,提升系统的数据处理能力,提高访问的效率。
(3)电商促销抢购场景。
电商业务有明显的网络潮汐效应,通过负载均衡和弹性伸缩组的无缝对接,可以实现自动创建后端云服务器,并有效校验服务器的健康状况,将流量自动分发到新扩容的服务器上,缓解电商促销高峰时的业务系统压力。
(4)跨可用区同城容灾。
负载均衡可以将访问请求和流量分发到多个可用区的云服务器上进行响应,建立实时的跨可用区同城容灾机制,满足不同企业对业务系统高可用性的要求。
(5)HTTPS业务SSL卸载。
SSL卸载技术是通过将HTTPS应用访问过程中的SSL加解密过程转到负载均衡设备上,从而减少服务器端对SSL证书进行处理所产生的性能压力,提升客户端的访问响应速度。
3.6.3 平安云的负载均衡
平安云的负载均衡指的是在平安云网络环境中提供给VPC使用的负载均衡产品。平安云负载均衡不是一个网络环境中的功能组件,而是一款能够适用于绝大多数客户的负载均衡产品。所以平安云负载均衡产品不会将部署过程、安全防御、限速控制、智能监控等功能寄希望于其他网络组件,而是要权衡线上的多种业务场景来提供一款多功能的负载均衡器。
1.ELB服务逻辑架构
ELB服务的逻辑架构如图3.18所示,由ELB实例、监听器、服务器资源池三部分构成。
图3.18 ELB服务的逻辑架构
1)负载均衡实例
负载均衡实例提供负载均衡服务。负载均衡实例提供服务IP地址作为客户端访问的统一接口。每个负载均衡实例能够配置多个监听器,对同一个服务IP地址提供多端口的监听服务。
2)监听器
监听器的作用是接收客户端的请求并将请求转发给服务器资源池中的主机,并对后端主机进行健康检查。每个监听器都能够配置一个特定的服务器资源池。
3)服务器资源池
服务器资源池是一组用于接收前端请求的ECS或BMS实例。可以添加一个或多个ECS实例或BMS实例到服务器资源池并配置权重和后端服务端口。
2.ELB服务核心功能及类型
ELB服务包含监听与调度两大核心功能,可在监听器中配置前端端口、协议、调度算法、URL转发、健康检查、证书、会话保持、访问控制以及服务器资源池关联信息等。具体功能如表3.2所示。
表3.2 ELB服务核心功能
ELB服务分为公网和私网两种类型。
(1)公网型:通过公网IP地址对外提供服务,提供四层和七层负载均衡能力,适用于在互联网上发布网站或应用程序上线,可以支持多可用区部署,当主可用区服务发生故障时,负载均衡可以自动切换到备份可用区,实现服务的高可用,其部署架构如图3.19所示。
图3.19 公网型ELB部署架构
(2)私网型:通过私网IP地址提供服务,具有四层负载均衡能力,适用于承载VPC内部系统间的调用请求,其部署架构如图3.20所示。
图3.20 私网型ELB部署架构
综上所述,平安云采用当今最主流的负载均衡技术LVS和Nginx,实现了负载均衡在云平台上的自动化部署,将负载均衡器打包成一款实用性很强的产品,通过图形化界面来满足用户上手可用的需求。