四个步骤,教你落地稳定性保障工作
序-好记性不如烂笔头
稳定性是个啥? 第一次接触稳定性这个词是在加入阿里第一年的双十一KO会上。接触到限流、扩容、压测等词汇,只觉得稳定性工作是琐碎的、繁杂的、无流程性的、无明确衡量指标的、无从下手的。 今年,我和两个小伙伴一起在稳定性保障工作中投入了大量的精力,我也从他们那里学到了不少关于稳定性保障相关知识,开始对稳定性工作有了一定的理解。 稳定性工作也是有条理有步骤的,按照步骤一步步来,就能够轻松将稳定性保障工作做全、做对、做好。 所谓好记性不如烂笔头。趁机梳理记录下来,以便后续使用时能够信手拈来。什么是稳定性保障
那么到底什么是稳定性保障呢? 根据前人总结,稳定性保障就是保障系统的稳定,在各种不可预知的情况发生时仍然能够持续稳定的运行和提供服务。 个人感觉稳定性保障很像一个水利工程。在应用系统中,水可以是用户流量,也可以是资金流。而稳定性工作就是保障这些水能够按照预定的渠道路径流淌,保障没有渗水、漏水、渠道垮塌的现象,或者出现这类现象也能够及时修复将损失降到最低。
稳定性保障工作做什么
稳定性保障工作到底做什么?自然是实现稳定性保障目标。 根据前文稳定性保障的定义可知“ 在各种不可预知的情况发生时仍然能够持续稳定的运行和提供服务 ”就是稳定性保障工作的目标。 这个目标怎么实现?还是一头雾水,无从下手。那是因为这个目标太大太虚了。- 日常稳定性保障主要针对业务功能异常。此类稳定性保障工作伴随着每次业务需求开发同步进行,发布要先于业务功能发布。日常的业务功能变更一般不会引起基础设施异常,因此日常稳定性保障较少涉及基础设施的保障。
- 大促稳定性保障主要针对基础设施异常。因为大促会导致比日常高数十倍数百倍甚至数千倍的流量增长,此时基础设施将面对巨大的压力,就会出现各种异常。大促稳定性保障工作是在每次大促前需要完成的工作。
数据流向图
监控告警配置其实是个省略句,其完整的表达应该是:监控告警数据源的准备、监控告警配置。配置步骤
综上对监控告警的数据源及其流向有了了解,就可以按照以下步骤配置监控告警了:资金安全核对
资金安全核对的本质是检查是否有资损事件的发生,做到及时报警快速止血,最终达到资损防控的目的。资金逻辑相比一般的业务逻辑存在一些共性,因此我们能够针对这些共性思考出一些通用的资金安全核对方法和资损防控措施。 对于资金安全核对的方法论,根据前辈们的总结概括,资金安全问题主要是对资金关键要素的处理过程中出现异常导致的。资金关键要素的生命周期主要包含三个重要节点:生产、传递和消费。三个节点分别可能出现的错误为生产错误、漏传错传、消费错误。针对这些错误,前辈们提出三大核对方法,所谓核对,都是寻找有一个正确数据作为预期,将实际情况与预期数据进行对比核对。- 基线核对是将历史数据作为预期进行对比核对,这种方式依赖历史数据的正确性,投入少,实效低,可发现大的资金问题。
- 两两核对将上游作为预期,进行对比核对,精准度高,时效性高,成本比较高,难以覆盖全面。
- 业务逻辑核对将业务专家的经验作为预期进行核对,需要大量人力投入,对经验的依赖度高,但是精准度高,时效性高。
业务异常的解决方案
稳定性保障对于业务异常主要是从“万一发生了怎么办”这个角度出发去思考解决方案的。因此需要提前准备锦囊,以备不时之需。 业务类异常的解决方案一般分为三类,止血解决方案、临时解决方案和长期解决方案。需要消耗的时间逐渐增多,对问题的解决程度逐渐增加。都是问题发生后的应对方案。 止血解决方案一般不需要走代码变更发布,通过预案、设置、开关等实现,通常也是需要提前有所计划,有所准备的。临时解决方案和长期解决方案一般需要走代码变更发布,耗时较长。因此遇到问题一般都先执行效率最高的止血解决方案,如果止血解决方案依旧承受较大的损失,就需要快速拿出临时方案来解决问题,临时方案虽然一定程度上解决了问题,但是可能存在一些小功能问题、性能问题或者优雅性方面的瑕疵。因此需要在问题得以缓解之后思考出一个稳定优雅的长期解决方案。当然,那已经是后话了,不属于稳定性保障的工作范畴。 对于业务功能异常,在日常开发时就需要提前打算,准备好能够多维度多程度降级的开关或者设置,留作异常发生时紧急止血使用。也就是预案。 预案需要预演进行验证,保证预案配置和执行的正确性。预案
预案的本质是一个或者多个能够快速改变代码逻辑的设置。例如开关、diamond配置或者其他工具,将这些配置跳过繁琐的审批流程、实现快速执行就是预案, 是用于大促前期关闭非核心功能、大促期间紧急问题及时止血保障主要功能而选择断尾某些功能的操作配置。 预案按照执行时间分为提前预案和应急预案。 提前预案是大促前期自动执行用于关闭非核心功能以保障核心功能的预案,例如日志降级等;这类预案一般不会造成损失,风险可控,影响面是业务和消费者都可接受的。 应急预案是大促期间发现线上问题,经过大促负责人审批同意后由相关测试或者开发人员手动执行,用于及时止血以保障主要功能的预案。这类预案类似于壁虎断尾的行为,舍弃小的损失,保留大的功能,因此一般都存在一定的损失。 预案项需要提前梳理清楚,对功能无影响但是对性能无影响的锦上添花的部分在大促期间是是可以作为提前预案降级;对于可能出现异常情况的代码逻辑,或者评估风险较高的逻辑都要不吝增加开关设置,实现多维度降级(业务身份维度、商品类目维度、商家维度等等),在大促前夕配置好紧急预案。预演
预演就是预先演练一遍。包括功能预演、活动预演、预案预演等。- 功能预演:提前将功能演示一遍,保证功能的正确性。注意核心功能的覆盖率,尤其是未参加过大促的新功能。
- 活动预演:主要面向某些大型活动进行提前预演。例如预售。
- 预案预演:对预案进行演练测试。每一个预案在创建后都会进行一次预案预演,以保证预案执行结果符合预期。
基础设施异常的解决方案
稳定性保障对于基础设施异常主要是从“如何才能不发生”这个角度出发去思考解决方案的。因此需要提前修炼内功,增强自身实力。 对于基础设施异常,一旦发生,难以快速止血和修复。因此一般都是在大促前夕就要做足稳定性保障工作保证大促时不发生或者少发生这类异常,可通过压测、预演提前发现异常,提前提出解决方案进行修复处理。 如前文所述,对于基础设施异常,稳定性保障工作仅考虑流量过大导致的异常。因此这类异常的原因明确就是流量过大。其解决方案也就明确是解决流量问题,分为对外解决方案和对内解决方案。对外限流拒绝过多流量对自身进行保护,但限流需要基于容量预估,有考量有依据的设置。对内扩容增强自身实力,并提前预热做好应对准备。 内外解决方案通过压测相互协调配合,最终达到一种权衡利弊后的和谐。容量预估
容量评估要做的事情总结起来就是三件:- 1、 对上游: 询问预估流量,即他们要求我们的保障值。上游需要调用我们的服务,因此我们提供的服务量级需要满足他们的诉求。简言之,我们的水渠需要能够容纳得住从他们那里流下来的水流量。
- 2、 对自身: 梳理自身上下游链路,基于自身预估,根据上游诉求,预估对下游的诉求。
- 3、 对下游: 提供自己的预估容量,要求下游提供足够的容量。
- 1、 梳理业务变化对流量影响: 业务逻辑每年都在变化,进而对流量有所影响。因此要梳理去年同一大促结束到今年大促之前这段时间内的业务变化,预估其对流量的影响量。
- 2、 参考往年同一大促容量值: 梳理往年同一大促的流量、峰值发生时间、整体流量走势;参考预估,没有影响流量的业务变化的情况下(理想情况),基本可以直接用来作为预估值。
- 3、 参考同年之前的大促容量值: 梳理同年前一次大促的流量参考预估。对比往年两次大促的流量比例来预估,例如,如果去年618与双11的的流量比是1:2,那么可以将今年618的容量乘以2的值来作为今年双11的容量预估值。
- 4、结合上游诉求:收集到所有上游的诉求保障值,总结归纳。再对比自身预估容量。一般是两者取大。但是如果差异很大,就需要再认真核对,可能有预估错误或者遗漏。
- 1、 根据代码逻辑总结容量公式: 代码链路梳理,汇总出对下游每个接口的调用场景和次数,最终得到下游每个接口的总调用量的公式,入参是自身容量,出参就是下游接口的容量。不过这个方法有个缺点就是一旦调用链路发生变化就需要及时更新,有一定的维护成本。优点就是精确度高。
- 2、 参考历年容量: 这个方式同上文自身容量的预估方式。可参考往年大促调用量预估今年容量。
限流
限流类似于水渠源头的闸门,这个闸门开的大小直接决定了水渠中的水流量。将闸门开启到一定程度,而非完全打开,保障水渠不至于被冲垮的行为就是限流。 无论有没有扩容, 无论系统是游刃有余还是苦苦支撑,都需要对系统进行限流。 限流是系统的门卫,超出的容量可以被拦截在外。 我们一般都使用单机限流,即设置单台机器最大可接受的QPS,超过则触发限流,限流可以直接拒绝,即快速失败,也可以排队等待。单机限流可以进行调用来源应用维度的限流,可以对所有上游应用一概而论(流控应用设置为default),也可以因人而异保障主要业务(针对核心的应用限流设置较大,非核心的应用限流设置较小)。 也可以考虑集群限流,对整个集群进行限流。压测
所谓压测,就是构造数据流量通过几台压力机模拟用户持续并发请求系统接口,测试系统的性能和承受能力的过程。 集团的压测分为单链路压测和全链路压测。所谓单链路压测,即自己的应用服务入口作为压测入口进行触发压测,主要面对的仅限于单个应用,涉及应用少,涉及人员少。全链路压测则从用户实际操作入口作为压测入口,这个操作涉及到的所有应用服务全部参与压测,是一个跨部门跨应用的过程,每次全链路压测,涉及到链路上所有团队的协调参与共同努力。 全链路压测更能反应线上真是情况。条件允许的情况下都选择全链路压测。 集团的压测都会提前构造影子链路,即真实链路的影子,和真实链路一模一样,却又不会对真实链路产生影响。库表也是使用影子表,将压测的持久化数据与真实持久化数据分开。 压测是一个复杂的过程,需要专业的压测团队的同学支撑。对于一个从未参加过压测的应用而言,要做的工作简要概括如下:- 1、 应用适配改造: 要走通压测链路,涉及改动较多,包括应用系统改造、nginx升级、中间件改造、缓存端升级、DB端升级等等。
- 2、 构造压测数据: 压测数据构造需要根据具体的业务。例如价保的压测,需要构造的压测数据是处于价保有效期内的订单。如果要压到申请链路,还要构造优惠制造差价。
- 3、 创建压测模型: 所谓压测模型是指压测数据的分布情况,压测模型要能够反应线上真实流量占比。要覆盖到所有链路,不同业务的流量占比等同线上真实情况,中心机房和单元机房的流量比例也要按照线上比例分配。
- 4、 进行压测: 压测分为单链路压测和全链路压测,单链路压测是指仅仅对自己关注的系统进行压测;全链路压测是从用户发起请求开始到整个业务逻辑结束的全部链路压测。压测入口也分为http接口压测和端上接口压测,具体根据系统情况而定。
- 5、 观测与总结: 在压测的过程中,要时刻盯盘,观测系统水位。压测后总结梳理出压测报告。
扩容
扩容,就是暴力增加机器。所以也要考虑成本。 如果压测的结果,系统无法达到上游诉求,为了保证业务的顺利进行。就需要扩容,并再次压测,直到系统能够保障目标容量。 如果压测的结果皆大欢喜,满足了上游诉求,那么就不需要扩容了。预热
预热可简单的理解为参赛前的热身。让容器、缓存、数据库等都准备好迎接大促的流量峰值。总结
稳定性保障工作从时间上来说,包括日常业务需求开发时的监控告警配置和开关预留,大促前夕的容量预估、压测、限流、扩容和预热,其实还有一部分,上文未及提及,那便是大促值班。 建议在值班前写一个值班手册,将可能出现的问题,解决方案,需要使用到的工具链接全部罗列清楚,避免值班时手忙脚乱找资料找工具。还有必要的权限申请在值班前申请好。 在大促期间,严阵以待,这个时候需要做到两动,主动关注监控大盘,注意流量变化,监控基础设施指标;被动关注告警,一旦被告警提醒就是有异常情况了,要立刻投入定位解决。 最后,稳定性保障工作是没有尽头的,其重要性不言而喻,但是也要在业务功能与稳定性之间做好权衡,如果稳定性核对的调用流量都超过了业务流量,那么稳定性工作就有点过了,从机器成本、人力成本上都没有这个必要。 本文整理了自己对稳定性保障的认识和理解,可能存在理解有误或者认识不足的情况欢迎指正,也期待更多的学习逐渐修正和完善自己的稳定性相关知识。🚀🚀🚀参与语雀产品评测,赢取语雀专业会员1年、语雀周边礼盒、阿里云定制冲锋衣等多重好礼🎁
点击阅读原文查看详情。