在实际场景中,尤其是万亿流量场景下,真正的负载均衡方案是如何运作的?本文介绍和讨论负载均衡在淘宝双11、春节12306、微信红包、抖音春晚红包等场景的应用。阿里双十一流量下的负载均衡[1]双十一流量的特点是请求量大,脉冲量大。是对阿里巴巴生态链路上所有服务的测试。对负载均衡器的要求:性能优异:应对双十一晚上的脉冲式流量冲击服务稳定:高可用,应对设备和网络抖动无业务感:流畅自升级容灾实现原理恢复切换1)卓越性能依赖DPDK阿里新一代负载均衡器是基于DPDK[3]正是因为这些对数据包的高性能支持,才能实现性能卓越的负载均衡器。支撑多年双十一场景下的脉搏流量压力。2)响应ECMP重选引起的连接中断ECPM(Equal-CostMultipathRouting)是一种等价多路径路由算法,最大限度地利用最短路径。如上图所示,SLB采用水平扩展的集群部署,多台服务器发布同一条路由,在交换机处形成一条ECPM路由。以实现高可用性。但是如果连接未同步前服务器硬件或网络出现异常,会造成服务器不可用,ECPM重路由会使连接到达其他服务器,导致现有连接中断,导致用户访问异常。SLB使用会话同步机制解决升级和容灾场景下连接长时间中断的问题。使用组播技术解决会话同步机制中机器上下线的问题。详细解释可参见文献[1]。铁路12306[4]12306的负载均衡众所周知,无需介绍。很多场景和技术都可以给我们很好的借鉴。但是只找到了2016年发表的论文,没有人能够了解到最新的架构部署。12306的业务难点是动态盘点,剩余的票可以站点拆分。交易强一致性,订单交易性质,多维数据一致性,线上线下售票渠道流量高峰,节假日流量高峰。这里暂时先介绍几个问题。为了讨论,这里只说一下负载均衡在应对流量高峰时的作用。12306架构的开发过程如下:从上图可以看出,在第一次优化之前,几乎所有的链路服务都出现了性能瓶颈,因为并发查询导致查询系统负载过高,用户重试导致AS过载;AS阻塞导致响应增加,造成WEB负载问题,线上压力导致整个票务系统出现异常,进而影响线下票务渠道的正常运行,直至链路雪崩。第一次优化后,引入了排队系统,不同的列车使用不同的队列,实现了请求分流;排队系统采用动态流控,根据各铁路局售票中心的处理速度发出限速请求;和ticket网络服务进行拆分,根据不同的规则来均衡流量负载。此次优化让12306顺利度过了13年的春运。然而,随着互联网的快速发展,网上订票的数量不断增加,目前的架构已经到了带宽、性能、稳定性等方面的瓶颈。因此,第二个优化点如下:本文着重讨论负载均衡在业务场景中的实际作用,其他优化点不再赘述。正是因为多维多层次的负载均衡,12306才能承载更高的流量冲击(如果有同学有12306最新部署架构,希望私信交流学习~)微信背后的负载均衡红包[5]2017年第一个月,微信公布除夕当天用户收发微信红包142亿个,收发峰值达到每秒76万个。百亿红包业务特点:与普通电商场景不同,团红包相当于闪购活动,对并发和金融属性要求较高,不允许数据一致性,对安全级别要求较高.那么微信的红包方案是如何设计成垂直SET的呢?分而治之。如果采用普通的服务拆分和部署方式,由于需要锁存量防止超发,大量的锁竞争会给DB造成不可估量的压力。及时,使用外存分布式锁进行预压释放,只是传递压力,无法减少。采用基于SET的部署的好处是,同一个红包只会被路由到同一个SET,相当于减少了巨大的洪流。不同SET之间互不影响,大大降低了不同SET之间的资源压力。(其实和阿里的RGCzone单元部署的原理差不多)server层请求排队产生并发锁抢的原因是对DB的请求可能是并发的。如果对DB的请求可以保证通过,那么就不会出现并发。首先通过IDhash保证同一个红包的请求分配到同一个服务器,然后对单机红包进行排队。这样可以保证同一个红包的请求顺序到达DB,从而降低DB锁抢的并发度。由于二维数据库表设计中的红包数量巨大,单表数据达到一定程度就会出现性能问题;所以,除了按照红包ID进行分库分表外,还要按照天分冷热数据,在保证数据可以优雅迁移的前提下,接下来是当天的DB性能有保证。查询时,通过数据库中间件进行数据库表路由。综上所述,从负载均衡的角度来看红包的架构设计,可以看出整个架构设计可以理解为采用三层负载均衡。首先是入口层,将流量拆分成集合,实现整个SET集群的负载均衡;然后是server层,对红包ID进行业务逻辑Hash,实现ID穿越时服务器集群内部的负载均衡;然后是DB层,通过二维数据库表的设计,在保证DB性能的同时实现数据访问的负载均衡。抖音春晚红包背后的负载均衡[6][7]前几部分分别从网络层、架构层、内部设计的角度阐述了负载均衡的实际应用。在这里,我们将着重介绍抖音架构中涉及的下一代微服务技术ServiceMesh在负载均衡方面的优势。什么是ServiceMesh[8]为了解决端到端的字节码通信问题,TCP协议诞生,让多机通信简单可靠;在微服务时代,ServiceMesh的诞生就是为了屏蔽分布式系统的诸多复杂性,让开发者可以回归正题。ServiceMesh下的Istio负载均衡[9]Istio服务网格在逻辑上分为控制平面和数据平面两部分。其中,数据平面由一组以Sidecar形式部署的智能代理(Envoy)组成,可以规范和控制微服务与Mixer之间的所有网络通信。Envoy代理可以发送许多指标和遥测数据。遥测数据发送到哪里取决于Envoy的配置。Envoy作为代理,在网络系统中起到中介的作用,可以为网络中的流量管理增加额外的功能。包括提供安全、隐私保护或负载策略等。在服务间调用的场景中,代理可以向客户端隐藏服务后端的拓扑细节,简化交互的复杂性,保护后端服务不超载。并且可以发现集群中的所有成员,然后通过主动健康检查判断集群成员的健康状态,并根据健康状态,通过负载均衡策略决定将请求路由到哪个集群成员。结语本文从实际角度出发,选取了四个最典型的案例,从网络层、架构层、微服务开发等方面对负载均衡的实际应用进行了阐述。帮助~参考[1]支持双十一高性能负载均衡:http://www.aliyunhn.com/Home/Article/detail/id/1643.html[2]阅读DPDK一篇文章:https://cloud.tencent.com/developer/article/1198333[3]DPDK技术介绍:https://www.jianshu.com/p/86af81a10195[4]12306互联网售票系统架构优化与演进:铁路计算机应用杂志[5】百亿级微信红包系统设计:https://www.infoq.cn/article/2017hongbao-weixin[6]抖音春晚幕后花絮:https://www.volcengine.cn/docs/6360/67383[7]抖音春晚背后的百亿互动红包:https://www.163.com/dy/article/G5N0AFOF0511FQO9.html[8]What是ServiceMesh:https://zhuanlan.zhihu.com/p/61901608[9]ServiceMeshIstio架构解析:https://developer.aliyun.com/article/759790
