在最简单的C/S模型当中,一次网络通讯会发生这样的过程:
1.客户端将消息发送到网络上
2.网络向服务器发送消息
3.服务器验证消息
4.如果需要,服务器更新其状态
5.服务器将回复发送到网络上
6.网络向客户端发送回复
7.客户端验证回复
8.如果需要,客户端更新其状态
在这个过程中可能发生的所有故障排列是令人难以置信的。
例如,网络随时可能出现故障,数据存储可能出现故障或过载,或者验证逻辑可能失败导致应用程序崩溃。
应对这一挑战的传统方法是测试。但是测试解决的问题常常是在有一个期望结果的前提下,通过断言来验证已知条件,例如结果是否是我们期待的,函数结果返回是否正确。
问题发现
但随着分布式系统变得越来越复杂,测试已经达到极限。它通常无法解决生产环境的复杂性,例如发生在网络上的随机故障和其他奇怪的间歇性错误、配置限制和配置漂移。
那未知的呢?你怎么能测试你不知道的东西?
例如,在实例动态启动和停止的系统中,如果任何实例磁盘空间不足会发生什么情况?
如果一个实例没有剩余空间来写入日志,它在大多数情况下会快速失败,这是一个真正的问题,
因为快速失败会产生一个黑洞。因为它失败得很快,通常会欺骗负载均衡器,认为该实例可以自由地接收更多请求,而这反过来也会导致更多的失败。
如果我们能更早地发现这一点,我们就可以事先进行改进并避免中断。例如:
1、使用日志轮换
2、使用集中式日志服务
3、监控磁盘空间
4、在每周运营会议上审查指标
5、当设备上只剩下 10% 的磁盘空间时发出一些警报
幸运的是,有一种实践可以帮助解决这种未知数——正如你可能猜到的,混沌工程。
混沌工程
混沌工程是一个过程:
1、通过创建破坏性事件(例如服务器中断或 API 限制)来对测试或生产环境中的应用程序施加压力
2、观察系统如何响应
3、实施改进
我们这样做是为了证明或反驳我们对系统处理这些破坏性事件的能力的假设。
与其让这些破坏性事件发生在凌晨 1 点、周末和生产环境中,我们不如在受控环境中在工作时间创建它们。
混沌工程不是无目的地随机注入故障而是通过精心计划的实验在受控环境中注入故障,以建立对应用程序和工具的信心,以承受动荡的条件。
虽然混沌工程是一个很好的选择,但事实是它很难开始,因为在大多数情况下,你必须将不同的工具、脚本和库拼接在一起,以涵盖可以在系统中注入的所有故障。
基础设施、网络、应用程序——每个目标都有不同的工作工具,无论是库、代理还是要安装的容器。客户通常不想在他们的应用程序中安装任何额外的东西——要安装的东西越多,就越复杂。或者,如果必须安装东西,它们需要集中管理和统一。
ChaosBlade
为此我们选择将ChaosBlade封装成一个统一的网页工具,选择ChaosBlade 的原因是它支持目前主流的故障注入场景,相对其他几个故障注入工具,ChaosBlade 故障注入覆盖的场景最全,支持四大类、几十种常用的故障注入能力。
该网页工具的运行方式是提供一个对于用户非常友好的界面,注入故障时只需要点击相应故障的按钮,该故障会以HTTP请求的方式发送到测试环境的ChasosBlade中,ChaosBlade以命令行的方式来执行具体的故障注入请求,同时将返回执行的结果。
与此同时因为在实验环境下,没有真正的用户,无法预测故障会对实际用户产生怎样的影响,因此我们将利用Xmeter(该工具提供与Jmeter类似的发压功能不同的是其有网页管理端,且有部署好的发压服务器)的API接口,将其也进一步封装为前端网页按钮,将发压、暂停、监控结果从其原有网页端,与故障注入工具统一放在同一个网页端,这样从故障注入,流量模拟,监控结果均可以在同一个网页端实现。
通过我们的工具,对于测试系统而言无需再部署其他复杂的应用,插件或是容器,只需要将包含ChasoBlade的NAS挂载上去,对于测试人员而言,无需了解混沌测试的复杂性。
例如Chaosblade该如何使用CLI注入不同的故障,如何使用Xmeter工具进行发压,只需通过网页端将录制好的Jmeter脚本上传至网页端,点击开始发压即可完成对于测试系统的流量模拟,将一个复杂的概念封装成了简单易用的工具。
在我们进行混沌工程的实践中,也发现了一部分工具本身的问题,例如对于Pass上20核的服务器,故障注入工具无法真正的注入CPU利用率达到80%的故障,只有部分核心达到了80%的利用率。
在注入pod异常关闭时,发现故障工具注入工具无法对pod进行关闭。
因此,单一的故障注入工具也许无法完全解决我们的问题,集合多个故障注入工具,结合业务环境自主开发,最终封装为统一的工具接口应当是我们的方向。
混沌工程的意义在让我们对未知做好了准备:
1.提高了系统弹性
2.暴露监控、可观察性和警报盲点
3.提高恢复时间和操作技能
总结
最后我想引用《道德经》的一句话,“合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。”
所以,我的建议是尝试一下,敢于开始,踏上混沌工程之旅。