负载均衡(1)-介绍

最后更新:2020-04-25

在网站创立初期,我们一般都使用单台机器对台提供集中式服务,但是随着业务量越来越大,无论是性能上还是稳定性上都有了更大的挑战。为了保证应用程序的高可用性和性能,我们可以采取冗余的方式,将相同的应用部署多个副本,然后使用负载均衡器接受用户的请求,将请求分发给后端的应用服务器。

负载均衡核心要解决的就是通过一个负载均衡服务器,将用户的请求分发给多个应用服务器,将多个应用服务器构建成一个集群,共同对外提供服务。这样的架构可以提高系统的处理能力,以解决高并发用户请求下的系统性能问题。

事实上,负载均衡还可以实现系统的高可用。因为用户的请求是通过负载均衡服务器请求分发到不同的应用服务器上的。那么当某个应用服务器宕机的时候,负载均衡服务器可以通过响应超时或者其它的心跳策略,发现这个应用服务器不可用,就可以将请求转发给其它的服务器,保证用户的请求总是能够成功的,整个系统对外看起来是可用的。从而使某个应用的服务器宕机,不会影响到整个系统的可用性。

负载均衡(Load Balance),意思是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。是解决高性能,单点故障(高可用),扩展性(水平伸缩)的终极解决方案。

通常,负载均衡主要应用于 Web 网站,大型的 Internet Relay Chat 网络,高流量的文件下载网站,NNTP(Network News Transfer Protocol)服务和 DNS 服务。

对于互联网服务,负载均衡器通常是一个软体程序,这个程序侦听一个外部端口,互联网用户可以通过这个端口来访问服务,而作为负载均衡器的软体会将用户的请求转发给后台内网服务器,内网服务器将请求的响应返回给负载均衡器,负载均衡器再将响应发送到用户,这样就向互联网用户隐藏了内网结构,阻止了用户直接访问后台(内网)服务器,使得服务器更加安全,可以阻止对核心网络栈和运行在其它端口服务的攻击。

当所有后台服务器出现故障时,有些负载均衡器会提供一些特殊的功能来处理这种情况。例如转发请求到一个备用的负载均衡器、显示一条关于服务中断的消息等。

负载均衡器使得 IT 团队可以显著提高容错能力。它可以自动提供大量的容量以处理任何应用程序流量的增加或减少。

1. 原理

系统的扩展可分为垂直扩展和水平扩展。

垂直扩展,是从单机的角度通过增加硬件处理能力,比如CPU处理能力,内存容量,磁盘等方面,实现服务器处理能力的提升,但不能满足大型分布式系统(网站),大流量,高并发,海量数据的问题。因此需要采用水平扩展的方式,通过添加机器来满足大型网站服务的处理能力。比如:一台机器不能满足,则增加两台或者多台机器,共同承担访问压力。这就是典型的集群和负载均衡架构:如下图:

负载均衡的作用:

  1. 解决并发压力,提高应用处理性能(增加吞吐量,加强网络处理能力);
  2. 提供故障转移,实现高可用;
  3. 通过添加或减少服务器数量,提供网站伸缩性(扩展性);
  4. 安全防护;(可以在负载均衡设备上做一些过滤,黑白名单等处理)

2. 负载均衡的分类

常见的负载均衡系统包括 3 种:DNS 负载均衡、硬件负载均衡和软件负载均衡。

2.1. DNS负载均衡

DNS 是最简单也是最常见的负载均衡方式,一般用来实现地理级别的均衡。例如,北方的用户访问北京的机房,南方的用户访问深圳的机房。DNS 负载均衡的本质是 DNS 解析同一个域名可以返回不同的 IP 地址。例如,同样是 www.baidu.com,北方用户解析后获取的地址是 61.135.165.224(这是北京机房的 IP),南方用户解析后获取的地址是 14.215.177.38(这是深圳机房的 IP)。

下面是 DNS 负载均衡的简单示意图:

DNS 负载均衡实现简单、成本低,但也存在粒度太粗、负载均衡算法少等缺点。

其优点有:

  • 简单、成本低:负载均衡工作交给 DNS 服务器处理,无须自己开发或者维护负载均衡设备。
  • 就近访问,提升访问速度:DNS 解析时可以根据请求来源 IP,解析成距离用户最近的服务器地址,可以加快访问速度,改善性能

缺点有:

  • 更新不及时:DNS 缓存的时间比较长,修改 DNS 配置后,由于缓存的原因,还是有很多用户会继续访问修改前的 IP,这样的访问会失败,达不到负载均衡的目的,并且也影响用户正常使用业务。
  • 扩展性差:DNS 负载均衡的控制权在域名商那里,无法根据业务特点针对其做更多的定制化功能和扩展特性。
  • 分配策略比较简单:DNS 负载均衡支持的算法少;不能区分服务器的差异(不能根据系统与服务的状态来判断负载);也无法感知后端服务器的状态。

DNS负载均衡只能实现局部高可用,要完全实现高可用,需要搭配反向代理、keepalived等技术。

2.2. 硬件负载均衡

硬件负载均衡是通过单独的硬件设备来实现负载均衡功能,这类设备和路由器、交换机类似,可以理解为一个用于负载均衡的基础网络设备。目前业界典型的硬件负载均衡设备有两款:F5 和 A10。这类设备性能强劲、功能强大,但价格都不便宜,一般只有“土豪”公司才会考虑使用此类设备。普通业务量级的公司一是负担不起,二是业务量没那么大,用这些设备也是浪费。

硬件负载均衡的优点是:

  • 功能强大:全面支持各层级的负载均衡,支持全面的负载均衡算法,支持全局负载均衡。
  • 性能强大:对比一下,软件负载均衡支持到 10 万级并发已经很厉害了,硬件负载均衡可以支持 100 万以上的并发。
  • 稳定性高:商用硬件负载均衡,经过了良好的严格测试,经过大规模使用,稳定性高。
  • 支持安全防护:硬件均衡设备除具备负载均衡功能外,还具备防火墙、防 DDoS 攻击等安全功能。

硬件负载均衡的缺点是:

  • 价格昂贵
  • 扩展能力差:硬件设备,可以根据业务进行配置,但无法进行扩展和定制。

2.2. 软件负载均衡

相对于“硬件负载均衡器”来说,对内网服务器进行负载均衡就属于“软件负载均衡器”。例如:LVS,HAProxy,Nginx。其中 Nginx 是软件的 7 层负载均衡,LVS 是 Linux 内核的 4 层负载均衡。4 层和 7 层的区别就在于协议和灵活性,Nginx 支持 HTTP、E-mail 协议;而 LVS 是 4 层负载均衡,和协议无关,几乎所有应用都可以做,例如,聊天、数据库等。

硬件负载均衡工作在“接入层”,主要任务是多链路负载均衡,防火墙负载均衡,服务器负载均衡。

软件负载均衡工作在“代理层”,主要任务是反向代理,缓存,数据验证等等。

硬件负载均衡在接入层获得网络请求,然后转交给软件负载均衡,软件负载均衡用同样的方式处理返回的请求。

软件和硬件的最主要区别就在于性能,硬件负载均衡性能远远高于软件负载均衡性能。Ngxin 的性能是万级,一般的 Linux 服务器上装一个 Nginx 大概能到 5 万 / 秒;LVS 的性能是十万级,据说可达到 80 万 / 秒;而 F5 性能是百万级,从 200 万 / 秒到 800 万 / 秒都有。当然,软件负载均衡的最大优势是便宜。

软件负载均衡的优点:

  • 简单:无论是部署还是维护都比较简单。
  • 便宜:只要买个 Linux 服务器,装上软件即可。
  • 灵活:4 层和 7 层负载均衡可以根据业务进行选择;也可以根据业务进行比较方便的扩展,例如,可以通过 Nginx 的插件来实现业务的定制化功能。

软件负载均衡的缺点都是和硬件负载均衡相比的,并不是说软件负载均衡没法用。

  • 性能一般:一个 Nginx 大约能支撑 5 万并发。
  • 功能没有硬件负载均衡那么强大。
  • 一般不具备防火墙和防 DDoS 攻击等安全功能。

3. 四层负载均衡和七层负载均衡

应用程序通过网络进行通信,需要不同的软件和硬件合作完成。为了将复杂的问题简化,将通信过程中的相关功能各进行分层。开放系统互连(OSI)将网络通信抽象为七层模型,

按照OSI模型定义的层级,将负载均衡器分为四层负载均衡七层负载均衡

所谓四层负载均衡就是使用IP加端口的方式进行路由转发;七层负载均衡一般是基于请求URL地址的方式进行代理转发。同理,还有基于MAC地址信息(虚拟MAC地址到真实MAC地址)进行转发的二层负载均衡和基于IP地址(虚拟IP到真实IP)的三层负载均衡。

四层负载均衡工作在传输层。传输层负责处理消息的传递而不考虑消息的内容。HTTP协议使用了传输控制协议(TCP),故四层负载均衡器简单地将网络数据包转发到上游服务器和转发上游服务器的数据包,不检查数据包的内容。四层负载均衡器可以通过检查TCP流中的前几个数据包来做出有限的路由决策。

四层负载均衡具体实现方式为:通过报文中的IP地址和端口,再加上负载均衡器所采用的负载均衡算法,最终确定选择后端哪台下游服务器。

以常见的TCP为例,负载均衡器在接收到第一个来自客户端的SYN 请求时,即通过上述方式选择一个最佳的服务器,并对报文中目标IP地址进行修改(改为后端服务器IP),直接转发给该服务器。TCP的连接建立,即三次握手是客户端和后端服务器直接建立的,负载均衡设备只是起到一个类似路由器的转发动作。在某些部署情况下,为保证服务器回包可以正确返回给负载均衡设备,在转发报文的同时可能还会对报文原来的源地址进行修改。

七层负载均衡器工作在应用层。HTTP就是工作在第七层的协议。第七层的负载均衡器的工作方式比第四层的负载均衡器更复杂,它会截取流量,读取其中的信息,并根据消息的内容(如URL、cookie)作出负载均衡的决策。然后,它与选定的上游服务器建立新的TCP连接,并将请求写入服务器。

以常见的TCP为例,负载均衡设备如果要根据真正的应用层内容再选择服务器,只能先代理最终的服务器和客户端建立连接(三次握手)后,才可能接受到客户端发送的真正应用层内容的报文,然后再根据该报文中的特定字段,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。负载均衡设备在这种情况下,更类似于一个代理服务器。负载均衡和前端的客户端以及后端的服务器会分别建立TCP连接。

七层服务均衡在应用层选择服务器,只能先与负载均衡器进行TCP连接,然后负载均衡器再与后端服务器建立另外一条TCP连接通道。因此,七层设备在网络性能损耗会更多一些。

LVS(Linux虚拟服务)是工作在第四层的负载均衡软件,在各个主要用来构建高可用的网络服务,比如Web服务、电子邮件服务、媒体服务、语音服务等。

Nginx既可以作为四层负载均衡器使用,也可以作为七层负载均衡器使用。如果NGINX使用轮询算法,就是四层负载均衡器,如果使用hash,就是七层负载均衡

七层负载均衡在时间和计算量方面比第四层更加昂贵,不过它可以提供更丰富的功能,从而带来更高的整体效率。比如七层负载均衡器可以确定客户端请求的数据类型,从而不必在所有的服务器上复制相同的数据。

七层应用负载的好处,是使得整个网络更”智能化“。例如访问一个网站的用户流量,可以通过七层的方式,将对图片类的请求转发到特定的图片服务器并可以使用缓存技术;将对文字类的请求可以转发到特定的文字服务器并可以使用压缩技术。当然这只是七层应用的一个小案例,从技术原理上,这种方式可以对客户端的请求和服务器的响应进行任意意义上的修改,极大的提升了应用系统在网络层的灵活性。很多在后台,例如Nginx或者Apache上部署的功能可以前移到负载均衡设备上,例如客户请求中的Header重写,服务器响应中的关键字过滤或者内容插入等功能。

另外一个常常被提到功能就安全性。网络中最常见的SYN Flood攻击,即黑客控制众多源客户端,使用虚假IP地址对同一目标发送SYN攻击,通常这种攻击会大量发送SYN报文,耗尽服务器上的相关资源,以达到Denial of Service(DoS)的目的。从技术原理上也可以看出,四层模式下这些SYN攻击都会被转发到后端的服务器上;而七层模式下这些SYN攻击自然在负载均衡设备上就截止,不会影响后台服务器的正常运营。另外负载均衡设备可以在七层层面设定多种策略,过滤特定报文,例如SQL Injection等应用层面的特定攻击手段,从应用层面进一步提高系统整体安全。

现在的7层负载均衡,主要还是着重于应用HTTP协议,所以其应用范围主要是众多的网站或者内部信息平台等基于B/S开发的系统。 4层负载均衡则对应其他TCP应用。

七层应用需要考虑的问题

  1. 是否真的必要,七层应用的确可以提高流量智能化,同时必不可免的带来设备配置复杂,负载均衡压力增高以及故障排查上的复杂性等问题。 在设计系统时需要考虑四层七层同时应用的混杂情况。
  2. 是否真的可以提高安全性。例如 SYN Flood 攻击,七层模式的确将这些流量从服务器屏蔽,但负载均衡设备本身要有强大的抗 DDoS 能力, 否则即使服务器正常而作为中枢调度的负载均衡设备故障也会导致整个应用的崩溃。
  3. 是否有足够的灵活度。七层应用的优势是可以让整个应用的流量智能化,但是负载均衡设备需要提供完善的七层功能,满足客户根据不同情况的基于应用的调度。 最简单的一个考核就是能否取代后台 Nginx 或者 Apache 等服务器上的调度功能。 能够提供一个七层应用开发接口的负载均衡设备,可以让客户根据需求任意设定功能,才真正有可能提供强大的灵活性和智能性

4. 参考资料

https://mp.weixin.qq.com/s/4GuAT1TncctCdPIyK2bGWQ

https://mp.weixin.qq.com/s/5K36wNsZjFnuQMfuFcNv8Q

http://blog.sae.sina.com.cn/archives/4843

《从0开始学架构》

Edgar

Edgar
一个略懂Java的小菜比