混沌工程之 ChaoBlade 的实现原理
一、混沌工程的定义
根据混沌工程的 principles,里面这样定义了:
Chaos Engineering is the discipline of experimenting on a system inorder to build confidence in the system’s capability to withstandturbulent conditions in production.
中文翻译是这样的:
混沌工程是在分布式系统上进行实验的学科, 目的是建立对系统抵御生产环境中失控条件的能力以及信心。英文中似乎没有分布式系统这个字眼,看来中文翻译的时候把范围说小了。
它有原则描述:
建立一个围绕稳定状态行为的假说
多样化真实世界的事件
在生产环境中运行实验
持续自动化运行实验
最小化爆炸半径
看着有些比较新鲜的词还挺有意思。也有人把它和异常测试、故障测试啥的给区分开来说明。要说还是得整概念,概念还是要先于技术的发展,给技术指导一个方向,而落地嘛,总是需要一些时间的。
据说阿里的 chaosblade 开源工具算是具有混沌工程特点的工具。下面看一下它的功能。
二、下载并解压
这个工具非常简单,下载解压就能用。
三、使用及实现
1、模拟 CPU 负载
查看模拟效果:
通过上图可以看到确实实现了 us CPU 使用率消耗的效果。
再来看一下它是怎么实现的。
burnCpu 这个方法里的。关键源码如下:
其他关联的代码就不帖了。总的来说,就是写了一个小程序把 CPU 消耗掉,这个功能一个 do while 就可以了。
2、模拟 IO 高
查看模拟效果:
从上面的结果来看,确实把 IO 给消耗掉了。下来我们看看它是怎么实现消耗的。
通过查看 io 高的进程就可以看到这两个进程。也就是说,chaosblade 调用 dd 实现的 IO 高模拟。关键实现代码如下:
一个读一个写。
3、模拟端口不通
3.1、模拟之前
可以看到这个端口是通的
3.2、模拟端口不通
3.3、模拟之后
可以看到端口已经连不上了
可是怎么实现的端口连不上呢?
3.4、实现代码
通过如下代码,可以看到,ChaosBlade 是通过 iptables 命令添加 drop 规则来实现的禁用端口。
以下代码在 dropnetwork.go
中可以看到:
iptables 配置:
通过查询 iptables 记录,可以看到,ChaoBlade 添加了两条记录把 9100 端口的 tcp、udp 包都 drop 掉。大家注意一下,这个操作只是暂时生效,iptables 的文件中是没有记录的。
这种模拟效果是什么样呢?
3.5、模拟效果解析
模拟之前抓包结果:
从上面的结果来看,没有创建 iptable 规则之前,通讯完全正常标准的 tcp 握手和挥手的过程呀
3.6、模拟之后抓包结果
创建 iptables 之后,我们照样执行尝试连接的动作。看到服务端还是抓到了 syn 包的
(看到这里,我想有点安全意识的人都知道风险在哪了吧,攻击场景立即在脑子里跳出来了)
在线上环境中,在这个层面把 tcp 握手就断掉的真实应用的问题场景还是非常少的。tcp 半连接有问题的时候,才可能出现这种情况。
如果要想模拟应用层面的 connection 问题,ChaosBlade 做不到的。
4、丢包模拟
4.1、模拟命令
4.2、丢包效果
4.3、代码实现
通过以上代码,可以看到 ChaosBlade 是通过 traffic control 添加过滤器队列、分类、过滤器来实现的。也就是 tc 的 netem loss。
5、模拟网络延时
5.1、模拟命令
5.2、模拟效果
5.3、代码实现
通过以上代码,可以看到 ChaosBlade 是也是通过 traffic control 添加过滤器队列、分类、过滤器来实现的网络延时。也就是 tc 的 netem delay。
也即是 ChaosBalde 是通过将 tc 来实现的模拟丢包和延时。
四、总结
这个 chaosblade 实际上可以看做是一个工具集,集成了各种小工具。
混沌的帽子在这个工具,现在套着还是有点大。要想用它来实现上千上万个节点的模拟,还需要各种集成配置,远程执行等工具的配合。
大家再回过头来看看上面写的混沌工程定义的原则。这些模拟有没有符合这些原则呢?如果各位有处理生产环境的经验的话,会知道,这样的模拟,其实和真实环境下的 CPU 高、IO 高的逻辑还是有不同的。
通常我们说一个应用程序的在 CPU 高的情况下是否能保持健壮。有两种含义:
其他程序在消耗 CPU 较高的情况下,被测试的程序是否能保持健壮。
是指的是这个应用本身的代码消耗了大量 CPU 的情况下,被测试程序是否能保持健壮。
有处理过生产类似问题的朋友们会知道,第一种情况,除了部署上的不合理会出现之外,几乎是看不到的。chaosblade 其实是模拟的这种情况。而第二种情况,chaosblade 现在还是做不到的。
但第二种情况却是测试过程中的重点。
其实英文中的 chaos 的含义是混乱。这和中文的混沌是非常不同的概念,现在这个概念被翻译成混沌,真是拉低了混沌这个词本身该有的寓意。
而混沌工程是什么呢,在各个层面又要如何实现呢?其实不是工具有多难实现的问题。而是在具体的实现逻辑是什么?是否真实描述生产场景?
所以最核心的是场景设计
相关系列:
版权声明: 本文为 InfoQ 作者【zuozewei】的原创文章。
原文链接:【http://xie.infoq.cn/article/594ff37f4ff92073c038824d9】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论