作者:焦振清

混沌工程六个阶段

从笔者所在团队的实践出发,我们将混沌工程总结为六个阶段,并对各个阶段的落地过程加以总结,希望能够对大家落地混沌工程有所帮助。今天主要是抛砖引玉,后续针对每个阶段,陆续会有专门的文章进行介绍。而混沌工程理论相关的部分,大家可以参考由 Netflix 出版的《混沌工程》迷你书。

上述各阶段涉及的部门和人员的数量,远远超过了当初的预估,因此该部分成为我们确定顺序的最主要因素,强烈建议大家实施混沌工程,一定要争取来自于管理层的支持以及周边团队的理解和配合,否则很容易导致项目虎头蛇尾。

单机破坏

重要性说明

以集群选主机制为例说明单机破坏的优先级和重要性,如果单机在某些场景异常后,集群无法选主,进而导致系统整体不可用。该问题如果在单机房破坏场景时才发现,那系统整体不可用了,你还能找出啥别的问题呢?一个机房的破坏场景,往往涉及多个部门的联动,大部分业务团队的各类角色均会参与其中,难道最后就得到一个结论:选主机制有问题。如果真是这样,你还打算继续干下去吗?

排序考虑

单机破坏能够在测试环境中发现绝大多数问题,并能扫清后续阶段的阻塞点,因此排在首位可谓是当之无愧。

破坏手段

在测试环境下,先从重启服务器开始,然后是关机,资源异常(如CPU打满)等场景。注意单机破坏场景不要把自己”拒之门外”。举个例子,把机器的CPU打满,但是没有设置打满的时长,结果自己也无法登录机器了,只能重启。

https://github.com/Netflix/SimianArmy/tree/master/src/main/resources/scripts

落地建议

  • 初期仅在测试环境中进行,仅进行重启场景的验证就足以发现很多问题;

  • 给出单机破坏的全部场景和验收方法,由各个团队自行落地;

  • 不恋战,只要问题不阻塞单机房破坏环节,不影响黄金流程即可进入下阶段。

单机房破坏

重要性说明

单机房故障是造成服务整体崩溃的主要原因之一,全球互联网巨头大多发生过单机房故障导致服务崩溃的情形。诸如外网出口异常,内网跨机房专线异常,机房核心交换机异常,各种网络抖动和拥塞,IDC 供电设备异常等等,相信大家都不陌生,因此其重要性可见一斑。

排序考虑

高频故障场景,故障后影响较为严重,业界有较多的最佳实践可供参考,模拟单机房破坏的难度和风险均较低,因此紧随单机破坏其后。

破坏手段

将跨机房的专线端口关闭即可,恢复则是将端口重新 up 即可,整个耗时可以控制在秒级。演练前,业务方需要提前将流量迁移到其他机房,观察跨机房的残余流量符合预期后再进行操作,否则就对残余流量进行排查,从而避免发生较为严重的故障。

落地建议

  • 如果近期公司内部发生类似的单机房故障,那是单机房破坏发起的最佳时机;

  • 通过数据分析来揭示风险,如跨机房交互的模块数量及比例,跨机房的流量带宽的增长趋势、使用率和成分分析,每次机房级网络调整各个业务受影响程度的统计,各个业务方对较大网络操作的接受度等;

  • 借助网络调整的机会,来间接实现第一次单机房破坏;

  • 如果仅仅破坏部分机房(如所有在线机房)是不足以发现所有的问题和隐患的,需要对所有机房逐一进行一次演练,才能发现一些潜藏的依赖和问题;

  • 单机房破坏的时间点尽量参照网络调整的时间点,大多数在凌晨 1 点左右进行。

依赖治理

重要性说明

依赖主要是第三方依赖和基础设施,包括但不限于 Mysql、Redis、K8S、DNS、LB、ELK、Hadoop 等,上述任何服务的故障,对业务影响都极为严重。以近期发生的 AWS 的 DNS 故障为例,持续 15 小时,多个业务受损。

排序考虑

基础设施可谓是牵一发动全身,故障频率低,故障影响大,因此依赖治理放在了单机和单机房之后。

破坏手段

基础服务和一般的业务场景无区别,主要也是通过单机破坏和单机房破坏等通用手段来进行快速的问题识别。

落地建议

  • 对于依赖的破坏,为了减少对业务方的影响,初期可以通过业务方的测试 / 预发环境 + 依赖的正式环境组合来进行破坏,也可以在离线机房对基础设施进行破坏;

  • 基础设施很大占比是开源软件,进行 Trace 的改造成本较高,因此要了解第三方依赖内部的关键点,并针对性的进行破坏演练。以 Mysql 为例来说,一般 Mysql 前面都会有一层 Proxy,如果 Proxy 正常,而 Mysql 异常会发生什么问题呢?事实证明,很多坑都在这个地方,而要想发现这个坑,那必然需要对 Mysql 的业务有一定的理解,也就是所谓的白盒;

  • 攘外必先安内,各类依赖大部分都是其他部门提供的服务,沟通成本和配合度上会有区别,因此需要先搞定自身的问题,然后再来进行第三方的依赖治理,不然很容易被人怼回去,毕竟很多依赖属于基础设施,牵一发动全身,人家配合的成本也是极大的;

  • 对于循环依赖需要在架构层面明确原则,然后再进行整体的改造。

全链路故障注入

重要性说明

所谓的精准注入,只影响特定的客户 ID、地域、设备类型、接口,还可以对注入的行为和比例等进行精准控制,从而大幅缩小故障范围,将故障的风险收敛到最小。因为是精准注入,因此必须具备全链路的观测能力,才能够将上述的细微的注入影响进行描述,否则,你可能很难回答,延时增加了 3s,是哪些模块的作用导致的。

传统的破坏方式,粒度只能控制在单机级别,很多影响非预期且及不可控。以 TC 命令为例,如果是按照一定比例进行破坏,你无法精准控制哪些请求会受到影响,运气足够差的情况下,也许你不希望被影响的请求全军覆没,而你期望被影响的请求则无一命中。另外,传统的破坏方式也没有统一的标准,有些需要用 tc 命令,有些是 iptables 命令,有些是写死 /etc/hosts 文件,没有方便易用的方式,且本身存在较大的风险,很难进行大范围推广。下面是两者的对比:

复制代码

 
 

tc qdisc add dev eth0 root netem delay 1000ms 500ms

 

tc qdisc add dev eth0 root netem loss 7% 25

 

iptables -A INPUT -p udp -m udp --dport 53 -j DROP

 

iptables -A INPUT -p tcp -s 10.0.0.0/8 -m limit --limit 500/s --limit-burst 100 -j ACCEPT

 

echo "127.0.0.1 s3.amazonaws.com" >> /etc/hosts

排序考虑

全链路追踪能力是故障注入的基础,需要所有的模块全部进行适配改造,否则调用链就会在某个阶段中断,进而导致不可完全追踪。同时对于一些开源软件,也需要进行适配,其成本是前四个阶段中最高的,耗时最长的,因此,故障注入往往会放在后期。

破坏手段

微服务化一般是基于 Istio 进行注入,或者在接入层进行注入均可。此处我们也在 Istio 的紧张改造中,后面可以给大家写专门的文章进行分享。

落地建议

对系统进行分级,首先将黄金流程进行改造,确保最核心的功能具备了能力,然后慢慢外扩到所有功能

CI/CD 整合

上述的四个手段,只能解决线上的存量问题,但无法阻止增量问题。因此,还需要将上述的各种能力,整合在 CI/CD 过程当中,在测试阶段进行拦截,从而彻底杜绝这类问题在线上发生的可能性。该部分目前我们也正在逐步建设和完善中,因此各种坑后续慢慢交流。

产品化

虽然通过 CI/CD 阶段的整合,可以将问题拦截在测试阶段,但这时候,每次都是测试阶段发现问题后让研发返工,对于研发就造成了极大的资源浪费。因此,需要将混沌工程形成的各种标准和规范,以产品化的形式交给研发同学使用,进而让大家都满意。

以单机起停脚本为例进行说明,每个模块的研发不同,可能存在的问题也不一样,这时候,发现问题后进行修改,不如提供一个统一的服务起停管理工具给研发使用,从而彻底解决该问题。开源软件类似 Systemd,Supervisor 和 Monit 都可以很好的解决这类问题,且对程序没有侵入性,不存在什么改造成本。

再高阶一些,就可以参考 Netflix 开源的各种软件 https://github.com/Netflix/

参考文章:

Chaos Monkey 升级了

Gremlin 发布面向混沌实验的应用级故障注入(ALF)平台

公众号介绍

智能运维公众号聚焦于运维领域,由一群BATJ的资深运维工程师所创建,在监控,部署,预案,混沌工程和故障分析等方向进行方法论和最佳实践的持续输出,目前有超20篇原创文章发表在InfoQ上,并在其他渠道广泛转载。

混沌工程落地的六个阶段相关推荐

  1. 从甲方到乙方,如何做好混沌工程的行业化落地

    作者:穹谷|阿里云技术专家,ChaosBlade 社区以及商业化产品的 Founder 和 Maintainer ,乐于参与混沌工程布道. 2021 年 12 月 7 日,由信通院主办.混沌工程实验室 ...

  2. 混沌工程:分布式系统稳定性的“疫苗”

    混沌工程:分布式系统稳定性的"疫苗" 一.容灾了,但没完全容灾 二.NetFlix.猴子与疫苗 三.混沌工程的价值 四.国内混沌工程开源项目现状 1.混沌之刃-ChaosBlade ...

  3. ChaosBlade:从混沌工程实验工具到混沌工程平台

    简介:ChaosBlade 是阿里巴巴 2019 年开源的混沌工程项目,已加入到 CNCF Sandbox 中.起初包含面向多环境.多语言的混沌工程实验工具 chaosblade,到现在发展到面向多集 ...

  4. 混沌工程——各大厂实践分享汇总(上篇)

    混沌工程在创业公司的实践(酷家乐) 会议介绍 主讲人:陆蓉蓉(小眠)- 酷家乐测试开发技术专家 以混沌工程实施顺序为主线,介绍了酷家乐混沌工程从开始到落地的实践.实践顺序:故障场景抽象->调研开 ...

  5. 六年打磨!阿里开源混沌工程工具 ChaosBlade

    阿里妹导读:减少故障的最好方法就是让故障经常性的发生.通过不断重复失败过程,持续提升系统的容错和弹性能力.今天,阿里巴巴把六年来在故障演练领域的创意和实践汇浓缩而成的工具进行开源,它就是 " ...

  6. 混沌工程将成标配?落地腾讯游戏后带来了哪些惊喜?丨Gdevops峰会

    时间:2021年5月28日 地点:广州阳光酒店 场次:运维 & DevOps专场 演讲主题:<持续保障系统的稳定性和高可用:腾讯游戏混沌工程实践> 议题要点及收获: 全面理解混沌工 ...

  7. 数据驱动的算法工程落地!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 开源数据平台 格物钛 X Datawhale 导读:随着科技浪潮的演进, ...

  8. 云原生背景下故障演练体系建设的思考与实践—云原生混沌工程系列之指南篇

    ​作者:​智妍(郑妍).​浣碧(何颖)​ 什么是混沌工程,云原生大潮下的混沌工程特点 通过使用云计算厂商如阿里云.AWS 等提供的服务,现代服务提供者得以用更低廉的成本,更稳定地进行丰富的软件服务提供 ...

  9. Netflix混沌工程手册Part 2:混沌工程原则

    本文翻译自Netflix工程师合著的 *Chaos Engineering*一书.这本书介绍了混沌工程的主要概念,以及如何在组织中实践这些概念和经验.也许我们开发的相关工具只适用于Netflix自身的 ...

最新文章

  1. 解决IIS中HTTP/1.1 500 Server Error错误的方法
  2. SQL中JOIN 的用法
  3. qui ajax,Ajax Fils de T Lamon
  4. 让陌生人迅速相爱的36个问题
  5. Splash 基础使用 JavaScript渲染 爬虫
  6. C语言中printf输出特殊字符(“%d“或者“\n“)
  7. RabbitMq--AMQP高级消息队列协议--简单了解
  8. my makefile 自动推导
  9. 尚硅谷SpringCloud Alibaba
  10. 火热升级:360Safe VS 雅虎助手
  11. mapgis矢量化怎么打分数_mapgis矢量化错了如何后退一步
  12. 浏览器被hao360劫持解决办法
  13. Java中的Math函数常用方法总结
  14. 何为ISM频段?ISM频段主要频率有哪些?
  15. Qt之界面实现技巧——包括任务栏不显示,自定义窗体,最大化最小化按钮等等全面总结
  16. 无capwap隧道的分布式网关实现思路
  17. 沃顿上学院自我管理课——米歇尔.奥巴马
  18. 实践:nginx代理,通过使用GeoIp模块获取访问者IP及访问地区信息
  19. 希腊罗马神话传说和《圣经》中的英语成语典故
  20. git 切换分支报错

热门文章

  1. dsp图像处理Prewitt算子边缘检测
  2. 鸿蒙跨屏协作实现原理,跨屏协作满足效率党 高效工作这几款手机必备
  3. GetDriveType将移动硬盘识别为DRIVE_FIXED 而不是DRIVE_REMOVABLE移动设备的问题
  4. oppo手机设置wifi代理和charles证书
  5. 广安职业技术学院计算机在那个校区,广安职业技术学院有几个校区哪个更好
  6. 【动态规划】入门练习题浅总
  7. 【Android Studio学习】第一篇、制作一个拥有登录和注册功能的简易APP
  8. DDOS防护如何建设?
  9. IDEA与GitHub的仓库相关联,幼儿园教学(狗头保命)
  10. 共享打印机无法打印问题解决