`

高性能负载均衡设计与实现

 
阅读更多

摘要: 2017阿里云网络技术高峰论坛在线技术峰会,阿里云卫峥带来题为高性能负载均衡设计与实现的演讲。本文主要从早期的负载均衡开始谈起,进而讲解了高性能负载均衡,着重分析了LVS和Tengine,以及如何做到高可用,最后作了简要总结。

 

以下是精彩内容整理:

负载均衡

负载均衡是云计算的基础组件,是网络流量的入口,其重要性不言而喻。

什么是负载均衡呢?用户输入的流量通过负载均衡器按照某种负载均衡算法把流量均匀的分散到后端的多个服务器上,接收到请求的服务器可以独立的响应请求,达到负载分担的目的。从应用场景上来说,常见的负载均衡模型有全局负载均衡和集群内负载均衡,从产品形态角度来说,又可以分为硬件负载均衡和软件负载均衡。全局负载均衡一般通过DNS实现,通过将一个域名解析到不同VIP,来实现不同的region调度能力;硬件负载均衡器常见的有F5、A10、Array,它们的优缺点都比较明显,优点是功能强大,有专门的售后服务团队,性能比较好,缺点是缺少定制的灵活性,维护成本较高;现在的互联网更多的思路是通过软件负载均衡来实现,这样可以满足各种定制化需求,常见的软件负载均衡有LVS、Nginx、Haproxy。

 

 

阿里云高性能负载均衡使用LVS和Tengine,我们在一个region区分不同的机房,每个机房都有LVS集群和Tengine集群,对于用户配置的四层监听,LVS后面会直接挂载用户ECS,七层用户监听ECS则挂载在Tengine上,四层监听的流量直接由LVS转发到ECS,而7层监听的流量会经过LVS到Tenigine再到用户ECS。每一个region里都会有多个可用区,达到主备容灾目的,每一个集群里都有多台设备,第一是为了提升性能,第二也是基于容灾考虑。

 

 

图为高性能负载均衡控制管理概要图,SLB产品也有SDN概念,转发和控制是分离的,用户所有配置通过控制台先到控制器,通过集中控制器转换将用户配置推送到不同设备上,每台设备上都有Agent接收控制器下发的需求,通过本地转换成LVS和Tengine能够识别的配置,这个过程支持热配置,不影响用户转发,不需要reload才能使新配置生效。

 

LVS

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,VIP在RS设备上需要配置,这样可以直接绕过LVS返回给用户,TUN模式问题在于需要在后端ECS上配置解封装模块,在Linux上已经支持这种模块,但是windows上还没有提供支持,所以会对用户系统镜像选择有限定。NAT模式用户访问的是VIP,LVS查找完后会将目的IP做DNAT转换,选择出RS地址,因为客户端的IP没变,在回包的时候直接向公网真实客户端IP去路由,NAT的约束是因为LVS做了DNAT转换,所以回包需要走LVS,把报文头转换回去,由于ECS看到的是客户端真实的源地址,我们需要在用户ECS上配置路由,将到ECS的默认路由指向LVS上,这对用户场景也做了限制。

LVS基于Netfilter框架实现

 

 

Netfilter是Linux提供的网络开放平台,基于平台可以开发自己的业务功能模块,早期好多安全厂商都是基于Netfilter做一些业务模型实现,这种模型比较灵活,但通用模型里更多的是兼容性考虑,路径会非常长;而且通用模型中没办法发挥多核特性,目前CPU的发展更多是向横向扩展,我们经常见到多路服务器,每路上有多少核,早期通用模型对多核支持并不是特别友善,在多核设计上有些欠缺,导致我们在通用模型上做一些应用开发时的扩展性是有限的,随着核的数量越来越多,性能不增反降。

LVS的改进

 

 

早期模式的各种限制制约了我们的发展,所以我们首先做了FullNAT,相比原来的NAT方式,FullNAT多了SNAT属性,将客户端的原IP地址作了转换;其次,我们在并行化上做了处理,充分利用多核实现性能线性提升;然后是快速路径,我们在做网络转发模型时很容易想到设计快速路径和慢速路径,慢速路径更多是解决首包如何通过设备问题,可能需要查ACL或路由,需要判断许多和策略相关的东西,后面所有报文都可以通过快速路径转发出去;还有指令相关优化,利用因特尔特殊指令提升性能;另外针对多核架构,NUMA多节点内存访问,通过访问Local节点内存可能获得更好的延迟表现。

 

 

客户端进来IP首先访问LVS的VIP,原IP是客户端的,目的IP是LVS的VIP,经过FullNAT转换后,原IP变成LVS的Local地址,目的地址是LVS选择出来的RS地址,这样在RS回包时比较容易,只要路由可达,报文一定会交到LVS上,不需要在RS上做特殊的配置。右面就是DNAT+SNAT转换,报文就可以通过LVS转发回客户端,这种方式主要带来应用场景部署灵活性选择。

 

 

通过并行化实现对LVS性能的改善,性能没有办法得到线性提升更多的是因为每条路径都需要访问全局资源,就会不可避免引入锁的开箱,另外,同一条链接上的报文可能分散在不同的核上,大家去访问全局资源时也会导致cache的丢失。所以我们通过RSS技术把同一个五源组报文扔到同一个CPU上处理,保证入方向的所有相同连接上的报文都能交给相同CPU处理,每个核在转发出去时都用当前CPU上的Local地址,通过设置一些fdir规则,报文回来时后端RS访问的目的地址就是对应CPU上的local地址,可以交到指定的CPU上去处理,这样一条连接上左右方向报文都可以交给同一个CPU处理,将流在不同的CPU隔离开;另外,我们把所有配置资源包括动态缓存资源在每个CPU上作了拷贝, 将资源局部化,这使整个流从进入LVS到转发出去访问的资源都是固定在一个核上的本地资源,使性能达到最大化,实现线性提升。

经过我们改进之后,LVS的具体表现如下:

  • 出于对容灾和性能提升的考虑,我们做了集群化部署,每个region有不同机房,每个机房有多个调度单元,每个单元有多台LVS设备;
  • 每台LVS经过优化后,都能达到更高性能,大容量,单台LVS可以达到4000W PPS,600W CPS、单个group可以到达1亿并发;
  • 支持region、IDC、集群和应用级的高可用;
  • 实现了防攻击功能,并在原版LVS上提供了更丰富的功能,可以基于各个维度做管理控制,精确的统计,流量的分析等。

 

Tengine

 

 

Tengine在应用过程中也遇到了各种问题,最严重的就是性能问题,我们发现随着CPU数量越来越多,QPS值并没有线性提升;Nginx本身是多worker模型,每个worker是单进程模式,多worker架构做CPU亲和,内部基于事件驱动的模型,其本身已经提供了很高的性能,单核Nginx可以跑到1W5~2W QPS。Nginx往下第一层是socket API,socket 往下有一层VFS,再往下是TCP、IP,socket层比较薄,经过量化的分析和评估,性能开销最大的是TCP协议栈和VFS部分,因为同步开销大,我们发现横向扩展不行,对此,我们做了一些优化。

七层反向代理的路径更长,处理更复杂,所以它的性能比LVS低很多,我们比较关注单机和集群的性能,集群性能可以靠堆设备去解决,单机如果不提升,成本会一直增加,从性能角度来看,有以下的优化思路和方向:

  • 基于Kernel做开发,比如优化协议栈;
  • 基于Aliscoket的优化,Alisocket是阿里研发的高性能TCP协议栈平台,底层是DPDK,它将资源做了局部化处理,报文分发不同核处理,性能非常出色;
  • HTTPS业务越来越多,流量逐步递增,我们采用硬件加速卡方式做一些加解密的性能提升,还有HTTPS的会话复用;
  • 基于Web传输层的性能优化。

从弹性角度看,比如一些公司的应用和用户热点有关,当发生一个社会网络热点后,访问量会急剧变高,我们固有的基于物理机器实现的负载均衡模型在弹性扩展方面是有限制的,对此,我们可以使用VM去做,把反向代理功能放在VM去跑,我们会监控实例负载情况,根据实时需求做弹性扩容缩容;除了VM,还有调度单元,我们可以在不同调度单元做平滑切换,根据不同的水位情况,通过切换可以把负载均衡实例调度到不同的单元中去,改善使容量上管理。Tengine本身也做了集群化部署,我们在一个region里有不同的机房,不同的调度单元,每个调度单元有多组设备;LVS到Tengine也有健康检查,如果一台Tengine有问题,可以通过健康检查方式摘除,不会影响用户转发能力;Tengine具备灵活的调度能力,可以帮助我们应对更多的复杂情况;另外,Tengine也有很多高级的特性,比如基于cookie的会话保持、基于域名/URL的转发规则、HTTP2、Websocket等功能;目前,我们7层单VIP可以支撑10W规格的HTTPS QPS。

 

高可用

Group

 

 

高可用是整个产品很重要的一部分,图为集群内的高可用架构图,可以看到,在网络路径上是全冗余无单点的。具体情况如下:

  • 双路服务器,每节点双网口上联不同交换机,增加带宽,避免跨节点收包
  • VIP路由两边发不同的优先级,不同的VIP,高优先级路由在不同的交换机上
  • 单机160G转发能力,单VIP 80G带宽,单流 40G带宽
  • 网卡故障不影响转发,上下游路由自动切换
  • ECMP,VIP路由发两边,通过优先级控制从入口
  • 集群640G转发能力,单vip 320G带宽
  • 会话同步,多播、包触发同步、定时同步
  • 单机故障不影响转发
  • 交换机故障不影响转发,路由秒级切换
  • 用户无感知的升级变更,部分未及时同步的连接重连即可

AZ

 

 

每个机房连接两个不同路由器,当一个AZ出现故障之后,我们可以无缝切换到另外一个机房,具体情况如下:

  • VIP在不同的AZ发不同优先级的路由(秒级切换、自动切换)
  • VIP区分主备AZ,不同的VIP主备AZ不同
  • 多个AZ的负载通过控制系统分配
  • 缺省提供VIP多AZ的容灾能力
  • 不支持跨AZ的session同步,跨AZ切换后,所有连接都需要重连

Region

 

 

当用户访问域名时,通过DNS解析,可以设定DNS解析到多个regionVIP地址,下沉到某一个Region来看,如果一个机房出现故障,流量可以切换到另一个可用区继续转发,如果流量进到机房发现一台LVS转发设备出现故障后,我们可以切换到另外一台LVS作处理,如果LVS后面挂载的RS出现问题,通过健康检查也可以快速摘掉设备,将流量转换到健康的设备上去。我们从多个维度实现高可用,最大限度的满足用户的需求。

 

总结

目前,高性能负载均衡应用主要在几个方面:

  1. 作为公有云基础组件,为公有云网站、游戏客户、APP提供负载均衡功能,也针对政府、金融等安全性高的客户提供专有云支持;
  2. 为阿里云内部云产品RDS、OSS、高防等提供了负载均衡的功能;
  3. 负载均衡作为电商平台入口,向淘宝、天猫、1688提供VIP统一接入功能;
  4. 交易平台的流量入口也在负载均衡设备上,如支付宝、网上银行。

未来,我们希望有更好的弹性扩展能力,更高的单机处理能力,我们希望VIP主动探测用户,以及网络全链路监控。

本文为云栖社区原创内容,未经允许不得转载,如需转载请发送邮件至yqeditor@list.alibaba-inc.com

分享到:
评论

相关推荐

    基于LVS负载均衡的高性能Web站点设计与实现

    1、部署环境架构设计2、安装与配置说明2.1 Apache与PHP-FPM2.2 Varnish与Apache2.3 Nginx反向代理2.4 LVS负载均衡3、环境测试3.1 Apache与PHP-FPM3.2 Varnish与Apache3.3 Nginx3.4 LVS负载均衡

    负载均衡解决方案设计设计.doc

    一、 用户需求 本案例公司中现有数量较多的服务器群: WEB网站服务器 4台 邮件... 四、为什么选择梭子鱼安全负载均衡机: 高性能:梭子鱼LB440负载均衡机提供业界至强的服务器负载均衡性能,支 持每秒100,000的新建

    京东基于DPDK技术的高性能四层负载均衡器SKYLB

    本文来自于京东商城基础平台部,本文主要介绍了京东商城设计和实践的一套高可靠,高性能的负载均衡器,我们命名为SKYLB。随着京东业务的高速增长,作为应用入口的负载均衡,大流量大并发带来的挑战越来越严峻。本文...

    linux高可用性,负载均衡,可扩展性

    红帽集群套件(RedHat Cluter Suite, RHCS)是一套综合的软件组件,可以通过在部署时采用不同的配置,以满足你的对高可用性,负载均衡,可扩展性,文件共享和节约成本的需要。 对于需要最大正常运行时间的应用来说...

    服务器负载均衡解决方案.doc

    具体部署情况如下: 方案描述 方案设计 本方案设计充分考虑网络的稳定性以及后续的扩展性,采用深信服AD- 1600设备实现服务器负载均衡。深信服AD设备包含了链路负载均衡、全局负载均衡和服 务器负载均衡三大功能,对...

    基于docker容器的高并发web系统架构设计与实现.caj

    设计实现基于工作负载特性的动态负载均衡策略,能够实现根据 不同负载类型以及容器集群资源利用率而实时调整容器集群服务的 权重;设计实现基于灰度模型短时间负载预测弹性伸缩策略,能够实 现高效...

    基于数据库集群的动态负载均衡研究与实现

    针对数据库集群负载问题,提出了一种动态负载均衡方法,并进一步设计、实现了包括CPU使用率、磁盘存储量、磁盘响应效率、网络延时、内存使用率等...性能分析和实验表明,该算法具有较高的负载均衡度和较低的系统开销。

    论文研究-奇偶直方图负载均衡超立方对等云MapReduce模型.pdf

    针对传统MapReduce算法结构在处理大数据时,负载均衡性能不理想的缺点,设计了一种具有负载均衡机制的层次MapReduce模型。该模型利用超立方拓扑结构对MapReduce的映射操作进行改进,通过特定算法将八个结构化的数据...

    大规模高性能分布式存储系统设计与实现_第四课_大规模高性能分布式存储系统之一致性篇@孙玄

    如何保证分布式存储系统的负载均衡?!如何保证分布式存储系统的高稳定性?! 本次课程,将会通过循序渐进、步步深入的方式讲解,理论结合实践,使同学可以熟练掌握分布式存储的知识原理、设计方案,一起动手设计...

    负载均衡技术在统一采集平台中的应用研究与实现

    随着高性能网络技术的飞速发展,动态负载均衡作为集群系统中的重要技术,逐渐成为一种高性价比的并行/分布式计算的技术焦点。通过对动态负载均衡原理的诠释、任务调度算法的研究、云资源池硬件搭建方案的阐述、不同...

    基于SSM框架的高并发电子商务平台设计与实现_吴倩.pdf

    为了解决电子商务平台中高并发带来的难题,改善用户体验,本文融入当前业界的主流技术Nginx负载均衡、Redis缓存和MySQL数据库的主从复制等,搭建了一个具有推荐功能的电商平台。该平台整体采用SSM框架;后端使用高性能...

    论文研究-基于高性能消息管理机制的物联网中间件设计方法.pdf

    提出了一种基于高性能消息管理机制的物联网中间件设计方法,分析了其网络模型,重点阐述了实现中间件的高性能消息管理机制,其中设备接入规范化的引入是为了突出其灵活和安全性,而通过多级缓存和多线程技术与优先级...

    基于RFID技术的智能景区系统设计与实现

    随着旅游业成为当今世界最具有发展活力和潜力的产业,RFID与旅游...采用基于Web的B/S模式结合Web Service,SSL、动态缓存、负载均衡、集群和ActiveX控件技术,使得系统扩展性好、安全性能高;用户使用方便、操作灵活。

    网络安全员题库答案解析.xls

    10 最常见的三种群集类型不包括( ) 高性能科学集群 负载均衡集群 11 关于负载均衡下面说法错误的是( ) 单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给用户,系统...

    C++项目设计和高性能服务开发-视频教程网盘链接提取码下载 .txt

    非常推荐的一个C++入门的集群聊天开源项目,课程主要讲解集群聊天服务器设计,软件分层设计思路,用muduo网络库实现高性能的聊天服务器,cmake构建项目集成编译环境,负载均衡器的介绍和项目的整套开发流程,bug调试定位等...

    windows NLB+ARR实现Web负载均衡高可用/可伸缩的方法

    基于IIS的ARR负载均衡 基于NLB负载均衡 这两篇分别分ARR 和 NLB基本配置,下面我们讲讲,如何组合使用,搭配成高可用/可伸缩集群。 什么是高可用,可伸缩 ? 高可用:是指系统经过专门设计减少停工时间,保持服务高度...

    架构设计方案

    为提高网站的高并发性能,提高开发效率及运营效率,主要按如下几个思路进行规划设计: 2.1.1负载均衡 1)四层交换负载均衡: 采用负载均衡器来实现硬件级的四层交换负载均衡,或采用LVS来实现软件的四层交换负载均衡。 2...

    数据库分库技巧

    数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 关键字: 水平切分,分库,分表,主从,集群 第1章 引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一...

Global site tag (gtag.js) - Google Analytics