在分布式系统架构下,服务组件之间的调用链路和访问关系愈发的复杂,同时很难评估单个服务组件故障对整个系统的影响。监控告警的不完善导致发现问题、定位问题难度增大,同时业务和技术迭代快,如何持续保障系统的稳定性和高可用性受到很大的挑战。为此,混沌工程的出现显得尤为重要,在可控范围或环境下,通过故障注入,来持续提升系统的稳定性和高可用能力,提高业务连续性。
混沌工程(Chaos Engineering)是一种在分布式系统上进行由经验指导的受控实验,观察系统行为并发现系统弱点,以建立对系统在规模增大时因意外条件引发混乱的能力和信心。它的目标是提高系统对不确定事件的抵御能力。
混沌工程是在分布式系统上进行的实验科学,旨在提高系统容错性,建立系统抵御生产环境中发生不可预知问题的信心。
混沌工程最早是由Netflix公司工程师将系统迁移到AWS过程中,为保证EC2实例故障不会对业务造成影响,创建了Chaos Monkey,会随机终止在生产环境中运行的EC2实例。工程师可以快速了解他们正在构建的服务是否健壮,有足够的弹性,可以容忍计划外的故障。至此,混沌工程开始兴起。在国内像阿里巴巴这样的互联网公司对混沌工程的探索和实践也有十几年的时间,并有提供一些开源的混沌工程平台比如Chaos Blade。[1]
了解了混沌工程的发展历程,再来看看混沌工程在分布式基础架构下能做什么,带来什么样的价值。从系统产品的角色和应用场景两个不同角度来看,混沌工程能够验证系统稳定性和可靠性,增强系统的可预见性和可预测性。[2]
混沌工程的目的是验证生产系统的稳定性和可用性,保障业务的连续性,因此在设计混沌工程实验时,遵循以上五大基本原则为基础,提高实验的价值。
混沌工程成熟度模型(CEMM)是一种评估和提升混沌工程能力的框架,旨在帮助企业建立可靠的混沌工程能力,提升软件系统的稳定性和可靠性。CEMM包含五个成熟度级别,每个级别都对应不同的能力要求和目标,从初始级(Level 1)到优化级(Level 5),逐渐提升混沌工程能力的成熟度。[3]
CEMM可以帮助企业评估自身的混沌工程能力水平,并指导其逐步提升混沌工程能力的成熟度,实现软件系统的稳定性和可靠性。
基于混沌工程,通过类生产环境对应用系统和服务器中随机注入故障,用以检测系统在部分对象或功能异常时候能否正常的对外提供服务。通过模拟真实生产环境下的故障场景,建立包括应用层、系统层以及容器层的故障注入能力,提供应急协同、故障定位和故障恢复的运维能力。混沌工程实践流程包括以下四个阶段:
在实际落地实践的时候,各个企业会结合自己的运维场景构建混沌工程平台,以模拟真实的故障场景和系统监控指标。如中电金信结合银行系统的特点,打造适用于银行系统的混沌案例库,通过实验管理的方式进行红蓝对抗演练。[4]
在上图的混沌工程实践中,将金融行业关注的高可用案例封装成混沌案例库,其中包含高可用相关停应用、停服务、宕网卡、宕机、假死等案例,以及从生产事件、应急预案中抽象的如存储占满、损坏,交易一致性相关等案例。
混沌工程的故障注入场景,在业界按照IaaS层、PaaS层和SaaS层划分了故障画像,如下图所示,比如基础设施层的磁盘故障、网络异常,数据库连接池满、CPU消耗异常、业务线程池满、进程假活等都是常见的故障场景。针对这些已知的故障场景模拟设计故障,以验证真实业务系统的稳定性。[5]
可观测性指标的设计是混沌工程实验成功与否的关键指标之一,良好的系统可观测性会给混沌工程实验带来一个强有力的数据支撑,为后续的实验结果解读、问题追踪和最终解决提供了坚实的基础。常见的可观测指标包括以下部分:
这些指标可以为混沌工程实验提供有力的数据支撑,帮助团队解读实验结果、追踪问题以及最终解决问题。在指标的观测中,还可以结合一些统计学方法如贝叶斯检测、指数平滑、PCA分析等对多个指标项进行关联分析,以确定准确的系统影响。
Chaosblade是阿里巴巴内部MonkeyKing对外开源的项目,建立在阿里十几年的故障测试和演练基础上,GitHub地址为https://github.com/chaosblade-io/chaosblade。Chaosblade目前支持的实验场景包括基础设施资源、Java类应用、C++应用、Docker容器和云原生平台。
1)下载Chaosblade实验包
##下载路径
https://github.com/chaosblade-io/chaosblade/releases
##解压安装包
# tar -xzvf chaosblade-1.7.2-linux-amd64.tar.gz
[root@tango-DB01 chaosblade-1.7.2]# pwd
/usr/local/chaosblade/chaosblade-1.7.2
[root@tango-DB01 chaosblade-1.7.2]# ls -l
total 39324
drwxr-xr-x 2 root root 111 May 19 11:36 bin
-rwxr-xr-x 1 root root 40265968 May 19 11:32 blade
drwxr-xr-x 4 root root 34 May 19 11:44 lib
drwxr-xr-x 2 root root 316 May 19 11:44 yaml
2)使用chaosblade模拟故障场景
##1、模拟CPU满载实验
##执行命令./blade create cpu load,code=200表示执行成功,
{"code":200,"success":true,"result":"9eb3770e8fa40287"}
##使用TOP显示执行效果,CPU使用率已经接近99%
Tasks: 163 total, 2 running, 161 sleeping, 0 stopped, 0 zombie
%Cpu0 : 98.9 us, 0.7 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.4 si, 0.0 st
KiB Mem : 1867024 total, 600356 free, 639152 used, 627516 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 1040792 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2003 root 20 0 710452 9632 3008 R 98.7 0.5 2:16.89 chaos_os
##销毁实验
# ./blade destroy 9eb3770e8fa40287
{"code":200,"success":true,"result":{"target":"cpu","action":"fullload","ActionProcessHang":false}}
再次查看CPU使用率,已经恢复正常
##2、指定百分比负载
# ./blade create cpu load --cpu-percent 60
{"code":200,"success":true,"result":"847419202a931560"}
##查看CPU使用情况
top - 19:30:23 up 26 min, 2 users, load average: 1.24, 1.31, 0.81
Tasks: 163 total, 1 running, 162 sleeping, 0 stopped, 0 zombie
%Cpu0 : 59.4 us, 0.3 sy, 0.0 ni, 40.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1867024 total, 602488 free, 636560 used, 627976 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 1043252 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2111 root 20 0 710452 7352 2880 S 59.5 0.4 0:24.80 chaos_os
Chaosblade提供了混沌实验的基础能力,在这之上封装成混沌工程平台进行演练,支持的故障场景包括:
Chaosblade混沌实验之前需要回答实验的目标、实施的范围、实施的具体步骤、生效的匹配条件这几个问题,基于这些问题抽象出Target、Scope、Matcher和Action模型。
基于以上模型,再进行chaosblade故障场景的模拟实验。
参考资料: