本文原作者为Matt Klein,为envoy的工程师。发表于2017年12月。因原文英文写作和其它原因,本人觉得有必要分享。但翻译后期发现该文已于2018年1月被人翻译。思考再三,决定发布自己的翻译版本。原文较长,我分为三个部分便于大家阅读。此为第二篇

L4负载均衡当前技术

L4负载均衡器是否仍然重要?

前文提到,L7负载均衡器对于现代协议的重要性,随后会进一步详细介绍L7负载均衡器功能。这是否意味着L4负载均衡器无需关注?自然不是!虽然在我看来L7负载平衡器最终将完全取代L4负载平衡器以进行服务到服务通信,但L4负载均衡器在边界部署仍然非常重要,因为几乎所有现代大型分布式架构都使用双层L4 / L7负载均衡架构用于互联网流量管理。在边界部署中L7负载均衡器的前端部署L4负载均衡器的好处是:

  • L7负载均衡器对应用程序流量执行更复杂的分析、转换和路由,它们能够处理原始数据流负载(以每秒分组和每秒字节为单位测量)要比优化后L4负载均衡器要少。如此看来,L4负载平衡器能够更好地处理某些类型的DoS×××。(例如,SYN泛洪,通用数据包泛洪×××等)
  • L7负载均衡器由于敏捷开发,持续部署,比L4负载均衡器更容易产生BUG。在L7前端部署L4负载均衡器,可以在L7负载均衡器部署期间进行健康检查和流量接管。这比现代L4负载均衡器使用的部署机制要容易得多。现代L4负载均衡器通常使用BGP和ECMP(下面将详细介绍)
  • 最后,因为L7负载平衡器更容易出现错误,纯粹是由于其功能的复杂性。而L4负载均衡器可以规避这些故障和异常可以使整个系统更加稳定。
    在下面的部分中,我将介绍中/边界代理L4负载平衡器的几种不同设计。以下设计通常不适用于客户端库和挎斗车代理拓扑。

TCP / UDP终端负载均衡器

网络负载均衡和代理技术2_第1张图片
图8:L4终端负载均衡器

    如图8所示。这与我们在上面的L4负载均衡介绍中看到的负载均衡器相同。在这种类型的负载均衡器中,使用两个离散的TCP连接:一个在客户端和负载均衡器之间,另一个在负载均衡器和后端之间。即C<->LB LB<->B

L4终端负载均衡器仍然使用有两个原因:

  • 它们实施起来相对简单。
  • 与客户端更近的(低延迟)终端连接(译注:可能为中断重连)具有显著的性能影响。如果终端负载均衡器可以尽量靠近使用有损网络(例如,蜂窝网络)的客户端放置(译注:理解为客户端-负载间网络质量非常差)则在数据被传输到可靠光纤传输到其最终位置之前(译注:假设负载-后端网络质量较好),重传可能更快发生。换句话说,这种类型的负载均衡器可以用于原始TCP连接终端的入网点(Point of Presence,POP)场景中使用。

    TCP / UDP直连负载均衡器

    网络负载均衡和代理技术2_第2张图片
    图9:L4直通负载均衡器

    如图9所示。在这种类型的负载均衡器中,负载均衡器不会(译注:至少为不会主动终止)终止TCP连接。相反,在发生连接跟踪和网络地址转换(NAT)之后,每个连接的数据包将转发到选定的后端。首先,解释一下连接跟踪和NAT:

    1. 连接检测:跟踪所有活动TCP连接状态的过程。这包括诸如握手是否已完成,是否已收到FIN,连接已空闲多长时间,已为连接选择了哪个后端等信息。
    2. NAT:NAT是在数据包通过负载均衡器时,使用连接跟踪获取的数据来改变IP或端口信息的过程。
      使用连接跟踪和NAT,负载均衡器让大多数从客户端发起的原始TCP流量直接进入后端。例如,假设客户端正在与之通信(负载目标地址:端口为1.2.3.4:80)并且所选择的后端(地址:端口为10.0.0.2:9000)。客户端TCP数据包首先达到达负载均衡器1.2.3.4:80。然后,负载均衡器将NAT数据包的目标IP和端口修改为10.0.0.2:9000。负载均衡将交换原始数据包的源IP和端口和负载均衡器的IP和端口。因此,当后端响应TCP连接时,数据包将返回到负载均衡器,在负载均衡器中进行连接检测,NAT可以在相反方向再次发生。
      为什么会使用这种类型的负载均衡器来代替上一节中描述的终端负载均衡器,因为它更复杂?原因如下:
  • 性能和资源使用情况:由于直连负载均衡器不会终止TCP连接,因此它们不需要缓冲任何TCP连接窗口。存储每个连接状态的数据量非常小,通过有效的哈希表查找来访问。因此,直连负载均衡器通常可以处理比终端负载均衡器大得多的活跃连接数和每秒数据包数(packets per second,PPS)。(译注:高并发处理能力
  • 允许后端执行自定义拥塞控制:TCP拥塞控制是Internet上主机限制发送数据,以便不会阻塞可用带宽和缓冲区的机制。由于直连接负载均衡器不会终止TCP连接,因此它不参与拥塞控制。这将允许后端根据其应用实例使用不同的拥塞控制算法。它还允许更容易地对拥塞控制变化进行调整(例如,优化型拥塞算法BBR。译注:科学上网的童鞋应该了解)。
  • 形成直接服务器返回(DSR)和集群L4负载均衡的基线:更高级的L4负载均衡技术(例如DSR和具有分布式一致性哈希的集群)需要直连负载平衡(在以下部分中讨论)。

    直接服务器返回(DSR)

    网络负载均衡和代理技术2_第3张图片
    图10:L4直接服务器返回(DSR)
    直接服务器返回(DSR)负载均衡器如图10所示。DSR( Direct Server Return)构建在上一节中描述的直连负载均衡器上。DSR是一种优化,其中只有入口/请求数据包通过负载均衡器。出口/响应数据包未经过负载均衡器由后端直接返回客户端。使用DSR的主要原因是:在许多工作负载中,响应流量远远大于请求流量(例如,典型的HTTP请求/响应模式)。假设10%的流量来自请求流量,那么90%的流量则是响应流量,DSR使用1/10的负载均衡器流量可以满足系统的需要。鉴于硬件负载均衡器非常昂贵(如F5系列产品),因此这种类型的优化会对系统成本和可靠性产生重大影响。DSR负载均衡器扩展了直连负载均衡器的理念,具体如下:

  • 负载均衡器通常仍执行部分连接检测。由于响应数据包不会经过负载均衡器,因此负载均衡器将不会知道完整的TCP连接状态。但是,负载均衡器可以通过查看客户端数据包和使用各种类型的空闲超时来推断状态。
  • 负载均衡器通常使用通用路由封装(Generic Routing Encapsulation GRE)来封装从负载均衡器发送到后端的IP数据包,而不是NAT 。因此,当后端接收到封装的数据包时,它可以对其进行解包并知道客户端的原始IP地址和TCP端口。这允许后端直接响应客户端,而响应数据包不再经过负载均衡器。
  • DSR负载均衡器的一个重要概念是由后端参与负载均衡。后端需要具有正确配置的GRE隧道,并且根据网络设置的底层细节可能需要其自己的完成连接检测,NAT等。

基于高可用性对的容错技术

网络负载均衡和代理技术2_第4张图片
图11:通过HA对和连接跟踪的L4容错

之前,我们一直在考虑单独设计L4负载平衡器。passthrough(直通)和DSR负载均衡器都需要在负载均衡器本身中进行一定量的连接检测和状态检查。如果负载均衡器本身宕机怎么办?如果负载均衡器的单实例宕机,负载均衡器的所有连接将会中断。就应用来讲,这可能会对应用程序性能产生重大影响。
历史上,L4负载均衡器是从传统供应商(Cisco,Juniper,F5等)购买的硬件设备。这些设备非常昂贵并且处理大量流量。为了避免单个负载均衡器故障切断所有连接并导致严重的业务中断,负载均衡器需要部署在高可用性(HA)模式中,如图11所示。典型的HA负载均衡器设置具有如下设计:

  • 一对HA边界路由器服务于一定数量的虚拟IP(virtual IP VIP)。这些边界路由器使用边界网关协议(BGP)发布VIP 。主边界路由器的BGP权重高于备份,因此在稳定状态下,它为所有流量提供服务。(BGP是一个极其复杂的协议;出于本文的目的,只考虑BGP是一种机制,通过该机制,网络设备宣布它们可用于从其他网络设备获取流量,并且每个链路具有优先级链路流量权重)。
  • 类似地,主L4负载均衡器比备份负载均衡器拥有更高BGP权重,向边界主路由器发布自己,因此在稳定状态下它正在为所有流量服务。
  • 主负载均衡器交叉连接到备用负载均衡器,并共享其所有连接检测状态。因此,一旦主负载无响应,则备用可以立刻接管并处理所有活动连接。
  • 两个边界路由器和两个负载均衡器都是交叉连接的。这意味着如果其中一个边界路由器或其中一个负载均衡器宕机,或者由于某些其他原因而降低BGP权重,则备份可以接管所有流量。
    许多高流量的互联网应用如今也是按照上面的设置运行的。但是,上述方法存在很大的缺点:
  • 考虑到资源使用率,必须在HA负载均衡器对(主备)之间正确共享VIP。如果单个VIP增长超出单个高可用对的处理能力,则VIP需要分割成多个VIP。
  • 系统的资源利用率很低。50%的资源处于闲置状态。因HA为主备模式,鉴于硬件负载均衡器非常昂贵,造成资源浪费。
  • 现代分布式系统设计比主动/备份提供更好的容错能力。例如,理想业务架构中,系统应该能够遭受多个同时发生的故障并继续运行。如果主和备份负载均衡器同时宕机,则HA负载均衡器发生完全故障。
  • 供应商提供的硬件设备非常昂贵,导致用户被供应商绑定。异构产品不兼容(产品更新换代迁移困难)设备可替换变差。用户通常希望使用商业通用计算服务器(译注:商业通用服务器应该是大家常见的PC SERVER)构建的水平扩展软件解决方案来替换这些硬件设备。

    通过分布式一性哈希集群实现冗余和扩展

网络负载均衡和代理技术2_第5张图片
图12:通过集群负载均衡器和一致性散列的L4容错和扩展(缩放)

大型互联网基础设施开始设计和部署新的大规模并行L4负载平衡系统,如图12所示。这些系统的目标是:

  • 减轻上一节中描述的HA设计的所有缺点。
  • 从供货商的专有硬件负载均衡器转向使用标准计算服务器和NIC构建的商业软件解决方案。(降成本)
    此L4负载均衡器设计称为通过群集和分布式一致性哈希的冗余和扩展。它的工作原理如下:
  • N个边界路由器以相同的BGP权重宣布所有任播(Anycast) VIP。等价多路径路由(Equal-cost multi-path routing ECMP)用于确保通常来自单个流的所有分组到达相同的边界路由器。流通常是源IP /端口和目标IP /端口的4元组。(简而言之,ECMP是一种使用一致哈希在一组相同加权的网络链路上分发数据包的方法)。尽管边界路由器本身并不特别关心哪些分组到达哪里,但是通常优选的是来自流的所有分组都经过同一组链路,以便避免成为性能降低的无序分组。
  • N个L4负载均衡器以与边界路由器以相同的BGP权重通告所有VIP。再次使用ECMP,边界路由器通常会为数据流选择相同的负载均衡器。
  • 每个L4负载均衡器通常会执行部分连接检测,然后使用一致性哈希来选择数据流的后端。GRE用于封装从负载均衡器发送到后端的数据包。
  • 然后,DSR用于通过边界路由器将数据包直接从后端发送到客户端。
  • L4负载均衡器使用的实际一致性哈希算法是一个热门的研究领域。这些算法在平衡负载、最小化延迟、最小化后端变更时造成中断的时间以及最小化内存开销等方面进行了一些权衡。对此主题的完整讨论超出了本文的范围。
    让我们看看上述设计如何减轻HA对方法的所有缺点:
  • 可以根据需要添加新的边界路由器和负载均衡器。每次添加新的机器时,在每一层使用一致的哈希来尽可能减少受影响的流的数量。
  • 系统的资源使用可以根据需要运行,同时保持足够的突发情况导致的资源不足和冗余。
  • 边界路由器和负载均衡器现在都可以使用商用硬件(译注:商业通用服务器)构建,而成本只是传统硬件负载平衡器价格的一半都不到。(下面将详细介绍)。
    通常被问到这个设计的一个问题是“边界路由器为什么不通过ECMP直接与后端通信?为什么我们需要负载均衡器?“其原因主要是围绕缓解DoS×××和后端性能压力。如果没有负载均衡器,每个后端都必须参与BGP,并且执行滚动部署的难度要大得多。
    所有现代L4负载均衡系统都在朝着这种设计(或其某些变体)发展。最著名的两个例子是Google的Maglev和亚马逊的网络负载均衡器(NLB Network Load Balancer)。目前没有任何OSS负载均衡器可以实现这种设计,但是,我知道有一家公司计划在2018年发布一款使用这种设计的面向OSS的负载均衡器。我对这个产品非常期待。因为现代L4负载均衡器是OSS在网络领域非常重要的一块缺失。

未完,待续

网络负载均衡和代理技术2