作者介绍
于海影,2014年加入去哪儿游览,测验开发工程师,担任去哪儿机票服务端测验,21年开端担任混沌工程在去哪儿的推行落地,致力于依托混沌工程进行质量缺口勘探和建造。
一、前言
去哪儿的混沌工程依托 chaosblade 作为毛病注入东西,在经历两年多的落地实践后已建成较老练的体系。中心亮点包含:无损演练、主动化止损、全链路完整勘探、可视化报告输出等。本文将从以下4方面论述去哪儿游览基于以上才能进行微服务架构下的体系强弱依靠演练以及攻防演练的成功实践:
1.先进行价值剖析,什么样的公司合适落地混沌工程,混沌工程能得到什么收益; 2.介绍去哪儿游览的混沌工程渠道是什么样的架构; 3.怎样落地主动化闭环演练; 4.攻防演练,经过在线上突袭注入毛病,锻炼技能的问题排查才能和验证毛病预案体系。
二、价值剖析
2.1 布景
2.1.1 前史上严重的宕机事故
首要,先看一下前史上的几个严重宕机事故:
- 图一是 facebook 服务器宕机,持续时刻7h,构成600多亿美元的市值损失。
- 图二是韩国三大通讯供应商 KT 产生毛病,导致韩国大面积断网,直接影响到民生。
咱们看到这类问题肯定都是吃瓜心态,可是作为技能,除了乐祸幸灾之外,还会有点危机认识,由于这类问题,不知道哪天就会轮到咱们身上。那么产生类问题时,有没有什么好的解决计划呢?经过本篇文章,咱们来解决这类问题。
(图一)
(图二)
2.1.2 杂乱的集群
这里列举去哪儿游览一些数据,线上跑着的活泼的使用有 3000 多个,dubbo 接口有 18000 多个,网关上注册的域名有 3500 多个,qmq13000 多个,技能栈有 5 种语言,大规划的体系群和生态很难确保完全牢靠,恣意一个体系有问题,都或许影响终究的成果。
2.1.3杂乱的根底设施
除了杂乱的集群之外,还有另一种状况,现有的根底设施层规划和杂乱度日益添加,100%的稳定性是很难到达的,那么产生问题时,怎样确保用户端的事务能更好的运转?这时需求强有力的技能确保。
2.1.4 常见毛病类型
咱们按常见的毛病原因,将毛病划分为以下几类:
1.机房问题:机房断电、网络不通、 网络推迟
2.中间件问题:zk集群毛病、mq毛病、 数据库毛病、缓存毛病
3.机器问题:load高、cpu满、 磁盘满、IO满
4.使用问题:fullGC、服务下线、 日志拖慢、线程池满
5.依靠问题:下流dubbo/http接口推迟、抛反常基于这一系列的布景,混沌工程诞生了,下面咱们来看下混沌工程的概念。
2.2 混沌工程概念
混沌工程是一门在分布式体系上进行试验的学科,它经过主动演练,提早把或许产生的问题,让它实在产生,看看体系的反响,从而提早应对,提早做出修正、提早做好应急预案。
2.3 混沌工程方针
混沌工程方针有两个,一是经过混沌工程,让咱们树立起抵挡出产环境中,产生不行预估问题的信心。做完之后,体系便是相对牢靠的。不是靠概率和运气;二是把以前概率性的问题变成确定性的问题,混沌工程做到什么程度,就知道体系牢靠到什么程度。
2.4混沌工程收益
混沌工程收益首要如下,可以分三个角度来看:
第一个是人,对用户来说,可以享受更稳定的用户体验,以去哪儿游览为例,假如体系挂了,用户想买票,或许退票一向不成功,就会影响用户出行,影响公司形象。关于开发和测验来说也是一样的,可以提早发现这些危险并修正,提高毛病的应急响应效率;
第二是流程上,完善了毛病处理体系,把毛病从被动发现转为主动发现,而且验证了报警是否实在有效;
第三是体系维度,提高了体系的耐性,最大极限地确保体系的牢靠性。从这个角度看,十分有必要落地混沌工程。去哪儿游览是从19年开端落地混沌工程渠道,一路上咱们是分阶段去落地施行,下面就和咱们具体介绍下去哪儿游览混沌工程渠道。
三、混沌工程渠道
首要咱们来看下咱们公司的使用架构。从下至上,依次是机房层、中间件、服务器层、使用、服务依靠层。层次间会显示显着的联系,越往下,出问题的概率越小,可是构成的影响越大;越往上,出问题的概率越大,但单次产生的影响会相对小些。这意味着要落地混沌工程时,面对一个挑选,你期望先落地哪些类型呢?咱们的状况是从下向上进行的。下面就看下具体的实践途径。
1、关机演练:机房、中间件、实体机、虚拟机
首要咱们做的是关机演练,关机演练意味着机器或机房需求先挂掉,这会涉及到各个方面。例如演练 A 机房挂掉的场景,假如没经过混沌工程演练,咱们没有办法确保 A 机房挂掉时,对线上是没有影响的。很多开发在进行使用规划的时分是不会自觉考虑体系的可用性的。举个例子:某个使用布置了两个实例放在两个机房甚至一个机房,这个机房产生毛病时,有两种状况:第一种,在同一个机房布置两个实例的,那么这两个就都挂了,依靠这个服务供给的才能都是不行用的;第二种状况,两个实例布置在两个机房,一个机房挂掉意味着一半的实例都没有了,没有做好容量规划和评价的话,上来的流量会一下把剩余的实例打爆。所以归纳各种原因咱们优先做的是关机演练。
2、使用演练:服务依靠毛病
第二个阶段是进行使用的强弱依靠演练,咱们线上经常会面对这种状况:比方某一个服务 A ,调用下流的服务 B ,超时时刻设置的不合理导致出问题。咱们设置超时时刻的时分尽或许确保恳求能回来,会在最长时刻的界线上留必定的buffer,当很多的响应时刻都涨到阈值之上时,体系或许会被拖死,机器的资源都用于等待下流的响应,导致不能服务新的恳求,这种状况假如欠好优点理的话 ,就会导致别人的服务出了问题,它没有影响,可是你或许被拖死。
3、攻防演练:常态化攻防 混沌文化
第三个阶段是攻防演练,经过常态化的攻防演练,提高咱们的毛病认识和毛病处理才能。下面就分别介绍下每个演练的才能和要害点。
3.1 关机演练
3.1.1 方针
同一机房某个事务线一切服务节点悉数关机,演练规划是单次超过一千台。
3.1.2 要害点
- 有完善的使用画像渠道,将使用机房信息聚合起来,方便查询,方便使用改造;
- 通知机制,及时周知进展和问题;
- 实在的关机;
- 接入报警,中心方针有问题要主动熔断;
- 开机后,主动重启服务。
3.1.3 流程
3.1.4 效果
- 机房演练:49次 4000+机器 使用500+个 发现10+问题/次。
- 关机演练:71次 3000+机器 使用250+个。
3.2 使用强弱依靠演练
3.2.1 技能选型
使用等级的演练就会涉及到技能选型的问题,由于使用等级的演练需求的场景十分多,例如 fullgc 、日志写入慢,依靠超时或许抛指定反常等,需求比较好的技能手段去支撑,其时维护比较好、用的比较多的有三种类型:第一种是官方的,支撑渠道是虚拟机,场景比较丰厚,问题是不开源。二是 chaosblade ,阿里巴巴开关的演练东西,特色是容器和 kvm 都支撑,场景相对丰厚,而且是开源的,三是 chaosmesh,这个也是开源的,可是只支撑 k8s 模式。归纳考虑后,咱们终究选用的是 chaosblade 。
组件 | 支撑渠道 | 支撑场景 | 开源 | 全体性 | 侵入型 | 特色 |
---|---|---|---|---|---|---|
ChAP | VM | 丰厚 | 否 | 好 | 高 | 试验参照比照 |
Chaosblade | VM/K8S | 丰厚 | 是 | 差(其时只要agent) | 低 | 简略易用、扩展性好、社区活泼 |
ChaosMesh | K8s | 丰厚 | 是 | 好 | 无 | 云原生、社区活泼 |
chaosblade 支撑多层面的毛病演练,比方根底资源层面的、使用服务层面的。一起还支撑 k8s 。而且它支撑的场景十分丰厚,基本上涵盖了需求的各个方面,可是还有一写场景是缺失的。首要如下:
- HTTP超时
- fullgc
- 日志拥堵
- 调用点区别
- 链路匹配
关于这些不支撑的场景,在落地的过程中,咱们支撑了这些形态,而且将这些改动提交到社区,参与开源共建。
3.2.2 方针
弱依靠挂掉,主流程不受影响
3.2.3 要害点
1、依靠联系搜集
依靠联系搜集的首要来源有两种:一种是使用的 access.log ;另一种是 zk 上的服务注册信息。咱们把这些信息汇集到一个剖析聚合的服务中,它会每天更新七日内的数据,并把这些数据聚合之后生成的依靠联系存在 db 里。强弱依靠信息需求用户进行符号,演练渠道供给依靠联系的符号和查询服务。
2、毛病注入编列
一个演练,通常都需求注入多个毛病,这就需求必定的编列战略。编列战略首要有三种:
- 并行:一次把一切的毛病都注入到服务上,这种方法的优点是比较快;缺点是,出了问题,欠好排查,多个毛病间简单有搅扰。
- 串行:每个服务上,一起只会有一种毛病,出了问题之后比较好排查。
- 手艺操控:可以根据需求去挑选,比较灵活。
3.2.4 流程
1、全体流程
强弱依靠演练的全体流程,分为四个阶段:
第一阶段:先进行依靠联系搜集。
第二阶段:用户在演练渠道人工符号强弱依靠联系。
第三阶段:进行实在演练。
第四阶段:演练后问题修正,修正之后从头在进行符号、演练,构成闭环。
2、具体流程
经过这样一个流程,确保演练顺利进行,构成闭环。
3.2.5 效果
演练体系 68 个,工时 69.5PD ,发现问题 136 个。
经过演练,咱们发现了很多的体系问题。建造完这项才能之后, 咱们期望扩展生效面,获得更高的收益。怎样样能把影响面扩展呢,面对的问题便是,人工整理符号演练比较耗时,一个使用大约1PD,那么咱们就在考虑主动化的履行计划,下面就具体介绍下主动化闭环演练。
3.3 主动化闭环演练
3.3.1 方针
常用常新,避免运动式牢靠性确保,将人工成本降到最低,将覆盖面提高到最大。
3.3.2难点
1、完善的使用元数据
首要来看下使用元数据收集,咱们要知道,咱们要做主动化的演练的话,那么咱们在演练前,就需求知道一切的使用依靠信息。由于只要知道了一切的信息,咱们才可以提早做演练场景的编列,咱们有完善的使用元数据剖析渠道,剖析好一切的底层资源,http、dubbo、db、以及使用自身露出出来的各种接口信息,包含接口和数据类型;还有 qtrace 和拓扑联系等,有了这些信息后,聚合到一起,咱们就能剖析出依靠的明细数据是什么样的,有了这些数据之后,咱们就可以将演练场景主动化的创立出来,进行毛病注入。
2、主动化履行的流量和断语
毛病注入之后,流量怎样获取呢,咱们一期人工演练的时分,是直接用的线上实在的用户流量。用线上实在流量影响规模欠好操控,会对用户产生实在影响,所以咱们一般都是在事务低峰,大半夜进行演练。主动化演练,假如还是直接用线上流量,风险会十分大。这个时分就需求有其他的流量协助触发这些流程,而且确保可以得到成果。比较好的是,咱们有完善的接口主动化渠道和压测渠道,经过压测和主动化渠道,将流量履行到方针机器上,得到主动化的断语成果。下图是主动化闭环演练的具体的流程 首要混沌渠道经过使用信息渠道获取依靠信息,进行毛病场景的编列。接下来经过压测和主动化渠道,获取流量,将流量履行到方针机器上,一起混沌操控渠道,对演练环境进行毛病注入。压测渠道,从使用的进口,建议恳求后,会拿基准环境和测验环境的 response ,调用 diff 渠道,进行 response 数据的接口比照。并把比照的的成果回来给混沌操控渠道,混沌操控渠道进行终究的强弱依靠成果判别,产出可视化的演练报告。介绍完流程后,咱们来看下,在落地主动化闭环演练的过程中的几个要害点。
3.3.3 要害点
1、case 挑选战略,确保依靠射中率
先来解释下依靠射中的概念,在毛病注入期间,有压测流量打到当前的依靠,才算射中。下图是某一个进口依靠的的拓扑图,咱们的演练规模是要覆盖整个链路的每一个接口的,假如要确保射中率,那 case 挑选逻辑就很重要,咱们期望的是经过挑选之后,能确保射中率在 90% 以上,这样演练才是有效果的。case 挑选战略有两种,第一种是从进口处的使用,随机取若干条,从进口开端恳求,这个方法比较简答粗犷,可是问题是覆盖率很难确保。举个例子,比方说用户在咱们渠道买机票,它可以买北京到上海的单程,也可以买北京到上海的往复。单程和往复这两种类型的报价,在服务端,是不同的体系来供给服务的,假如我随机挑选的 case 里,只要单程的恳求,没有往复的恳求,那就只能射中单程的链路,往复这条链路上的一切依靠就都没办法射中。第二种战略是精确匹配,比方体系 d 调用体系 e 供给的接口 f ,精确的找到体系 d 调用体系 e 的 f 接口的 trace,和进口做相关,建议恳求,这样就能确保依靠被覆盖到。
2、熔断康复战略
熔断首要是靠监控报警来完结的。这里面有两个逻辑,第一个是方针符号存储逻辑,演练前,咱们人工去符号事务线的中心面板、以及使用的中心监控,将这些中心方针存储起来做为熔断方针。第二个是演练时的反常匹配逻辑,演练时咱们查看熔断方针假如有报警,就停止演练,非熔断方针会在演练界面记录并周知。
3.3.4 效果
现已完结 10 个进口,3820 个依靠的主动化闭环演练。
3.4 攻防演练
3.4.1 布景
前面介绍的,关机演练、强弱依靠演练、主动化闭环演练,这些都是想办法提早发现体系问题,把毛病产生的或许性降低,可是咱们没有办法确保线上 100% 不出毛病,那么毛病产生时,有没有什么方法能协助咱们快速的定位毛病原因,让毛病快速康复呢,攻防演练就便是为了解决这方面的问题而产生的
3.4.2 方针
提高技能同学毛病处理才能 完善毛病应急预案体系。
3.4.3 计划
进犯方注入进犯点,防守方排查出反常后上报给进犯方,进犯方承认进犯点是否正确正确则得分。攻防演练的体系架构,基本上是复用的主动化闭环演练那套,用压测的打标流量,在线上环境进行毛病注入和康复。
3.4.4 流程
1、进犯点编列:挑选前史高频毛病进行场景规划。
2、进犯点上报:防守方定位排查后,上报给进犯方 进犯方承认,正确则得分。
3、进犯停止:防守方定位成功或许超时主动停止。
4、积分:根据定位时长、毛病难易程度进行积分排名、公示
5、复盘:过程中发现的问题进行修正
3.4.5 后续计划
后续咱们计划,把规模扩展,进行常态化的攻防,培育咱们的风险认识,一起进行整个事务线或许整个公司层面的大型攻防,树立固定的攻防日,树立混沌文化。