爲知足 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++混沌實驗執行器做者,阿里巴巴技術專家。
本文爲雲棲社區原創內容,未經容許不得轉載。