LoadBalancing负载均衡是云计算的基本组成部分,是网络流量的入口。它的重要性不言而喻。什么是负载均衡?用户输入的流量经过负载均衡器,按照一定的负载均衡算法将流量平均分配给多个后端服务器。接收到请求的服务器可以独立响应请求,达到负载分担的目的。从应用场景来看,常见的负载均衡模型有全局负载均衡和集群内负载均衡。从产品形态来看,可分为硬件负载均衡和软件负载均衡。全局负载均衡一般通过DNS来实现,通过将一个域名解析到不同的VIP来实现不同区域的调度能力;常见的硬件负载均衡器有F***10和Array,它们的优缺点都很明显。优点是功能强大,有专门的售后服务团队,性能比较好。缺点是缺乏定制的灵活性,维护成本高;现在网上更多的想法都是通过软件负载均衡来实现的,可以满足各种定制需求,常见的软件负载均衡有LVS、Nginx、Haproxy。我们的高性能负载均衡使用了LVS和Tengine来区分一个区域的不同机房。每个机房有一个LVS集群和一个Tengine集群。对于用户配置的四层监控,用户ECS会直接挂载在LVS后面,七层用户监控ECS挂载在Tengine上,四层监控的流量直接从LVS转发到ECS,而七层监控的流量会通过LVS到Tenigine,再到用户的ECS。每个地域有多个可用区,达到主备容灾的目的。每个集群有多台设备,第一是为了提高性能,第二也是基于容灾的考虑。上图是高性能负载均衡控制管理的概览。SLB产品也有SDN的概念。转发和控制是分开的。所有用户配置首先通过控制台到达控制器,通过控制器集中转换将用户配置推送到不同的设备。每个设备都有一个Agent,接收控制器下发的需求,并在本地转换成LVS和Tengine可以识别的配置。该过程支持热配置,不影响用户转发,无需重新加载即可使新配置生效。LVS1。LVS支持的三种模式早期的LVS支持三种模式,DR模式、TUN模式和NAT模式。DR模式通过LVS后,LVS会改变MAC地址并封装MAC头,内层IP包不会改变。数据包通过LVS负载均衡找到RS后,会将源MAC头改为自己的,目的MAC改为RS。地址和MAC编址在二层网络中,对网络部署有一定的限制。在大规模分布式集群部署中,这种模式的灵活性不能满足需求;TUN模式在LVS之后,LVS会在原有报文的基础上封装IP头。到达后端RS后,RS需要对IP报文进行解包,得到原始报文。无论是DR模式还是TUN模式,后端RS都能看到真实的客户源IP,目的IP是自己的VIP,需要在RS设备上配置,这样可以直接绕过LVS返回给用户。TUN模式的问题是需要在后端ECS上配置解封装模块。Linux已经支持此模块。不过Windows暂时还不提供支持,所以对用户系统镜像的选择有限制。NAT方式的用户访问VIP。LVS搜索完成后,会通过DNAT转换目的IP,选择RS地址。因为客户端的IP没有变化,所以回包的时候会直接路由到公网真实的客户端IP。NAT的约束是LVS做了DNAT转换,所以返回的包需要经过LVS将包头转换回来。由于ECS看到的是客户端的真实源地址,所以我们需要在用户ECS上配置路由,将默认的ECS路由指向LVS,这也限制了用户使用场景。2、LVS是基于Netfilter框架实现的。Netfilter是Linux提供的开放网络平台。基于该平台,您可以开发自己的业务功能模块。早期很多安全厂商基于Netfilter实现了一些商业模式。这种模型比较灵活,但是在一般模型中更多的是兼容性,路径会很长;并且无法利用通用模型中的多核功能。目前CPU的发展更多的是横向扩展。我们经常看到多通道服务器。每个通道有多少个核心?该模型对多核支持不是特别友好,在多核设计上存在一些不足,导致我们在通用模型上做一些应用开发时扩展性有限。随着核心数量的增加,性能不增反减。3.LVS的改进早期模型的各种限制限制了我们的发展,所以我们先做了FullNAT,比原来的NAT方式多了SNAT属性,把客户端原来的IP地址进行了转换;其次,我们做了Parallelization,充分利用多核实现线性性能提升;然后是快速路径。我们在做网络转发模型的时候,很容易想到设计一条快路径和一条慢路径。慢速路径更多的是关于如何传递第一个数据包。对于设备问题,可能需要查看ACL或者路由,需要判断很多策略相关的东西。所有后续消息都可以通过快速路径转发;还有指令相关的优化,使用Intel特殊指令提升性能;另外,对于多核架构,NUMA多节点内存访问,通过访问本地节点内存可能会获得更好的延迟性能。客户端进来时,IP首先访问LVS的VIP。原始IP属于客户端,目的IP为LVS的VIP。FullNAT转换后,原来的IP变成了LVS的本地地址,目的地址是LVS选择的RS地址。退回数据包相对容易。只要路由可达,包就会被送到LVS,不需要在RS上做任何特殊配置。右边是DNAT+SNAT转换,报文可以通过LVS转发回客户端。这种方式主要带来应用场景部署的灵活性。LVS的性能可以通过并行化来提高。没有办法线性提高性能。更多的是因为每条路径都需要访问全局资源,必然会引入锁拆箱。另外,同一链路上的数据包可能会分散在不同的核上,当所有人访问全局资源时,也会造成缓存丢失。因此,我们采用RSS技术,将相同的五源组消息丢给同一个CPU处理,保证入站方向同一个连接上的所有消息都可以交给同一个CPU处理,并且每一个core使用当前CPU上的本地地址,通过设置一些fdir规则,消息返回时后端RS访问的目的地址是对应CPU上的本地地址,可以交给指定的CPU处理,这样一个连接的左右方向的消息就可以被处理了。交给同一个CPU处理,隔离不同CPU上的流。另外,我们在每个CPU上复制了包括动态缓存资源在内的所有配置资源,将资源本地化,这样整个流程访问的资源从进入LVS到转发出去,都是固定在一个核上的本地资源,使得性能最大化和实现线性改善。经过我们的改进,LVS的具体表现如下:为了容灾和性能提升,我们实现了集群部署,每个区域有不同的机房,每个机房有多个调度单元。一台LVS设备;经过优化后,每个LVS都可以实现更高的性能和大容量。单个LVS可达4000WPPS,600WCPS,单个group可达亿并发;支持区域、IDC、集群和应用级别的高可用;实现了反***功能,在原有的LVS上提供了更丰富的功能,可以基于各个维度进行管理控制,更准确的统计,流量分析等。TengineTengine在应用过程中也遇到了各种问题,最严重的是性能问题,我们发现随着CPU数量的增加,QPS值并没有线性增加;Nginx本身是multi-worker模型,每个worker是单进程模式,multi-worker架构CPU亲和,内部事件驱动模型,已经提供了高性能,单核Nginx可以跑到1W5~2WQPS.Nginx底层是socketAPI,socket下面还有一层VFS,然后是TCP和IP。套接字层比较薄。经过量化分析评估,TCP协议栈和VFS部分开销最大,因为同步开销比较大,我们发现水平扩展不可行,为此我们做了一些优化。七层反向代理的路径更长,处理更复杂,因此其性能远低于LVS。我们更关注单机和集群的性能。集群性能可以通过堆叠设备来解决。如果单机不提升,成本会不断增加,从性能上看,有以下优化思路和方向:基于Kernel开发,比如优化协议栈;基于Aliscoket的优化,Alisocket是阿里自研的高性能TCP协议栈平台,底层是DPDK,使得资源本地化处理,消息分发由不同的核处理,性能非常好;HTTPS业务越来越多,流量也在逐渐增加。我们使用硬件加速卡来提高部分加解密、HTTPS会话复用的性能;基于网络传输层的性能优化。从弹性的角度来说,比如一些公司的应用是和用户热点相关的。当社交网络热点出现时,访问量会急剧增加。我们固有的基于物理机的负载均衡模型在弹性扩展方面是有限的。这方面我们可以用VM来做,将反向代理功能放在VM中运行,我们会监控实例负载,根据实时需要做弹性扩缩容;除了VM,还有一个调度单元,我们可以在不同的调度单元之间进行平滑的切换。根据不同的水位,负载均衡实例可以通过切换的方式调度到不同的单元,提高容量管理。Tengine本身也做过集群部署。我们在一个区域有不同的机房和不同的调度单元。每个调度单元有多套设备;LVS到Tengine也有健康检查。如果Tengine有问题,就可以通过健康检查。去掉check方法不会影响用户的转发能力;Tengine具有灵活的调度能力,可以帮助我们处理更复杂的情况;此外,Tengine还有很多高级特性,例如基于cookie的会话持久化和基于域名/URL的转发规则、HTTP2、Websocket等功能;目前我们的7层单VIP可以支持10WHTTPSQPS。高可用1.Group高可用是整个产品的重要组成部分。图为集群中的高可用架构。可以看出网络路径上没有单点冗余。具体情况如下:双向服务器,每个节点上的两个网口连接到不同的交换机上,以增加带宽,避免跨节点接收数据包。VIP路由在两侧发送不同的优先级。不同的VIP和高优先级的路由在不同的交换机上以160G转发。容量,单VIP80G带宽,单流40G带宽网卡故障不影响转发,上下游路由自动切换ECMP,VIP路由双向发送,通过优先级控制从ingress集群640G转发能力,单VIP320G带宽session同步、组播、Packettrigger同步和定时同步单机失败不影响转发。交换机故障不影响转发。路由在几秒钟内切换。用户感知不到升级和变化,一些没有及时同步的连接可以重连。2、AZ的每个机房分别连接两个不同的路由器。当一个AZ出现故障时,我们可以无缝切换到另一个机房。具体如下:VIP在不同AZ发送不同优先级的路由(秒级切换,自动切换)VIP区分主备AZ。备AZ中不同多个AZ的负载通过控制系统进行分配。默认不支持VIP和多AZ的容灾能力。不支持跨可用区的会话同步。切换AZ后,需要重新连接所有连接。3.Region用户访问域名时,通过DNS解析,可以设置DNS解析到多个regionVIP地址,下沉到某个Region。如果一个机房出现故障,可以将流量切换到另一个可用区继续转发。如果流量进入机房,发现一个LVS转发设备出现故障,我们可以切换到另一个LVS进行处理。如果LVS后面挂载的RS出现问题,可以通过健康检查快速移除设备,将流量切换到健康的设备上。我们从多个维度实现高可用,最大程度满足用户的需求。总结一下,高性能负载均衡的应用主要有几个方面:作为公有云的基础组件,为公有云网站、游戏客户端、APP提供负载均衡功能,同时也为公有云提供专有云支持。政府、金融等高安全性客户。;为阿里云内部云产品RDS、OSS、Anti-Defense等提供负载均衡功能;负载均衡作为电商平台的入口,为淘宝、天猫、1688提供VIP统一接入功能;交易平台的流量入口也在负载均衡设备上,比如支付宝、网银等。未来希望有更好的弹性扩展能力和更高的单机处理能力。我们希望VIP主动检测用户,监控全网链路。
