ECMP是一个逐跳的、基于流的负载均衡策略,当路由器发现同一目的地址出现多个最优路径时,会更新路由表,为此目的地址添加多条规则,对应于多个下一跳,且可同时利用这些路径转发数据,增加带宽。ECMP算法被多种路由协议支持,例如:OSPF、ISIS、EIGRP、BGP等。在数据中心架构VL2中也提到使用ECMP作为负载均衡算法[1]。
简单来说,ECMP是基于路由层面实现的负载均衡,基于IP层进行负载有许多优点,具体如下:
(1)部署配置简单,可以基于很多协议自身特性实现负载,无需额外配置。
(2)提供多种流量调度算法方式,可以基于哈希也可以基于权重和轮询方式。
简单的方式同时意味着存在许多缺陷,具体如下:
(1)可能加剧链路堵塞。因为ECMP不会判断原先链路是否已经堵塞,都会将流量进行负载,这样子会导致原先堵塞的链路更加堵塞。
(2)很多情况下负载效果不好。ECMP无法区分多条网络后的流量空闲情况以及ECMP在流量差距大的情况下负载性能差。
这种基于网络三层的负载方式虽然易于使用和部署,但是无法满足业务层面的使用,无法保持会话,故下面笔者会介绍几种网络四层以上的负载方式。
LVS(linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。最后根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,LVS工作模式分为NAT模式、TUN模式、以及DR模式【2】。
与ECMP不同的是LVS是基于会话的四层负载均衡,LVS会基于上下行五元组对不同的流进行会话保持,再结合LVS的长期发展,LVS具有非常多的优势:
(1)抗负载能力强。LVS只在网络四层做分发,不会过多的消耗CPU和内存资源。
(2)配置要求低。简单配置就能够正常使用。
(3)健壮性强。发展时间长,业内的部署方案非常多,稳定性高。
于此同时,LVS也存在许多不足:
(1)功能不够丰富。配置简单的同时导致LVS缺少更多的功能,缺少故障迁移,添加恢复等功能。
(2)NAT模式性能受限,当然这也是很多四层负载所面临的问题,笔者会在后续提出思考。
NIGINX除了作为一个高性能的HTTP服务器,同时能够提供反向代理WBE服务器的功能,也就意味着部署NGINX作为一台负载均衡服务器是可行的。当然,业内已经非常广泛的在使用NGINX作为负载均衡服务器,服务集群,主备链路等。
NGINX和LVS类似,都是基于四层以上的负载均衡,能够保持会话。同时因为NGINX工作在网络七层,相比LVS负载,NGINX对网络的依赖会更小。
相比LVS负载均衡,NGINX具有如下优势:
(1)对网络依赖小。只要网络能通就能做负载,不像LVS部分模式需要特定的网络环境。
(2)安装简单,配置部署快。
(3)NIGINX负载可以检测到服务器内部故障。简单来说,上传文件时发生故障,NIGINX会自动将上传切到另一台负载设备处理,LVS无法如此使用。
同样的,NGINX也存在一些缺点:
(1)缺少双机热备方案,多数情况下单机部署存在一定风险。(2)功能调整度高,变相导致它的维护成本和难度高于LVS。
综合以上几种常见的负载技术的优缺点,其实不难发现各有各的好处,然而在实际使用过程中,笔者发现这几种方式都很难满足高性能跨网负载,即在做FULL-NAT的前提下实现跨城域网的负载,简单来说,就是在实验多节点云化部署时,这些方案都存在一定的性能贫瘠。
基于此,经过查阅相关资料,笔者发现Cisco开源的VPP项目提供了一种高性能负载均衡器的方式,基于DPDK收发包,VPP的高性能处理,经过二次开发可以实现跨网高性能负载,目前已经取得一定成效。下一期将针对这种高性能四层跨网负载均衡技术展开介绍和讨论。
未来,智慧家庭运营中心会在实现高性能跨网负载均衡器上进行更多的研究,欢迎更多的开发架构人员投入到高性能跨网负载均衡器的功能开发和场景探究之中来。