为知足 C++ 应用系统故障演练,阿里妈妈安全生产团队开源了 C++ 混沌实验执行器,填补了 C++ 应用混沌工程实验的空白,其遵循《混沌实验模型》,可经过 ChaosBlade 工具直接执行。项目详情点击这里! 。java
本文重点介绍该执行器的架构图、支持的实验场景,并以 Demo 为例介绍具体的使用方式,附录介绍了阿里妈妈内部混沌实验流程。linux
新版本 chaosblade 下载地址在这里!c++
目前支持的 C++ 混沌实验场景以下,具体使用方式可详见下文:git
解释说明:github
能够经过以下三种方式对 C++ 应用注入故障:api
接下来,经过一个 C++ 应用混沌实验 DEMO 给你们介绍前两种方式怎样实现一次 C++ 应用的混沌实验。安全
C++ 应用混沌实验DEMO架构
此次实验,咱们演练 linux 系统下 C++ 实现的 socket server 应用和 socket client 应用通信的过程当中,socket server 接口延迟 3 秒。接下来咱们下载所须要的 Socket Demo:
Socket-server.tar.gz下载地址,详情参考这里!socket
下载完成后,解压并编译:tcp
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"}
对实施实验的命令进行解析:
完成实验后,能够执行以下命令中止当前延迟的混沌实验:
./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++混沌实验执行器做者,阿里巴巴技术专家。
本文为云栖社区原创内容,未经容许不得转载。