1. 问题的提出

负载平衡并不是一个很新的技术方向。硬件状态的负载均衡器至多曾经存在了二十年。在传统的硬件网络负载均衡器中,蕴含了比拟综合的性能。从协定的角度,蕴含了对TCP、UDP流量的反对,也蕴含了对HTTP、HTTPS等协定的解决。

而在大多数互联网公司中,广泛应用软件状态的负载均衡器,并且基于所解决的协定辨别为两种不同的零碎:
(1) 四层负载平衡,也被称为网络负载平衡,仅用于对TCP、UDP流量进行解决。四层负载平衡在转发中次要基于IP地址、端口等信息。四层负载平衡的开源软件包含LVS、DPVS、Katran等,代表了三种计划:Linux内核,DPDK,eBPF(Extended Berkeley Packet Filter)。

(2) 七层负载平衡,也被称为利用负载平衡,反对HTTP、HTTPS、SSL、TLS等协定的解决。七层负载平衡在转发中能够利用应用层的信息,如HTTP的申请头部,而这些信息对四层负载平衡来说是不可见的。七层负载平衡的开源软件包含Nginx、BFE、Traefik、Envoy、HAProxy等。

随着对于流量治理需要的晋升,七层负载平衡的重要性越来越高。很多公司都在增强七层负载平衡接入层的建设。而目前这方面的软件计划比拟多,应该如何选型呢?

2. 七层负载平衡的生态

七层负载平衡的性能要比四层负载平衡简单的多,独立研发十分艰难,个别都要依靠于一个弱小的生态能力倒退起来。
目前,在七层负载平衡畛域,有3个比拟弱小的生态:

(1) Nginx / OpenResty 生态

Nginx是一个应用十分宽泛的Web Server开源软件,起初也被用做反向代理。通过多年的倒退,在Nginx上积攒了大量的性能。为了解决Nginx性能开发成本高的问题,由章亦春在Nginx上减少了Lua执行模块,造成了OpenResty的生态。之后有一些软件基于OpenResty来开发,如APISIX。

(2) Envoy生态

Envoy最早由Lyft公司研发,起初Google也加入进来。与Nginx相比,Envoy做了一些调整和优化。Envoy最早被设计用于Service Mesh,作为sidecar网关。起初也逐渐用于其它七层负载平衡的应用场景。

(3) Go语言生态

Go语言具备开发成本低、安全性和稳定性高的特点,并且Go语言有大量的开源代码库,这使得一些公司选用Go语言来实现七层负载平衡,如:BFE,Traefik, MOSN等。

3. Service Proxy和API Gateway

在CNCF Landscape中,将七层负载平衡做了两个分类:Service Proxy和API Gateway。

这两个分类的出发点不同。Service Proxy偏重于流量的转发,API Gateway偏重于API生命周期的治理。从性能的角度,两个分类下的零碎有很多重合的性能,一些软件也同时具备Service Proxy和API Gateway的性能,软件所属的分类变得含糊。

其实分类没有那么重要,满足本人场景的需要才是更重要的。

4. 七层负载平衡软件选型的因素

4.1 可能的比照维度

在七层负载平衡软件的抉择上,可能思考的因素包含:

(1) 零碎的性能
一个零碎所能出现进去的性能,受到很多因素的影响(版本、环境、配置参数等等)。本文并不打算给出一个性能方面的比拟,大家能够搜寻一下网上给出的一些测试报告。

(2) 零碎所提供的性能
一个七层负载平衡包含了很多的性能。有一些性能是基础性的,如协定反对、健康检查、转发规定形容;有一些性能可能不是必须的,如流量的镜像、执行脚本语言的反对等。具体抉择哪些性能来比拟,要看具体的应用场景。因为篇幅所限,本文只比照了基础性的性能。

(3) 零碎所提供的扩大开发能力
因为七层负载平衡和业务有更严密的分割,扩大开发的需要很大。是否不便和疾速的进行扩大性能的开发,是七层负载平衡选型的重要考察点。

(4) 零碎的安全性和稳定性
七层负载平衡作为网络流量转发的要害零碎,安全性和稳定性是十分重要的因素。对于面向外网接入的场景,七层负载平衡间接面对大量潜在的攻击行为,安全性方面的思考必不可少。

(5) 零碎的可运维性
作为一个继续运行的在线零碎,七层负载平衡应该具备很好的可运维性。这方面可能包含零碎的可观测性和可监控性,可能很好的把握零碎的运行状态,及时发现零碎的异样;也包含在不停机状况下配置的加载能力,冀望可能不影响零碎的失常转发。

4.2 对于几个比照维度的探讨

在以上这些因素中,“性能”是最常被大家拿进去比拟的,仿佛这是最重要的因素。

尽管没有十分主观精确的比照数据,然而大略说来,基于C语言开发的Nginx和Envoy的性能根本是相当的。而它们的性能要比基于Go语言开发的BFE和Traefik要好很多。即便做了一些优化,基于Go语言零碎的性能可能只有C语言零碎的1/2,在某些极其场景下甚至只有1/4(须要阐明,目前体现进去的性能差距可能并不是齐全因为编程语言的起因,而是因为程序编写的问题)。

这么看,仿佛基于Go语言研发的七层负载平衡齐全没有存在的理由呀?!

在小规模的应用场景下,流量较小,性能差别所引发的服务器老本差别并不大,性能并不是一个决策的关键因素。

在大规模的应用场景下,流量较大,性能差别的确会导致服务器老本上较大的差别。但也须要留神到,在大规模场景下,也会有较多的二次开发需要。在这种状况下,不同编程语言所导致的研发效率和研发老本的差别会凸现进去(Go语言的研发效率是C语言的数倍)。在选型时,须要兼顾“硬件老本”、“人力老本”、研发速度等几方面的因素。

零碎的安全性和稳定性也是须要思考的。对于重要的业务,一次因稳定性问题导致的业务中断可能就会导致重大的经济损失(及商誉损失)。平安方面可能导致的问题同样十分重大,平安问题可能导致系统的解体,也可能导致敏感信息的泄露。这两方面的机会成本可能远大于负载平衡自身的硬件老本。

基于C语言开发的零碎在性能方面有相对的劣势,而基于Go语言开发的零碎在二次开发老本、研发速度和零碎的安全性、稳定性方面有更大的劣势。而零碎的性能和可运维性须要针对具体的零碎来具体比照。

4.3 小结

在七层负载平衡的3大生态间做抉择是十分艰巨的。从老本、效率、平安和稳定性这几个根底指标来看,目前没有任何计划是完满的。鱼和熊掌,不可兼得。到底抉择走哪条路,须要大家依据本人的场景,联合以上多个维度进行综合的思考。

5. 几种开源七层负载平衡软件的比照

上面对一些七层负载开源我的项目进行比照,包含:BFE/Nginx/Envoy/Traefik。

须要阐明的是,因为这些我的项目都在沉闷开发中,信息可能过期或有误,读者可通过这些开源我的项目的官方网站查看最新信息。

5.1 开源我的项目定位

在各开源我的项目的官网上对其定位形容如下。
(1) BFE: BFE是一个开源的七层负载平衡零碎。
(2) Nginx: Nginx是HTTP服务、反向代理服务、邮件代理服务和通用TCP/UDP代理服务。
(3) Envoy: Envoy是开源的边缘和服务代理,为云原生利用而设计。
(4) Traefik: Traefik是先进的HTTP反向代理和负载平衡。

5.2 性能比照

上面从零碎性能的角度对几个开源我的项目进行比照。
(1)协定反对。这四个零碎都反对HTTPS和HTTP/2, 并打算或正在开发反对HTTP/3。

(2)健康检查。

  • BFE和Nginx只反对“被动”模式的健康检查
  • Envoy反对被动、被动和混合模式的健康检查。
  • Traefik只反对“被动”模式的健康检查。

(3)实例级别负载平衡。这四个零碎都反对实例级别负载平衡。

(4)集群级别负载平衡。

  • BFE、Envoy、Traefik都反对集群级别负载平衡。
  • Nginx不反对集群级别负载平衡(指Nginx的开源版本。OpenResty提供了反对。)
    留神:Envoy基于全局及分布式负载平衡策略。

(5)对于转发规定的形容形式。

  • BFE基于条件表达式。(详见《BFE转发表的降级阐明》)
  • Nginx反对域名、Path的前缀匹配、准确匹配和正则表达式匹配(详见《BFE和Nginx有什么差别?- 转发模型的比照》)
  • Envoy反对基于域名、Path及Header的转发规定
  • Traefik反对基于申请内容的分流。

5.3 扩大开发能力

七层负载平衡有较多的定制扩大开发需要。上面从零碎扩大开发能力的角度对几个开源我的项目进行比照。
(1)应用的编程语言。

  • BFE和Traefik都基于Go语言开发。
  • Nginx应用C语言和Lua语言开发。
  • Envoy应用C++语言开发。

(2)可插拔架构。这四个零碎都应用了可插拔架构。

(3)新性能开发成本。因为编程语言的差异性,BFE和Traefik的开发成本较低,Nginx和Envoy的开发成本较高。

5.4 安全性和稳定性

(1)稳定性。
因为编程语言的差异性,BFE和Traefik能够对异样(在Go语言中称为Panic)进行捕捉解决,从而防止程序的异样完结; 而Nginx和Envoy无奈对内存等方面的谬误进行捕捉,这些谬误很容易导致程序解体。

(2)安全性
“缓冲区溢出”的威逼是C语言程序固有的问题,根本无法彻底解决。Go语言不存在这方面的问题(注:如果应用cgo调用,可能会引入这方面的问题)。Nginx中所应用的OpenSSL是一个经常出现安全性问题的模块,有趣味的敌人能够在百度中搜寻“HeartBleed破绽”;Envoy通过应用BoringSSL来缓解这方面的问题。

5.5 可运维性

可运维性对于零碎在正式生产环境的应用十分重要。上面从零碎可运维性的角度对几个开源我的项目进行比照。

(1)外部状态展现。

  • BFE对程序外部状态提供了丰盛的展现。
  • Nginx和Traefik提供的外部状态信息较少。
  • Envoy也提供了丰盛的外部状态展现。

(2)配置热加载。

  • 四个零碎都提供配置热加载性能。
  • Nginx配置失效需重启过程,并中断沉闷长连贯。
    需注意:Nginx商业版反对动静配置,在不重启过程的状况下热加载配置失效;一些基于OpenResty的软件也反对配置热加载。

6. 总结

七层负载平衡是十分重要的基础设施,如何抉择,关系重大。

性能并不是惟一的思考因素,也不存在在任何场景都实用的计划。须要联合应用场景的具体情况,从老本、性能、效率、平安和稳定性等多方面综合思考。