乐趣区

关于故障:去哪儿是如何做到大规模故障演练的

一分钟精髓速览

混沌工程作为一种进步技术架构弹性能力和容错能力的简单技术手段,近年来探讨声音一直,相比在分布式系统上进行随机的故障注入试验,基于混沌工程的大规模自动化故障演练,不仅能将“作战演习”常态化,还能通过进步覆盖面而取得更高的产出价值,帮忙更全面地欠缺故障应急预案和解决体系。此前 TakinTalks 分享了去哪儿在过来 3 年里 4 个阶段的混沌工程能力建设(毁坏零碎是为了更稳固?混沌工程在去哪儿的 4 个阶段实际)。如果说能力建设是从 0-1,那么从 1-100 的大规模自动化演练又是怎么进行的?

作者介绍

去哪儿网高级技术总监 – 朱仕智 TakinTalks 社区特聘专家,2013 年退出去哪儿网,负责过公共业务、国内机票、基础架构等团队,善于高并发高可用高性能的零碎设计和落地,多年的技术治理教训。目前负责基础架构部门,蕴含根底平台、中间件架构、大前端、品质保障等团队,近期专一公司整体技术演进和云原生、数字化技术落地。

舒适揭示:本文约 4000 字,预计破费 7 分钟浏览。
「TakinTalks 稳定性社区」公众号后盾回复“交换”进入读者交换群;
回复“1151”获取讲师课件;回复“混沌”获取《混沌工程实际指南》。

背景

过来 3 年的混沌工程实际中,咱们对基础设施、利用、依赖、攻防等做了 4 个阶段的能力建设,搭建了能力绝对欠缺的混沌工程平台。那么,在有这些根底能力的前提下,咱们怎么确保它们可能失去执行、能最大限度施展价值?

可能你常常能看到,业界有这样一种声音,既然线上的随机性演练能力曾经具备了,那么在公司内造就混沌工程文化,让团队被动去执行这些演练,就能达到大规模演练的目标了。而从我的实践经验来看,这样做会导致时效十分慢。

因为齐全靠文化驱动,其实很难保障覆盖面——很多时候可能只有 20% 的同学是喜爱尝试新技术的,他们本身热衷参加到这些翻新的事件中来,但剩下的大部分同学,有的因为开发和日常工作多,并不会十分被动地、自发地去做。所以,齐全依附“文化建设”这个软性条件束缚,很难达到大规模的演练成果。

在去哪儿的实际中,咱们保障落地成果最外围的动作,是建设了一套大规模演练的机制,接下来我会具体介绍这套机制,以及大规模故障演练的落地成果。

一、大规模演练前遇到了哪些问题?

1.1 覆盖面的问题

利用数量和零碎现状,很大水平限度了咱们的人工演练覆盖面。在去哪儿网,咱们的利用数量高达 3000 多个,同时提供超过 18000 个 dubbo 服务接口,在网关上注册的 HTTP 域名也超过 3500 个,在 MQ 上注册的音讯主题也有超过 13000 个,公司外部大略有 5 种语言技术栈(以 Java 为主)。

在这样状况下,咱们要去动员所有人进行人工演练,来保障大规模故障演练的覆盖面,其实是不太事实的——咱们能够做一个假设性的尝试,对每一个利用发动人工演练,假如每个利用只须要 0.2 人日做完(这是一个十分短的工夫),在 3000 + 利用的规模状况下,则至多须要大几百人日能力实现。而且,稳定性的保障并不是静止式的做一次就可能一劳永逸了,零碎始终在演进、始终在变动,就须要咱们跟随着一直去演练,能力发现新增的问题。如果是以这么高的人力付出来看,演练很难达到十分大的覆盖面,也就无奈达成很好的演练成果。

1.2  人工成本问题

咱们下面说的 0.2 人日,其实曾经是十分小的数据,真正的人力老本会比它高很多,因为在演练过程中,很多中央须要人工参加,比方,演练之前的筹备、打算的制订、演练过程中的察看、人工触发复原,而后还有复盘、改良打算等等,这些都须要有人工的参加。

人力老本这部分,从去哪儿的实际来看,次要集中在以下这几个外围点上:
触发演练:这里肯定须要有人工的参加,因为尽管有可能是定时的,然而在那个工夫点,是必须要有人工盯着的,去察看和触发执行。
依赖关系标注:演练中,每个接口都须要强弱依赖的关系标注,也会消耗掉一部分的人力老本。
人工断言:演练的后果进去后,须要人工断言这个论断到底对不对、是强弱依赖的外面的哪一种、要确保演练的流量通过了这次注入的这个问题点等等。
部分正确:在没有全链路的状况下,须要对部分演练产生的断言论断,进行全局性的正确性修改。以上这些,都须要人力投入,而且这部分人工的老本想要革除,其实是比拟难的。

1.3  大规模演练技术难点

之前咱们大略形象进去大规模的非人工主动演练,它会有几个难点。线上环境须要隔离当咱们要进行十分大规模的演练时,线上环境中的数据,比方,产生的无用订单、各类计费的数据、日志的净化、其余的存储等等,一系列的数据都须要隔离进去,不然大规模的演练流量会影响线上失常业务数据的保留。演练流量从何而来从人工的随机演练变成了主动的大规模演练后,人工触发就不事实了,此时就须要思考流量从哪来的问题。如何主动断言后果须要做到主动断言强弱依赖的后果,演练过程中到底有没有产生影响,这个断言如何做?如何确保命中率命中率是指对依赖进行演练时,流量是否真的通过了依赖。从去哪儿的实际来看,失常状况下,只有大略 40% 的命中率。

二、问题是如何一一解决的?

2.1  全链路演练流量和隔离

为了解决前两个问题——线上环境隔离和演练流量,咱们应用了全链路压测平台(这个平台也是咱们团队在负责)来反对。

去哪儿的全链路压测平台可能做到用例主动生成,线上数据、日志数据都能通过它做隔离,而且它的老本非常低——去哪儿当初基本上全公司的外围场景压测,大略只须要 3 人日就能全副压测一遍,而且它可能进行主动熔断、主动报告。有了这个压测的平台后,咱们就能够把它和混沌工程的过程组合起来,实现线上环境隔离和演练流量的生成。

2.2  全链路演练断言

对于全链路演练的断言,咱们做了一个比拟无效的实际——把所有的断言逻辑挪回到入口级别。咱们零碎的拓扑是非常复杂的,但判断当下演练的上游依赖有没有产生故障,最终的判断规范无非就是那么几个—— 
第一个:对于 C 端的用户,这个性能真正的用户有没有受影响。
第二个:有没有金额上的损失,有没有数据上的问题。
第三个:一些外围的数据,比方用户或者订单会不会受烦扰。

基于此,咱们就能够做这样的收敛。
第一,对入口的后果数据进行后果比照,外围的业务字段比照产生断言论断。
第二,对立监控告警平台的外围面板,不便演练过程中监控告警信息,用于熔断演练过程和断言论断。
第三,在每个利用上对外围指标进行标注,去看它有没有产生大的抖动,进而用于断言论断。

咱们基于一套比较完善的断言逻辑构建了断言平台,这个平台次要依赖上图中的这几类指标,特地是告警的指标,除了有人工设置的告警之外,还有雷达系统对相应的告警监控走势图进行智能剖析,咱们就能收集到十分欠缺的告警和后果信息。对这份指标进行剖析,就能失去当下这个演练被命中的时候,它对入口的影响是强依赖还是弱依赖。而且在这个过程之中,咱们能够随时复原或者终止演练。如果演练过程中没有问题,咱们最终会给它标注上断言后果,这样就能达到主动断言的成果。

2.3  自动化演练流程

咱们全链路演练的流程大略是这样的。
第 1 步:从利用的信息平台上获取各类依赖信息,比方 HTTP 接口、RPC 接口。
第 2 步:从自动化测试平台获取入口对应利用的流量。
第 3 步:对利用线上环境进行故障注入。
第 4 步:发动两份申请。为什么要发动两份申请?次要是比照被注入了故障的机器实例和没被注入故障的机械实例,对同样的申请产生的后果到底是什么样的。图中的基准环境和测试环境,实际上都是线上环境。
第 5 步:进行故障复原。
第 6 步:对各类数据进行剖析,产生断言论断。
第 7 步:把这个强弱依赖的后果自动记录下来。这样咱们就简直能够无人力老本地去实现一次演练,在这个过程中须要人工染指的只有制订演练打算,而且这个演练打算在常态化演练中是能够复用的。

2.4  晋升命中率

从去哪儿的演练成果来看,如果选取的入口压测流量是十分随机的策略,那么大略只有 40% 的上游依赖的命中率。比方下图 F -> N 的流量,它只属于 trace 1,trace 2 和 trace 3 这两个申请尽管都是同样的性能同样的入口,但它们不会通过 F -> N 这个接口依赖。这个 40% 的命中率显然是不合乎咱们要求的,为了演练效率,咱们冀望命中率高于 90%。

对于命中率的晋升,咱们比拟无效的一个实际点,是利用 trace 的拓扑信息反查,即当咱们须要演练时,如演练 E -> F 的这个依赖时,通过 trace 信息就能提前反查进去 trace1 的这个入口条件,即 trace1 这个申请对应的申请参数,可能命中 E -> F 的这个流程。如果是 E -> G 的这个流程,可能会有不同的调用点,因为 trace1 和 trace2 都通过了这里,此时如果想要演练 trace2 的链路对应的接口调用点,须要以同样的形式去反查,它才会通过这个调用点,而后产生 E -> G 的这个依赖。通过这样的形式实际之后,咱们命中率曾经晋升到 90% 以上,是一个比拟能够承受的量级。剩下不到 10% 非命中的状况到底是什么呢?其实是零碎缓存,缓存被命中之后,它就不会接着往下走,也就不会再产生上游的拜访依赖。所以只须要去依照 APM 零碎 trace 的信息去进行反查,就能取得是比拟高的命中率。

三、大规模演练落地成果如何?

从这个大规模演练的这些成果来看,咱们当初笼罩了公司 55 个外围场景链路和 269 个接口的入口,基本上笼罩了所有业务场景。这些场景链路里,比方机票报价或者是酒店生单这样的场景外面,咱们基本上笼罩了 80% 以上的利用依赖,即全公司 3000 多个利用,咱们笼罩了八成左右。

从这个自动化机制落地之后,去哪儿就能够做十分大规模的演练了,咱们当初做这种大规模的演练,人工的老本曾经非常低了。当初遗留下来的人工成本,次要是剖析最初的依赖论断是否和料想统一即可。

Q&A

1、稳定性投入类指标和后果类指标如何掂量?
2、去哪儿目前在稳定性投入上,哪些伎俩是比拟无效的?

欢送关注「TakinTalks 稳定性社区」公众号及视频号!理解更多去哪儿网大规模演练细节,欢送扫码进入「读者交换群」,和老师实时互动。

公众号后盾回复【1151】获取讲师课件回复
【交换】进入读者交换群更多内容欢送点击“浏览原文”,进入「TakinTalks 稳定性社区」,观看完整版视频内容。

申明:本文由公众号「TakinTalks 稳定性社区」联结社区专家独特原创撰写,如需转载,请后盾回复“转载”取得受权。

退出移动版