故障演练-使用ChaosBlade进行混沌实验_第1页
故障演练-使用ChaosBlade进行混沌实验_第2页
故障演练-使用ChaosBlade进行混沌实验_第3页
故障演练-使用ChaosBlade进行混沌实验_第4页
故障演练-使用ChaosBlade进行混沌实验_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

故障演练--使⽤ChaosBlade进⾏混沌实验⽬录⼀、ChaosBlade简介ChaosBlade是阿⾥开源的混沌⼯程品牌,包含⼯具和平台等项⽬。ChaosBlade按照混沌⼯程的思想,将故障抽象成了⼀个个实验,并按照科学实验的⽅法对其过程进⾏组织。chaosblade⼯具⽀持了⼤量的故障场景和丰富的命令参数,能够很⽅便地对常见故障场景进⾏实验。⼆、部分JVM实验介绍相⽐于CPU使⽤率飙升等基础设施相关故障导致的系统不稳定,我们的关注点⽬前更加集中在:系统所依赖的两⽅或三⽅服务故不稳定情况。这些故障基本都可以使⽤修改服务代码逻辑的⽅式实现,也就是chaosblade中JVM实验部分所涵盖的内容。所以,以下主要介绍JVM实验场景。(说明:以下代码块中$开头的是需要输⼊的命令;#开头的⽂字是注释;正常⽆开头标识的为命令返回)1、权限操作⼈员需要提前申请好与线上服务相同的权限,我们这⾥通常就是要演练的那台机器上的work权限。环境配置chaosblade⼯具是开箱即⽤的,只需要下载并解压缩其release⽂件,就可以调⽤其中的可执⾏⽂件来进⾏故障注⼊。#1)创建并切换到放置chaosblade的⽬录$mkdir-p/home/work/chaos/bin&&cd/home/work/chaos/bin#2)下载release⽂件$curl/agent/github/1.2.0/chaosblade-1.2.0-linux-amd64.tar.gz-ochaosblade-1.2.0-linux-amd64.tar.gz#3)解压缩$tar-zxvfchaosblade-1.2.0-linux-amd64.tar.gz&&rmchaosblade-1.2.0-linux-amd64.tar.gz#4)给当前会话新增blade命令,下⽂都将使⽤该命令$aliasblade="/home/work/chaos/bin/chaosblade-1.2.0/blade"2、JVM实验准备JVM场景的实验是通过Javaagent技术来实现的,所以在实验前需要⾸先将chaosblade的agent挂载到实验对象的进程中(更多参数请参考):#1)以test-api服务为例,拿到进程号。当前例⼦中进程号为32676$ps-aux|greptest-apiwork326764.66.7240814128944200?Sl6⽉02463:07/home/work/bin/test-api/java/bin/java***-servertest-apistart#2)挂载javaagent(挂载过程需要等⼗⼏秒钟)##-j参数为服务下的Java⽬录(⼀般为/home/work/bin/service-name/java)--pid参数为上⼀步得到的进程号$bladepreparejvm-j/home/work/bin/test-api/java/--pid32676{"code":200,"success":true,"result":"5ee14b7d18d895fd"}#返回code为200则说明挂载成功,请记录result对应的实验对象id:5ee14b7d18d895fd,之后会⽤于实验卸载挂载成功后,就可以进⾏实验了。但是⼀定要注意,所有的实验都结束后,⼀定要将agent卸载掉,具体操作⽅式见第7节。agent挂载成功后可以进⾏任意多次第4,5,6节中描述的实验,各个实验也可以同时进⾏,但要在卸载agent之前将每个创建成功的实验都销毁掉。3、注⼊⽅法延时#1)对⼀个⽅法注⼊8秒的延时####--time为延时时长,单位是毫秒--classname为该⽅法所在类的全限定名--methodename为该⽅法的⽅法名--pid为之前挂载好agent的进程号$bladecreatejvmdelay--time8000--classname=com...ChargeController--methodname=payNotify--pid32676{"code":200,"success":true,"result":"d0e4be6ee34eab54"}#返回code为200则说明注⼊成功#2)销毁该实验,撤销注⼊的延时,参数d0e4be6ee34eab54是步骤1)中返回的实验对象Id$bladedestroyd0e4be6ee34eab54{"code":200,"success":true,"result":{"target":"jvm","action":"delay","flags":{"classname":"com...ChargeController","methodname":"payNotify","pid":"32676","time":"#返回code为200则说明成功销毁了实验除以上简单案例外,还可以设定影响的请求条数、请求百分⽐等,具体请参考。4、修改⽅法返回值chaosblade可直接修改⽅法的返回为指定值,更多参数见。#1)修改⽅法的返回值,将该⽅法的所有调⽤返回值都修改为false#⽅法的返回值类型需要是基本类型,value参数值的类型需要和⽅法返回值类型相匹配##value可以为null,这种情况下不遵从上述约束--value指定⽅法的固定返回值$bladecreatejvmreturn--valuefalse--classnamecom...NotifyManager--methodnameverifyNotifyInfo--pid32676{"code":200,"success":true,"result":"b847f4d9f8f1cb1f"}#2)销毁该实验$bladedb847f4d9f8f1cb1f{"code":200,"success":true,"result":{"target":"jvm","action":"return","flags":{"classname":"com...NotifyManager","methodname":"verifyNotifyInfo","pid":"32676"}}}5、抛出⾃定义异常可以让对特定⽅法的调⽤直接抛出⼀个异常#1)让⼀个⽅法抛出⾃定义的异常##--exception参数为要抛出异常的全限定名,必须继承java.lang.Exception或--exception-mesage参数为异常所带的⾃定义信息#java.lang.Exception本⾝$bladecreatejvmthrowCustomException--exceptionjava.lang.Exception--exception-messagethis-is-a-mocked-exception--classnamecom...NotifyManager-{"code":200,"success":true,"result":"06fc1ce09c721f90"}#2)销毁该实验$bladed06fc1ce09c721f90{"code":200,"success":true,"result":{"target":"jvm","action":"throwCustomException","flags":{"classname":"com...NotifyManager","exception":"java...Exception","ex6、使⽤⾃定义脚本替换指定类⽅法的内容chaosblade也⽀持⽤Java或Groovy脚本⾃⾏实现⼀个复杂的故障场景,如针对特定⽤户或商户的过滤等。脚本内容需要符合下⽂中的规范,更多内容参见。#1)⽤⾃定义脚本替换特定⽅法的实现内容##--script-file⾃定义脚本⽂件所在的绝对路径,脚本书写规范见下⽂--debug(⽆参数)将chaosblade的⽇志级别设定为debug,打印更详细的⽇志$bladecreatejvmscript--classnamecom...ChargeController--methodnameNotify--script-file/home/work/niwanjia/Script.java--pid32676--debug{"code":200,"success":true,"result":"0454edf1f266789d"}#2)销毁该实验$bladed0454edf1f266789d{"code":200,"success":true,"result":{"target":"jvm","action":"script","flags":{"classname":"com...ChargeController","debug":"true","methodname":"Notify","pid":"326⾃定义脚本的规范:必须创建⼀个类,对类名和包名没有要求,其中所依赖的类,必须是⽬标应⽤所具备的类。同包下的类引⽤,必须写全包名,⽐如故障脚本类是com.example.controller.ExceptionScript,类中引⼊了同包下的DubboController类,则DubboController必须添加com.example.controller.DubboController。引⼊⾮同包下的类,⽆需写全包名。必须添加publicObjectrun(Mapparams)⽅法,其中params对象中包含⽬标⽅法参数,key是参数索引下标,从0开始,⽐如⽬标⽅法是publicStringcall(Objectobj1,Objectobj2){},则params.get("0")则返回的是obj1对象,可以执⾏params.put("0",)来修改⽬标⽅法参数(⽬标⽅法及--classname和--methodname所指定的类⽅法)(注意:"0"为字符串)。上述⽅法返回的对象如果不为空,则会根据脚本中返回的对象来修改⽬标⽅法返回值,注意类型必须和⽬标⽅法返回值⼀致。如果上述⽅法返回null,则不会修改⽬标⽅法返回值。上⾯例⼦中使⽤的脚本内容:packagecom.anywhere.you.want;importjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.util.Map;importnet.paoding.rose.web.Invocation;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;publicclassScript{//该脚本将接收到的通知内容直接丢弃掉publicObjectrun(Map<String,Object>params){Loggerlog=LoggerFactory.getLogger(Script.class);Invocationinv=(Invocation)params.get("1");StringBuildersb=newStringBuilder();try(BufferedReaderbr=newBufferedReader(newInputStreamReader(inv.getRequest().getInputStream()))){Stringline;while((line=br.readLine())!=null){sb.append(line);}("dropnotify.content:{}",sb.toString());return"@SUCCESS";}catch(Exceptione){log.error("mocknotifyerror:{}",e.getMessage(),e);return"@error";}}}7、结束JVM实验JVM实验结束后,需要卸载之前加载到⽬标进程上的agent。请在卸载agent前确认已将所有实验都撤销完毕,以免影响线上业务。#1)如果忘了加载agent时返回的实验对象id,可以通过status命令查看--type为prepare或者create#$bladestatus--typeprepare{"code":200,"success":true,"result":[{"Uid":"5ee14b7d18d895fd","ProgramType":"jvm","Process":"","Port":"17758","Pid":"32676","Status":"Running","Error":"","CreateTime":"2021-06-09T15:31:32.449179887+08:00","UpdateTime":"2021-06-09T15:31:45.729185574+08:00"}]}#2)卸载agent,参数5ee14b7d18d895fd为之前prepare命令返回的实验对象Id$blader5ee14b7d18d895fd{"code":200,"success":true,"result":"success"}8、问题排查1)参数等的错误通常会直接在命令的响应中体现,如:flagneedsanargument:--pid#或者requiredflag(s)"methodname"notset2)如果响应中code不是200,其后的result中就会有错误描述,基本上可定位问题,如:{"code":406,"success":false,"error":"theexperimentexists"}3)创建实验时响应Code为200,但程序表现与预期不符,就需要去chaosblade的⽇志中找原因了。⽇志的位置为~/logs/chaosblade/chaosblade.log,如:2021-06-0917:01:49INFOMatchrule:{"target":"jvm","matcher":{"matchers":{"classname":"com...ChargeController","methodname":"wxpayNotify"}},"actio2021-06-0917:01:49WARNinjectexceptioncom.alibaba.chaosblade.exec.plugin.jvm.script.base.ScriptException:Compilationfailed.Source:/com/taobao/csp/monkeyking/script/java/source/Script.javaLine24:cannotfindsymbolsymbol:classChargeControllerlocation:classcom.taobao.csp.monkeyking.script.java.source.Script12packagecom.taobao.csp.monkeyking.script.java.source;importmon.utils.ErrorCounter;***略***22return"@SUCCESS";}catch(Exceptione){ErrorCounter.countError(ChargeController.class);log.error(e.getMessage(),e);return"@error";2324252627}28}29}三、多台机器同时实验的简单处理⽅法chaosblade的命令可以启动其内置的服务器,从⽽将其混沌实验能⼒通过http接⼝暴露出来。我们就获得了通过脚本远程创建混沌实验的能⼒,同时也可以利⽤该接⼝同时控制多台机器展开实验。利⽤server命令,增加权限管理等功能后,也可以搭建简单混沌实验平台。单机案例:#1)在实验⽬标机器上启动server#--port参数为http服务监听的接⼝[work@myrboot~]$bladeserverstart--port19526success,listeningon:19526#————————————————以下命令都在另⼀台机器执⾏——————————————————#2)通过http接⼝,远程启动⼀个实验#cmd参数的内容与本地命令⾏相同

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论