负载均衡为什么要“四七层分离”
在互联网公司,负载均衡的“四七层分离”是一个已经使用了十多年的解决方案和最佳实践。但是在很多企业中,仍然还在使用“四七层一体”的方案。本文谈谈负载均衡为什么要“四七层分离”。
1. 什么是四层和七层
四层负载均衡,也被称为网络负载均衡,仅用于对TCP、UDP流量进行处理。四层负载均衡在转发中主要基于IP地址、端口等信息。四层负载均衡的开源软件包括LVS、DPVS等。
七层负载均衡,也被称为应用负载均衡,支持HTTP、HTTPS、SSL、TLS等协议的处理。七层负载均衡在转发中可以利用应用层的信息(如HTTP的请求头部),而这些信息对四层负载均衡来说是不可见的。七层负载均衡的开源软件包括Nginx、BFE、Traefik、Envoy等。
2. 四七层的使用现状
在传统的硬件网络负载均衡器中,包含了比较综合的功能。从协议的角度,包含了对TCP、UDP流量的支持,也包含了对HTTP、HTTPS等协议的处理。
而在大多数互联网公司中,普遍使用软件形态的负载均衡器,并且将四层负载均衡和七层负载均衡分为两种不同的系统来实现和部署。
图1 四层负载均衡软件和七层负载均衡软件混合使用的场景
图1中以百度的BGW和BFE为例,展示了四层负载均衡软件和七层负载均衡软件分离实现和部署的场景(注:以下内容来自《万亿级流量转发:BFE核心技术与实现》)。
BGW和交换机的互连。BGW通过BGP或OSPF路由协议和上游的交换机进行路由交互。交换机使用ECMP(Equal-Cost Multi-Path routing,等价路由)机制,将流量哈希分发到多个BGW实例。
对于某个VS(Virtual Server,虚拟服务器,由IP地址、协议、端口来标示),所有的BGW实例都可以接收和处理其流量。通过这种方式,实现了BGW的分布式容错,在单个BGW实例故障的情况下,BGW集群仍能继续处理流量转发。
BGW和后端服务的互连。每个BGW实例按照轮询调度(Round Robin)或设定的其他策略,将流量转发给后端的RS(Real Server,真实服务器)。
BGW和BFE的互连。在使用七层负载均衡的场景中,BGW把BFE当作RS,将发往某个VS的流量转发给后端的BFE实例。在BFE实例出现故障的情况下,BGW可以将有故障的BFE实例自动摘除。
BFE和后端服务的互连。每个BFE实例按照轮询调度或设定的其他策略,将流量转发给后端的RS。
3. 四七层分离的原因
负载均衡“四七层分离”主要原因是四层负载均衡和七层负载均衡的使用场景存在较大差异,对于两者适合使用不同的技术栈来实现。
四层负载均衡软件需要很高的处理能力,以达到较高的性价比,并用于抵御来自外网的DDoS攻击。上面提到的BGW软件使用C语言并基于DPDK技术研发,在单台x86服务器上可以处理50Gb/s网络流量,每秒可以处理的新建连接超过100万个。要获得更高的性能,就需要软件的整体逻辑比较简单,并且没有高资源消耗的功能。同时,因为性能和稳定性方面的高要求,这样的软件其新功能研发的成本也比较高,开发新功能及变更上线的周期比较长。
七层负载均衡软件,功能比较复杂,并且需要不断增加新的功能。七层负载均衡软件可以“看到”应用层的信息,功能的空间比四层负载均衡软件要大很多。由于它更贴近业务,也会不断收到来自业务的需求,需要不断地开发出新的功能特性;由于互联网业务的特性,需要更快的开发和上线速度。七层负载均衡软件对于性能方面的要求比四层负载均衡软件要低,从带宽吞吐方面二者几乎差距一个量级。无论是OpenResty在Nginx的基础上引入Lua语言,还是BFE使用Go语言,都是为了获得更高的研发效率,从而满足业务对于七层负载均衡在功能快速迭代方面的需求。
4. 总结
“在特定的场景,使用专用系统来替代通用系统”,这是互联网企业不断技术升级的一个基本方法论。通用系统什么都能做,但反过来什么都做不好。通过功能的细分和系统的专业化,专用系统会取得比通用系统更好的效果。
“四七层分离”是以上原则和方法论在负载均衡领域在再次印证。负载均衡的“四七层分离”已经在互联网公司普遍落地多年,也会在更多的公司落地。在很多企业中,传统的硬件网络负载均衡器已经退化为四层负载均衡器,七层功能已经被Nginx、BFE等开源软件承担。而硬件四层负载均衡器也正在被软件所取代。关于负载均衡的软件化趋势将在后面的文章中分享。
欢迎关注“BFE开源项目”微信公众号,获得本项目的更多信息。谢谢!