在讲混沌之前,我们可以先思考一下混沌、混沌工程和我们线上服务之间的关联。
我们经常听到的故事是,一只在亚马逊河流中的蝴蝶,煽动了几下翅膀,就能在美国引起一场龙卷风。这个故事背后隐藏着一个重要的学科,那就混沌。
早在 20 世纪 60 年代,洛伦兹就发现了混沌现象。他是一个数学家,但是从事气象学研究,使用数学模型研究天气时发现,初始值的微小变化,会导致结果的巨大差异。对初值极其敏感,是判断为混沌状态的重要特征。之后,又经过十几年的发展和研究,才将初值敏感的特征命名为蝴蝶效应,被人们所熟知。
而我们谈的混沌工程,实际上指的是来自 2008 年 Netflix 的工程实践。
在 Netflix 上云的过程中,他们发现了一个问题,上云之后,服务的稳定性会下降。原因在于,网络、机器、存储等,都是不可控的。
因此,他们开发了一个工具,叫做 Chaos Monkey,主动破坏云服务,来发现系统的弱点,从而提高系统的稳定性。
目前,这是一个上万 star 的开源项目, https://github.com/Netflix/chaosmonkey 。
犹如一只进入了数据中心的猴子,他会随机破坏系统,你会发现系统的脆弱点,也会从故障中学习到处理经验。
目前互联网应用以微服务为主,微服务的特点是,服务之间的依赖关系非常复杂。那么,微服务具不具备混沌的特征呢?
以下是我总结的异同点。
相同点:
我们所处的基础设施环境、软件架构越来越复杂,故障已经不可避免。从经典的架构看,IaaS 层可能会有服务宕机、网络抖动;PaaS 层可能会有数据库宕机、负载不均、CPU 抢占;SaaS 层可能会遇到 OOM、CPU 限流、连不上数据库等故障。
实际上,复杂度已经远超个人能够全盘掌控的程度。我们与其等待故障,不如主动出击去制造故障。
"我怀疑是 CPU 不够"、"我怀疑是网络有问题"、 "我怀疑连不上数据库"、”我怀疑....“
当我们怀疑某个不确定性因素的时候,不用仅仅停留在猜想阶段,而是需要一次混沌工程实验。
主要分为两个部分:
目前已经在测试集群部署,提供了三种故障注入能力。
控制平面的工作流:
混沌工程能够揭露生产系统中未知的缺陷,提高系统的稳定性。
这里需要明确的一点是,如果已经确定混沌实验会出现问题,说明现有的系统并没有任何容错或者应对机制,那么这种实验也就没有任何意义。
为了方便大家去落地与具体操作,这里给出一个简单的实施步骤。
在这个基础上,我们在每次实施混沌实验时,都会有个规范。理想情况下,应该是混沌平台提供这样的能力,让大家能够管理故障、记录现象、制定应对策略、复盘总结等,辅助整个混沌工程实验的生命周期。
但目前内部还没有开发这样的平台,因此强烈建议大家先按照这个流程用文档的形式先记录下来,后续再整理到平台上。
对于混沌工程和稳定性,信通院有提出一个标准 CEMM,对标 3 级来建设我们的混沌工程平台。简单说几点:
混沌实验的结果能够反馈应用的健康状况指标。这就要求,我们要将混沌工程实验融入到应用的生命周期中,建立评价机制。让应用必须经过混沌工程实验的检验才能上线。
自助式创建实验,自动运行实验。其实我们已经达到要求。但目前的实验形式比较简陋,缺乏对完整实验过程的管理。
可通过实验工具持续收集实验结果,但需要人工分析和解读。在我开发混沌注入的功能之前,我们就在人工的进行各种混沌工程实验,但缺少自动化和工具的支持。经过经验的积累,下一步,强烈建议加强工具的支持,故障注入工具、指标收集工具、结果分析工具、异常处理工具、故障恢复工具等。
在研究各种混沌工程实践时,我还接触到一个有意思的概念,应用的韧性。
刚接触到这个概念时,总感觉很熟悉,但又很难说清楚。因此,我想了一个形象的比喻,如上图的不倒翁,应用可以左摇右摆,但是依然能保持平衡。这就要求,应用能够应对各种不稳定、不确定性、突发的状况时,能够自愈。经过短暂地波动之后,能够迅速地恢复平衡状态。
对应用不倒翁的定位,需要做以下的设计:
我们对异常要有感知能力。能感知,才能应对,以及后续进行更多的动作。如果应用异常了,都没人关注,肯定是不行的。
除了感知异常,还要能容忍一定的异常。应用不应该一丢包就 Crash 掉,应该具有一定的容错能力。
在前段时间,我们已经在测试集群,进行了持续的随机混沌工程实验。随机抽取应用,随机选择故障注入类型、故障注入参数,发现了不少问题。
混沌工程平台侧希望能够持续的跟进一些应用韧性改造的 Case,将其作为经典案例,予以推广。这些沉淀下来的方案,就是适合我们当前基础设施、业务形态对于韧性改造的最佳实践。
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞1
添加新评论0 条评论