前言

为满足 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. PHP SSH2 不支持 IdentityFile

    有的情况下 我们会用到 类似命令行 sftp -o IdentityFile=.ssh/identity  username@host方式 登陆, 想用php 操作, 但是 php 现在看是不支持的, ...

  2. 1008-Redo

    关于flag,都立下了 T1 考试的时候就觉得是贪心,但是不会反悔emm…… 于是正解就是一个堆优化可反悔的贪心=.= 每次找前面最小的,于是是小根堆. 我们在交易的时候发现后面的一个可以更优. 于是 ...

  3. Spring Boot入门样例-001-Java和Maven安装配置

    Spring Boot入门样例-001-Java和Maven安装配置 本文说明Java和Maven在windows下的安装和配置 前言 本Spring Boot入门样例准备工作参考: Spring B ...

  4. redis学习笔记06-主从复制和哨兵机制

    1.主从复制 为了保证线上业务的持续运行,防止主节点因宕机而重启数据恢复消耗太长时间,通常会准备一个备用节点,备份主节点的数据,当主节点出问题时立马顶上.这种机制就叫做主从复制.在了解redis的主从 ...

  5. Leetcode89. Gray Code格雷编码

    给定一个代表编码总位数的非负整数 n,打印其格雷编码序列.格雷编码序列必须以 0 开头. 示例 1: 输入: 2 输出: [0,1,3,2] 解释: 00 - 0 01 - 1 11 - 3 10 - ...

  6. ubuntu16.04环境编译gSOAP

     一.gSOAP简介 SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换.或者更简单地说:SOAP 是用于访问网络服务的协议. SOAP 提供了一种标准的方法,使得运行在 ...

  7. 只要三步!阿里云DLA帮你处理海量JSON数据

    概述 您可能有大量应用程序产生的JSON数据,您可能需要对这些JSON数据进行整理,去除不想要的字段,或者只保留想要的字段,或者仅仅是进行数据查询. 那么,利用阿里云Data Lake Analyti ...

  8. 20190716-T3-奇袭

    我要嗝了 我经过一系列努力,寻找了一系列,各种复杂度的方法. 1>纯暴力 复杂度:$\Theta(N^5)$ 不多解释,上代码: 空间复杂度无法承受,如果考试偏要写这个不妨动态开数组: 例: # ...

  9. NSIS之MUI

    NSIS 2.0 版本支持定制的用户界面.所谓的 Modern UI(下称 MUI) 就是一种模仿最新的 Windows 界面风格的界面系统.MUI 改变了 NSIS 脚本的编写习惯,它使用 NSIS ...

  10. What every computer science major should know 每一个计算机科学专业的毕业生都应该都知道的

    Given the expansive growth in the field, it's become challenging to discern what belongs in a modern ...