网站文字模板,wordpress搬家dz论坛,中国公路建设行业协会网站这么上不,新品手机上市前言
为满足 C 应用系统故障演练#xff0c;阿里妈妈安全生产团队开源了 C 混沌实验执行器#xff0c;填补了 C 应用混沌工程实验的空白#xff0c;其遵循《混沌实验模型》#xff0c;可通过 ChaosBlade 工具直接执行。项目详情点击这里#xff01; 。
本文重点介绍该执…
前言
为满足 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 serverSocket-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.1Received 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/serverC应用可执行文件的位置和名字 (对应混沌实验模型的 Matcher实验规则匹配器)--forkMode: child表示我们把故障注入到子进程还是父进程 (对应混沌实验模型的 Matcher实验规则匹配器)--processName: server可以唯一标识出C应用进程的标识比如进程名 (对应混沌实验模型的 Matcher实验规则匹配器)--initParams: 9527C 进程正常启动的时候启动命令中执行文件后面的参数 (对应混沌实验模型的 Matcher实验规则匹配器)--libLoad: /home/lib如果启动C 进程的时候如果需要设置类库文件夹地址可以在这里设置比如 /home/lib如果启动时不需要加载自定义类库该项可以填入空格 (对应混沌实验模型的 Matcher实验规则匹配器)
完成实验后可以执行如下命令停止当前延迟的混沌实验
./blade destroy ec695fee1e458fc6ec695fee1e458fc6 是之前创建实验返回的 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.port8703 --script.location/home/staragent/plugins/monkeyking/chaosblade/lib/cplus/ 开始故障注入发送 url 请求
chaosblade/create?suide669d57f079a00cctargetcplusactiondelaybreakLinetcp_server.cpp:33fileLocateAndName/home/admin/socketServer/serverforkModechildprocessNameserverdelayDuration3initParams9527libLoad其中请求参数为
{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?suidec695fee1e458fc6
其中请求参数是
{suid: ec695fee1e458fc6
}suid: 请求参数之前创建实验返回的 UID
最后我们撤销刚才的实验准备即卸载 c Agent通过发url 请求chaosblade/remove
后续规划
后续会加入更多混沌实验场景也欢迎大家试用提 issue、prstar, 一起交流、探索和完善。
chaosblade github 地址点击这里
github 地址点击这里
附录
实验流程 原理 解释说明
以上流程中在实际的故障模拟演练或突袭演练中实验准备阶段故障注入阶段故障恢复阶段 和 实验器卸载阶段为故障注入方或蓝军操作故障效果采集监控项有效性验证故障处置阶段为故障模拟成功以后故障注入方或蓝军确认故障注入效果也是故障处置方或红军接收报警定位并处置故障的阶段
实验执行器底层基于 GDB 实现故障注入阶段有提到启动 gdb 一步。
原文链接 本文为云栖社区原创内容未经允许不得转载。