前言

为满足 C++ 应用系统故障演练,阿里妈妈安全生产团队开源了 C++ 混沌实验执行器,填补了 C++ 应用混沌工程实验的空白,其遵循《混沌实验模型》,可通过 ChaosBlade 工具直接执行。项目详情点击这里! 。

本文重点介绍该执行器的架构图、支持的实验场景,并以 Demo 为例介绍具体的使用方式,附录介绍了阿里妈妈内部混沌实验流程。

新版本 chaosblade 下载地址在这里!

实验场景

目前支持的 C++ 混沌实验场景如下,具体使用方式可详见下文:

  • 针对某个方法,或者某行代码注入延迟故障;
  • 针对某个方法,或者某行代码注入替换变量,或者对象值,可以制造调用第三方接口返回结果中包含错误码等等故障;
  • 针对某个方法,或者某行代码注入立刻退出方法并返回指定值(可以是错误值)的故障;

架构图


解释说明:

  • C++ 混沌实验执行器包括 8 个模块:模型匹配器模块、应用状态获取模块、流程控制模块、在应用运行中注入故障模块、应用未启动状态启动应用并注入故障模块、故障恢复模块、卸载实验器模块 和 日志记录模块;
  • 模型匹配器模块:会把用户传入的参数匹配《混沌实验模型》,发现不符合规范的参数,将停止执行,并返回用户相应提示;
  • 应用状态获取模块:获取待注入故障的 C++ 应用目前的状态;
  • 流程控制模块:可以控制整个实验器的运行流程;
  • 在应用运行中注入故障模块:在 C++ 应用运行状态时,在不改变应用原有代码,和编译文件的情况下,直接注入故障到进程;
  • 应用未启动状态启动应用并注入故障模块:在 C++ 应用未启动状态,在不改变应用原有代码,和编译文件的情况下,启动应用,并同时注入故障;
  • 故障恢复模块:当某一个实验或演练场景完成,基于该模块移除该场景的故障;
  • 卸载实验器模块:当所有实验或演练场景都完成,基于该模块移除应用所有故障,并退出 C++ 混沌实验执行器的进程;
  • 日志记录模块:可以把 C++ 混沌实验执行器运行过程中的情况记录到日志中;
  • C++ 应用:待注入故障的应用,在故障注入过程中,C++ 混沌实验执行器通过 attach 方式把 C++ 应用做为自己的子进程进行状态跟踪;
  • ChaosBlade:混沌实验注入工具;

使用方法

可以通过如下三种方式对 C++ 应用注入故障:

  • 登录待注入故障的机器,使用 chaosblade 提供的命令行方式实施演练;
  • 登录待注入故障的机器,手动启动 C++ 应用混沌实验执行器,直接调用执行器提供的 api 实施演练;
  • 通过混沌实验平台,可以很方便的对多台机器,甚至整个分组集群同时注入故障,阿里云 AHAS 后续会支持此执行器;

接下来,通过一个 C++ 应用混沌实验 DEMO 给大家介绍前两种方式怎样实现一次 C++ 应用的混沌实验。

C++ 应用混沌实验DEMO

这次实验,我们演练 linux 系统下 C++ 实现的 socket server 应用和 socket client 应用通讯的过程中,socket server 接口延迟 3 秒。接下来我们下载所需要的 Socket Demo:
Socket-server.tar.gz下载地址,详情参考这里

下载完成后,解压并编译:

g++ -g -c tcp_server.cpp -o tcp_server.o
g++ -g tcp_server.o main.cpp -I. -o server

Socket-client.tar.gz下载地址,详情参考这里

下载完成后,解压并编译:

g++ -g -c tcp_client.cpp -o tcp_client.o
g++ -g tcp_client.o main.cpp -I. -o client

启动 socket server:

./server 9527

启动 socket client:

./client 127.0.0.1 9527

启动成功以后会提示:"send message to server"

接下来输入想传给 socket server 内容比如:666

socket server 应用收到消息以后提示:

Received a connection from 127.0.0.1

Received message: 666
完成以上步骤表示 socket server 应用和 socket client 应用部署成功。

通过 chaosblade 的命令行方式实施演练
接下来我们要使用 blade 工具进行混沌实验,在执行实验前,我们需要先执行 prepare 命令,挂载所需要的 c++ agent:

./blade prepare cplus --port 8370 --wait-time 10

返回以下结果,表示实验准备成功:

{"code":200,"success":true,"result":"e669d57f079a00cc"}

我们开始实施混沌实验,调用 socket server 接口延迟 3 秒,我们执行以下命令:

./blade create cplus delay --delayDuration 3 --breakLine tcp_server.cpp:33 --fileLocateAndName /home/admin/socketServer/server --forkMode child --processName server --initParams 9527 --libLoad /home/lib

返回以下结果,表示执行成功;

{"code":200,"success":true,"result":"ec695fee1e458fc6"}

对实施实验的命令进行解析:

  • --delayDuration: 3,表示延迟 3 s;单位是 s (delay action 特有的过滤条件)
  • --breakLine: tcp_server.cpp:33, 加入断点的位置,可以是某一行,也可以是某个方法名 (对应混沌实验模型的 Matcher:实验规则匹配器)
  • --fileLocateAndName: /home/admin/socketServer/server,C++应用可执行文件的位置和名字 (对应混沌实验模型的 Matcher:实验规则匹配器)
  • --forkMode: child,表示我们把故障注入到子进程还是父进程 (对应混沌实验模型的 Matcher:实验规则匹配器)
  • --processName: server,可以唯一标识出C++应用进程的标识,比如进程名 (对应混沌实验模型的 Matcher:实验规则匹配器)
  • --initParams: 9527,C++ 进程正常启动的时候,启动命令中执行文件后面的参数 (对应混沌实验模型的 Matcher:实验规则匹配器)
  • --libLoad: /home/lib,如果启动C++ 进程的时候如果需要设置类库文件夹地址,可以在这里设置(比如 /home/lib),如果启动时,不需要加载自定义类库,该项可以填入空格 (对应混沌实验模型的 Matcher:实验规则匹配器)

完成实验后,可以执行如下命令停止当前延迟的混沌实验:

./blade destroy ec695fee1e458fc6

ec695fee1e458fc6 是之前创建实验返回的 UID

注:接收到 destroy 请求后,会删除与 UID 相对应的混沌实验规则。

不尽兴的话,我们再实施对 server 内部变量的修改,把 server 对外开放的监听端口 9527 改成 9529。

和刚才延迟命令参数差不多,因为相同的参数是演练 C++ 应用所需要的,不同的是没有了 --delayDuration,多了个 --varaibleName 和 --varaibleValue 参数。我们模拟调用刚才的服务对外开放的监听端口 9527 改成 9529:

./blade c cplus modify --varaibleName listen_port --varaibleValue 9529 --breakLine tcp_server.cpp:11 --fileLocateAndName /home/admin/socketServer/server --forkMode child --processName server --initParams 9527 --libLoad /home/lib

返回以下结果,并在 socket client 可验证端口是否被修改。

{"code":200,"success":true,"result":"09dd96f4c062df69"}

停止此次试验:

./blade destroy 09dd96f4c062df69

最后,我们撤销刚才的实验准备,即卸载 c++ Agent:

./blade revoke e669d57f079a00cc

直接调用执行器提供的 api 实施演练
挂载所需要的 c++ agent:

nohup java -jar chaosblade-exec-cplus.jar --server.port=8703 --script.location=/home/staragent/plugins/monkeyking/chaosblade/lib/cplus/ &

开始故障注入,发送 url 请求:

chaosblade/create?suid=e669d57f079a00cc&target=cplus&action=delay&breakLine=tcp_server.cpp:33&fileLocateAndName=/home/admin/socketServer/server&forkMode=child&processName=server&delayDuration=3&initParams=9527&libLoad=

其中请求参数为

{
"suid": "e669d57f079a00cc",
"target": "cplus",
"action": "delay",
"breakLine": "tcp_server.cpp:33",
"fileLocateAndName": "/home/admin/socketServer/server",
"forkMode": "child",
"processName": "server",
"delayDuration": “3”,
"initParams": "9527",
"libLoad": ""
}

这种方式增加了几个参数,解析如下:

create: 创建混沌实验请求

suid: 请求参数,实验的 ID,后续停止实验会用到此 ID

target: 请求参数,实验的组件目标,cplus 代表 针对 C++ 应用的实验

action: 请求参数,执行实验的场景,delay

注:

suid、target、action 是 create 请求的必要参数, breakLine、fileLocateAndName、forkMode、processName、delayDuration、initParams、libLoad 参数根据 target 和 action 的不同而不同。

接收到请求,会根据 target 和 action 调用参数校验器,验证参数值是否合法,如果合法,则记录此次试验;

对应组件埋点触发时,如果查询到有此组件的实验,则获取匹配器所需参数,和下发的实验规则进行匹配,匹配成功,则调用场景执行器触发实验。

停止此次试验,通过发url 请求:chaosblade/destroy?suid=ec695fee1e458fc6

其中请求参数是:

{
"suid": "ec695fee1e458fc6"
}

suid: 请求参数,之前创建实验返回的 UID

最后,我们撤销刚才的实验准备,即卸载 c++ Agent,通过发url 请求:chaosblade/remove

后续规划

后续会加入更多混沌实验场景,也欢迎大家试用,提 issue、pr,star, 一起交流、探索和完善。

chaosblade github 地址点击这里

github 地址点击这里

附录

实验流程 & 原理


解释说明:

以上流程中,在实际的故障模拟演练,或突袭演练中,实验准备阶段,故障注入阶段,故障恢复阶段 和 实验器卸载阶段,为故障注入方(或蓝军)操作,故障效果采集监控项有效性验证,故障处置阶段为故障模拟成功以后,故障注入方(或蓝军)确认故障注入效果,也是故障处置方(或红军)接收报警,定位,并处置故障的阶段;

实验执行器底层基于 GDB 实现,故障注入阶段有提到启动 gdb 一步。

本文作者:周鹏飞,花名鹏毅(@leonardo669),C++混沌实验执行器作者,阿里巴巴技术专家。

原文链接

本文为云栖社区原创内容,未经允许不得转载。

ChaosBlade 发布对 C++ 应用混沌实验的支持的更多相关文章

  1. Kafka 2.5.0发布——弃用对Scala2.11的支持

    近日Kafka发布了最新版本 2.5.0,增加了很多新功能: 下载地址:https://kafka.apache.org/downloads#2.5.0 对TLS 1.3的支持(默认为1.2) 引入用 ...

  2. 【iCore2 模块相关资料】发布模块DEMO 代码包,目前支持 iM_TFT30、 iM_LAN和 iM_RGB 三个模块

    iCore2 模块底板 和部分模块发布了,所以我们做了一个 DEMO 代码包,此代码包现在有以下功能: 1.支持 iM_TFT30 3寸触摸液晶模块(硬件已发布): 2.支持 iM_LAN 100M以 ...

  3. jQuery发布1.9正式版,最后支持IE 6/7/8

    jQuery 于 2013/1/15 正式发布了 1.9 版本,这个版本最值得关注的,不是又增加了什么新功能,而是它去掉了哪些东西!jQuery 1.9 删除和改动了不少过时的 API,升级后可能会导 ...

  4. 重磅发布:阿里开源 Open JDK 长期支持版本 Alibaba Dragonwell

    3 月 21 日北京阿里云峰会,阿里巴巴正式宣布对外开源 OpenJDK 长期支持版本 Alibaba Dragonwell.作为 Java 全球管理组织 Java Community Process ...

  5. xmake v2.3.7 发布, 新增 tinyc 和 emscripten 工具链支持

    xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能 ...

  6. xmake v2.6.2 发布,新增 Linux 内核驱动模块构建支持

    Xmake 是一个基于 Lua 的轻量级跨平台构建工具. 它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时. 它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLis ...

  7. 番茄日志发布1.0.3版本-增加Kafka支持

    番茄日志(TomatoLog)能做什么 可能你是第一次听说TomatoLog,没关系,我可以从头告诉你,通过了解番茄日志,希望能帮助有需要的朋友,番茄日志处理将大大降低你采集.分析.处理日志的过程. ...

  8. xmake v2.2.9 发布, 新增c++20 modules的实验性支持

    这个版本没啥太大新特性,主要对c++20 modules进行了实验性支持,目前支持clang/msvc编译器,除此之外改进了不少使用体验,并且提高了一些稳定性. 另外,这个版本新增了socket.io ...

  9. 微服务开源生态报告 No.6

    「微服务开源生态报告」,汇集各个开源项目近期的社区动态,帮助开发者们更高效的了解到各开源项目的最新进展. 社区动态包括,但不限于:版本发布.人员动态.项目动态和规划.培训和活动. 非常欢迎国内其他微服 ...

随机推荐

  1. Odoo Documentation : Environment

    Environment The Environment stores various contextual data(上下文数据 ) used by the ORM: the database cur ...

  2. O(N)求出1~n逆元

    这是一个黑科技. 可以将某些题目硬生生地压到O(N) 不过这求的是1~n的逆元,多了不行-- 结论 接下来放式子: inv[i]=(M-M/i)*inv[M%i]%M; 用数学方法来表示: i−1=( ...

  3. Web API 上传下载文件

    1.引用了一个第三方组件 ICSharpCode.SharpZipLib.Zip; 2.具体代码 实体类,可以用hashtable 替代 ,感觉hashtable 比较灵活 public class ...

  4. 「EJOI2017」-骆驼

    第一道构造题祭…… 文字叙述: 题目的提示很明显. $N$是$5$的倍数,所以考虑分成$5 \times 5$小块连在一起. 首先通过打表证明, 小块里从任何一点出发,经过所有的格,从任一一点跳出,一 ...

  5. Ceisum官方教程1 -- 开始

    原文地址:https://cesium.com/docs/tutorials/getting-started/ 学会使用全球地形.影像.3d tile(模型切片).地理编码创建一个Cesium程序. ...

  6. 【DM642】H.264源代码在DM642上的移植

    TI公司提供了用于C语言开发的CCS(Code Composer Studio),该平台包括了优化的ANSI编译器,使之可以使用C语言开发DSP程序.这种方法不仅使DSP开发的速度大大加快,而且DSP ...

  7. 901. Online Stock Span [短于线性的时间统计单个元素的Span ]

    Span 指这个元素之前连续的小于这个元素的值有多少个 原理: 维护递减栈 这个栈内的元素是递减的序列 新到一个元素x 依次出栈比x小的(也就是这个元素的Span) 这种问题的关键在于 新来的元素如果 ...

  8. 卸载VS2015之后,安装VS2017出错

    安装出现问题. 可通过以下方式排查包故障问题: 1. 使用以下搜索 URL 来搜索针对每个包故障的解决方案 2. 针对受与影响的工作负荷或组件修改选项,然后重新尝试安装 3. 从计算机上删除产品,然后 ...

  9. CSS--去除除文本基线的几种方式

    削除文本基线的几种方式:1.display:block2.vertical-align:middle3.font-size:0px

  10. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---状态模式[转]

    {没有应用状态模式的代码} //工程文件 program Project1; {$APPTYPE CONSOLE} uses  uGumballMachine in 'uGumballMachine. ...