从成都核酸系统崩溃,谈谈IT系统如何应对10倍以上流量冲击

作者:胡忠想 星汉未来联合创始人&CPO

星汉未来 联合创始人&CPO 北京 现任北京星汉未来科技有限公司联合创始人兼CPO,北京航空航天大学计算机本硕,2012年毕业加入微博,2018年晋升为技术专家,负责过微博全站热点应对、增长工具、Weibo Mesh等项目。 微博 @古月中心相心,粉丝60万。著有极客时间专栏《从0开始学习微服务》,专栏有超2万订阅。

最近成都核酸系统崩溃的新闻成为热搜,让人想起了西安一码通崩溃时,笔者曾经写过一篇文章 《从西安一码通崩溃,看千万级DAU系统该如何设计》 来 阐 述 千万级DAU系统应该如何设计 。

同理对于核酸系统,在设计之初并未考虑到要承载千万级的流量,

那么该如何做才能快速应对一周后甚至一天后即将到来的10倍以上流量呢?以及一个系统应该如何设计才能具备扩展性,在需要紧急扩容的时候可以支撑10倍以上流量冲击呢?

本文将针对以上问题进行探讨,欢迎大家参与讨论。

1

一般应用系统的架构链路

在上一篇文章中,我介绍了 一般应用系统的架构链路如下:

能否承载10倍以上的流量,要求首先要对系统当前的情况有定量的分析,可以用冗余度这个通用指标来衡量,而针对每一层冗余度的计算可以选用具体不同的指标。

而应用服务器的最大承载压力是多少呢?这个需要通过压测来确定。通常的压测分为两种:

1.1

单机压测

一种是单机压测,即通过Jmeter等工具构造请求对单机进行施压,在单机的响应延迟、资源利用率等指标达到阈值后停止压测。

1.2

全链路压测

一种是全链路压测,即模拟一条与线上业务完全一致的链路,包括机房流量入口到七层网关再到应用服务器最后到数据库服务器,然后通过录制线上流量并放大N倍,对全链路进行压测,从而得出各系统的瓶颈点。

以上两种压测有利有弊, 单机压测 优点是 实施成本低 , 流程简单 ,缺点是构造的请求一般无法模拟真实线上流量,所以压测的 结果参考性不高 。

全链路压测 相反,优点是流量复制线上,链路复制线上,达到 最大化程度模拟线上的效果 ,压测 结果参考性高 ,缺点是 实施成本高 ,需要搭建一条完整的请求链路,并且为了不对线上数据造成污染,还需要将压测流量的写入请求路由到与线上隔离的数据库, 复杂度较高 ,所以一般多为规模较大的企业采用,并且只在特定时期才会去进行全链路压测,毕竟人力和机器成本都很高。

那么有没有一种低成本的快速压测方法呢?这篇文章 《通用场景下如何进行低成本快速压测 》我们提出了一种低成本的快速压测方法。它的原理是为应用设定固定的SLA,如请求的最大延迟、最大失败率或者最大慢速比等,在七层网关处逐步缩减可提供服务的应用服务器数量,从而逐步加大对后端的单台应用服务器的压力,一直到触发SLA时,即可得到系统中当前应用服务器所能承载的最大MetricQPS。这样的话应用服务的冗余度即最大MetricQPS/实时MetricQPS。数据库服务器的冗余度一般可以用读写请求QPS来判定,以MySQL数据库为例,冗余度可以定义为单台MySQL最大读写QPS/实时读写QPS。

2

限流和降级

有了各个层次的冗余度指标后,就可以清楚地知道各个层次的健康状况,如果要想应对10倍以上的流量,那么各个层次就要保证具备10倍以上的冗余度。一方面原有的系统并不是每一层都能够横向扩展,另一方面如果各层保持10倍以上冗余度的话,成本浪费就会十分严重。那么如何才能让系统快速具备临时支撑10倍以上流量的能力呢?

通常有两种手段,一种是限流,一种是降级。下面我们分别就这两种手段来详细论述。

2.1

限流

首先来看限流,限流可分人为的和自动的。人为限流一般是强干预,如 核酸录入系统,可通过人为引导将不同地区的核酸录入流量分散到不同的时间段错峰进行,这样的话对核酸录入系统的流量可降低到原来的几分之一。自动限流则是根据系统的处理能力,主动地抛弃一部分流量,来保证系统一直可用。对于核酸录入系统,可根据系统的最大处理能力,为每一层设置限流策略,确保流量冲击时系统还能够持续运行。

2.2

降级

再来看降级,降级都是有损的,所以是临时性的手段,一般用于线上出现问题或者预判即将到来不可承受的流量时才会执行。

降级也需要分为等级,从对线上业务的影响程度严重与否,可以分为三级:

总而言之,要想在短时间内不改变原有系统架构的情况下,需要做好两件事情:

一、在各层选取合适的指标来计算冗余度;

二、确立合理的限流和降级预案,并通过预案演练确定实际冗余度,才可以知道系统是否能够真正经受住10倍以上流量的冲击。

3

弹性扩容

如果限流和降级还达不到10倍以上冗余度的效果,就要考虑给现有系统进行扩容,把所有可以借调的资源扩容到线上,如一些日常闲置的测试服务器、过保的服务器甚至从一些不重要的业务借调服务器等。

然而 无论是限流还是降级,对系统都是有损的 。那么如何在保持合理的冗余度情况下应对10倍以上流量的冲击呢?最根本有效的办法还是做到系统可做到随时随地的弹性扩容。而不同层的扩容难度和挑战也差别很大,下面我们逐一展开。

对于私有IDC内部署的应用来说,因为私有IDC内采购的服务器一般是提前规划好的,按季度甚至按年进行采购,所以短时间内增加服务器是不现实的。为此需要一种算力共享池机制,能够在应用冗余度高的时候,可以将空闲的算力释放到共享池,在应用冗余度低的时候,又可以从共享池中获取,从而实现私有IDC内部的算力共享,达到资源共享的效果。

算力共享池 一般应用在两个场景:

一个是 错峰调度 ,应用所需的资源往往按照峰值流量进行算力评估,所以大部分时间冗余度都比较高,算力存在浪费,所以可以将空闲的算力释放到共享池,如果有应用需要算力则可以从共享池中获取算力,实现错峰调度,在不增加机器成本的前提下,即可满足业务的需求,节省成本。

一个是 在离线混部 ,一般情况下在线业务在白天对算力的需求较大,而离线业务在夜间对算力的需求较大,这样的话可以在白天将离线业务的算力调度到共享池,在线业务可以使用,而在夜间可以将在线业务的算力调度到共享池,离线业务也可以使用。

如果应用在公有云上部署的话,则算力调度十分便利,可随时随地从公有云获取算力。开源算力调度引擎BridgX,具备在公有云上1分钟扩容1000台,10分钟扩容10000台算力的能力。

如果应用采用混合云部署,则可将常规流量需要算力部署在私有IDC,再借用公有云算力来应对峰值流量。

除此之外,还可以直接使用分布式数据库比如tidb,支持数据库的水平扩容,无须考虑数据库增大或者访问量增大时的拆库问题。

3

Set化部署

如果系统架构本身无法扩容,还有一种方案就是 Set化部署 。每个Set从四层负载均衡到七层网关,再到应用服务器,最后到数据库服务器都独立部署。把原有的用户数据按照一定的规则平均分配到每个Set内,每部分用户都只访问本Set内的服务,如果分为10个Set的话,则每个Set的请求量就只有原来的1/10,每一层的压力也就只有原来的1/10,承载能力也提升到原来的10倍。

作者:胡忠想

来源:微信公众号:中生代技术

出处:https://mp.weixin.qq.com/s?__biz=MzI3MzEzMDI1OQ==&mid=2651836077&idx=1&sn=a68c361a2e1450118d343ed665cebc46

展开阅读全文

页面更新:2024-04-07

标签:核酸   流量   系统   冗余   成都   网关   机房   能力   服务器   数据库   业务

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top