网络负载均衡和代理技术

网络负载均衡和代理技术

1.  什么是网络负载均衡

在计算中,负载均衡可以改善在多个计算机资源(如计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器)上的工作负载分布。负载均衡旨在优化资源的使用,最大吞吐量,及最小响应时间,避免任何单一资源的过载。通过使用多个组件而不是单个组件,负载均衡通过冗余来提高可靠性和可用性。负载均衡通常涉及专用软件和硬件,例如多层交换机或域名系统服务器进程。

以上定义适用于计算的各个方面,而不仅仅是网络。操作系统使用负载均衡在物理处理器之间安排任务,诸如Kubernetes之类的容器编排者使用负载均衡来计划跨计算集群的任务,网络负载均衡通过调用可用后端来平衡网络任务。以下内容仅涵盖网络负载均衡。


图 1: 网络负载均衡描述


图1展示了网络负载均衡高层次的概览。一些客户端从后端请求资源。负载均衡器位于客户端和后端之间,在更高层次执行关键任务:

  • 服务发现:在系统中哪些后端可用?地址是多少?(换句话说,负载均衡器如何与它们通信?)

  • 健康检查:在系统中目前哪些后端是健康的,可以接受请求?

  • 负载均衡:用什么样的算法把独立的个人请求发给健康的后端?

在分布式系统中正确使用负载均衡会带来如下好处:

  • 命名抽象:客户端可以通过预定义的机制来寻址负载均衡器,而不是每个客户端都需要了解每个后端(服务发现),然后将名称解析的任务委托给负载均衡器。预定义的机制包括内置库和众所周知的DNS/IP/端口地址,后面会有详细的讨论。

  • 容错:通过健康检查和各种算法技术,负载均衡器的路由方法可以绕过坏的或者超负载的后端。这也意味着运维人员可以随时优先修复后端错误。

  • 低成本和高性能:分布式系统网络一致性比较差。系统可能会横跨不同的网络区域。在一个区域内,网络之间通常以相对小的带宽建立的。而在不同的区域之间,网络大带宽成为常态(带宽的大小是指通过NIC使用的带宽量占路由器之间可用带宽的百分比)。智能的负载均衡可以尽可能保持区域内的请求流量,从而提高性能(低延迟)并降低整体系统成本(减少区域间的带宽和光纤)。

L4(连接/会话)负载均衡

业界讨论负载均衡时,解决方式往往分为两类:L4 和 L7。指的是OSI模型的第四层和第七层。OSI模型包括传统的第四层协议(如TCP和UDP),还包含各种不同OSI层的协议。换句话说,如果 L4 TCP负载均衡器也支持 TLS 终止,这不就是 L7负载均衡器么?

网络负载均衡和代理技术_第1张图片


图2:TCP L4 终止负载平衡

图2展示了传统的L4 TCP负载均衡器。在这种情况下,客户端与负载均衡器建立TCP连接,负载均衡器终止连接(即直接响应SYN),选择一个后端,并与后端建立新的TCP连接(即发起新的SYN)。

本节的关键是L4负载均衡器通常只在 L4 TCP / UDP连接/会话上运行。因此,负载平衡器负责操作字节,并确保来自同一会话的字节转发到同一后端。L4负载平衡器并不知道通信中的任何应用细节。这些字节可能是 HTTP,Redis,MongoDB或任何其他应用协议。

L7(应用)负载均衡

 L4负载均衡简单,能看到广泛使用。人们为什么放弃L4负载均衡,来研究L7(应用)负载均衡?以下是L4具体的案例:

  • 两个gRPC / HTTP2 客户端通过L4负载均衡器与后端建立连接。

  • L4负载均衡器为每个接入的TCP连接建立一个传出的TCP连接,这样就产生了两个传入和两个传出连接。

  • 但是,客户端A每分钟发送 1个请求(RPM),而客户端B通每秒发送50个请求(RPS)。

在上述场景中,后端选择处理客户端B请求是选择客户端A请求负载的大约3000倍。这是一个很大的问题,打破了负载均衡的目的。需要注意的是这个问题发生在任何复用,保持存活状态的协议。(复用意味着通过单个L4连接多次发送应用程序请求,保持存活就是没有活动请求时不关闭连接)。出于效率的考虑,所有现代协议都在不断发展,既要复用也要存活(创建连接通常是昂贵的,特别是用TLS进行加密连接时),所以L4负载均衡器随着时间的推移,负载失衡的情况更加明显。这个问题在L7负载均衡器中得到解决。

网络负载均衡和代理技术_第2张图片

图3:HTTP / 2 L7终端负载均衡

图3展示了L7 HTTP/2负载平衡器。客户端与负载均衡器只建立一个 HTTP/2 TCP连接,连接两个后端。当客户端向负载均衡器发送两个HTTP/2 流时,流1被发送到后端1,流2被发送到后端2。因此,即使差别很大的请求负载的多路复用客户端也将被有效地平衡到不同的后端。这就是L7负载平衡对于现代协议的重要性所在。(L7负载平衡由于能够检查应用流量,而产生大量好处,后面会更详述)。


L7负载均衡和OSI模型

正如L4负载平衡部分所述,使用OSI模型描述负载均衡功能是有问题的。原因在于L7本身包含多个离散的负载均衡抽象层。例如,对于HTTP流量,请考虑以下子层:

  • 可选的传输层安全性(TLS)。网络界对于TLS 属于OSI模型哪一层有争论。为了方便,我们考虑将TLS放在 L7。

  • 物理HTTP协议(HTTP / 1或HTTP / 2)。

  • 逻辑HTTP协议(Header、Body 和 Trailer)

  • 消息传递协议(gRPC,REST等)。

一个复杂的L7负载均衡器要提供与上述每个子层有关的功能。另L7负载均衡器可能只有一小部分功能属于OSI模型中L7层。简而言之,L7负载平衡器的功能远比L4类型复杂得多。(HTTP、 Redis、Kafka、MongoDB等都是应用L7 协议的例子,它们受益于L7负载均衡)。


参考文献:
1.  https://mp.weixin.qq.com/s/LwmYMenIG77m8F_YaXqIAg

你可能感兴趣的:(负载均衡)