searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

混沌工程介绍和原理分析

2023-09-01 06:41:29
188
0

一、混沌工程起源

2008年Netfix决定把它的业务迁移到AWS上,从自身运维的角度考虑,它有很多担忧的地方:

1、很长时间内有两套系统在同时运行,运维的复杂度更高了

2、Netfix的用户量已经达到了1亿,对应用稳定性依赖很高,如果出现故障对用户的影响非常大,甚至是致命的

3、它的业务不断复杂,引入微服务架构,对应用的高可用性要求越来越高

4、生产环境非常复杂,是多样性的,很难在测试环境中完全模拟生产的状态

因此,Netflix决心探索一种在生产环境验证应用高可用性的一种方法,这就是混沌工程

在2012年开源了猴子混沌工具集(github.com/Netflix/chaosmonkey) ,目前start 13.7K  最近更新23年1月,但是国内社区跟进的不多

混沌工程在Netflix的演进发展

  • 2010年 Netflix 内部开发了 AWS 云上随机终止 EC2 实例的混沌实验工具: Chaos Monkey
  • 2011年 Netflix 了其猴子军团工具集: Simian Army(Java构建),2012年将其开源
  • 2014年 Netflix 开始正式公开招聘 Chaos Engineer,提出了故障注入测试(FIT),利用微服务架构的特性,控制混沌实验的爆炸半径
  • 2015年 Netflix 和社区正式提出混沌工程的指导思想 – Principles of Chaos Engineering
  • 2016年 Netflix前员工Kolton Andrus创立了Gremlin,正式将混沌实验工具商用化,混沌工程影响着越来越多的企业。
  • 2017年 Netflix 开源 Chaos Monkey 由 Golang 重构的 2.0 版本,必须集成 CD 工具 Spinnaker 来使用
  • 2017年 由Netflix 前混沌工程师撰写的新书“混沌工程”在网上出版
  • 2017年 Russell Miles 创立了 ChaosIQ 公司,并开源了 chaostoolkit 混沌实验框架

在这过程,发展了很多混沌注入工具集:

1:Netflix 猴子军团

2:Chaos Monkey: 关闭节点

3:Latency Monkey : 引入延时

4:Conformity Monkey: 关闭不符合最佳实践的实例

5:Doctor Monkey: 查找不健康实例

6:Janitor Monkey: 查找不再需要的资源

7:Security Monkey: 检查系统的安全漏洞

8:i18 Monkey:检查国际化的配置

9:Chaos Gorilla :模拟整个AWS AZ故障

10:Chaos Kong: 模拟整个AWS Region故障

整个发展都是Netflix在生产实践中遇到问题时,利用混沌工程的思想,引入新的猴子(混沌注入工具),实施相应的混沌实践,观察引入故障对系统的影响

二、混沌工程的目的

今天,许多公司,包括国外的 FANG,国内的阿里,华为等,都有自己的混沌工程(Chaos Engineer)

比如阿里在开源的chaosblade  :

控制台 chaos-box :  github.com/chaosblade-io/chaosblade-box

故障工具集chaosblade:  github.com/chaosblade-io/chaosblade

混沌工程的目的:使用某种形式的混沌工程实验,给复杂的分布式系统引入扰动,并观察系统行为,借此发现系统弱点,进而修复该弱点,最总提高系统架构的可靠性.

因此,混沌工程实验中涉及的可行性调研、实验场景和环境的设计与计划、工具的选型和配合方式、系统行为的观测方法、以及找到问题后如何改善系统架构和运维模式,都需要科学的分析和有经验的混沌工程专家指导。

三、chaosbox和chaosblade架构分析

1、chaosbox架构图 chaos-box, chaos-agent,chaosblade 关系

可以看到架构关系: chaosbox控制台主要负责故障命令的编排,通过chaos agent 交互,下发故障注入,恢复命令给chaosblade

其中故障注入工具集为chaosblade,这里重点介绍该故障注入工具集原理

四、chaosblade原理分析

chaosblade 依据领域实现封装成各自独立的项目,每个项目根据各领域的最佳实践来实现,不仅能满足各领域使用习惯,而且还可以通过混沌实验模型来建立与 chaosblade cli 的交互。

目前社区演进到1.7.2,故障注入支持的场景较为丰富

目前开源出来的主要是主机类(linux OS)、JVM类、云原生(k8s)故障注入类别

1 、主机类故障注入原理

基于LinuxOS的基础命令,引发cpu,内存,网络,磁盘,进程资源的变化,基础命令尽量保证基础命令工具是大部分Linux发行版本存在的

主机类故障注入展示

磁盘充填:

blade create disk fill --percent '75' --timeout '905

                             执行前                                                                                

                            执行后

网络丢包率

blade create network corrupt --percent 80 --destination-ip 198.20.1.81  --interface eth0

指发往198.20.1.81会出现丢包

2、JVM故障注入原理

基于JVM agent运行时class重载技术

这是一种运行的JVM类修改并重新加载,一种热加载的技术,基于以下几个JVM技术:

Instrument : JVM提供的一个可以修改已加载类的类库,专门为Java语言编写的插桩服务提供支持,需要依赖JVMTI的Attach API机制实现(JDK 1.6之后可以替换类的字节码)

JVMTI: JVM工具接口,可以对JVM多种操作

Agent:   是JVMTI的一种实现, Agent有两种启动方式: 一是随Java进程启动而启动,

               二是运行时载入,通过 attach API,将模块(jar包)动态Attach到指定进程id的Java进程内

Attach API :  提供JVM进程间通信的能力

其中阿里开源的 Arthas(arthas.aliyun.com)在线诊断工具,就是用到该技术

为了更方便大家使用该技术,阿里开源了sandbox,可以方便的编写class 切面和增强代码,

因为有动态挂载过程,这个比较耗时,初次挂载可能需要10秒左右。

比如对jedis的故障注入,那就是要对jedis的实现类进行AOP增强,在before的enhance中加入故障,比如延迟1000ms 就是sleep(1000)

Jedis延迟增加

blade c jvm jedis –time 2000 –process ahas-springcloud-provider –javaHome /usr/lib/jdk1.8.0_201

                                   操作前                                                            

     

                                   操作后

0条评论
0 / 1000
张****钏
15文章数
1粉丝数
张****钏
15 文章 | 1 粉丝
原创

混沌工程介绍和原理分析

2023-09-01 06:41:29
188
0

一、混沌工程起源

2008年Netfix决定把它的业务迁移到AWS上,从自身运维的角度考虑,它有很多担忧的地方:

1、很长时间内有两套系统在同时运行,运维的复杂度更高了

2、Netfix的用户量已经达到了1亿,对应用稳定性依赖很高,如果出现故障对用户的影响非常大,甚至是致命的

3、它的业务不断复杂,引入微服务架构,对应用的高可用性要求越来越高

4、生产环境非常复杂,是多样性的,很难在测试环境中完全模拟生产的状态

因此,Netflix决心探索一种在生产环境验证应用高可用性的一种方法,这就是混沌工程

在2012年开源了猴子混沌工具集(github.com/Netflix/chaosmonkey) ,目前start 13.7K  最近更新23年1月,但是国内社区跟进的不多

混沌工程在Netflix的演进发展

  • 2010年 Netflix 内部开发了 AWS 云上随机终止 EC2 实例的混沌实验工具: Chaos Monkey
  • 2011年 Netflix 了其猴子军团工具集: Simian Army(Java构建),2012年将其开源
  • 2014年 Netflix 开始正式公开招聘 Chaos Engineer,提出了故障注入测试(FIT),利用微服务架构的特性,控制混沌实验的爆炸半径
  • 2015年 Netflix 和社区正式提出混沌工程的指导思想 – Principles of Chaos Engineering
  • 2016年 Netflix前员工Kolton Andrus创立了Gremlin,正式将混沌实验工具商用化,混沌工程影响着越来越多的企业。
  • 2017年 Netflix 开源 Chaos Monkey 由 Golang 重构的 2.0 版本,必须集成 CD 工具 Spinnaker 来使用
  • 2017年 由Netflix 前混沌工程师撰写的新书“混沌工程”在网上出版
  • 2017年 Russell Miles 创立了 ChaosIQ 公司,并开源了 chaostoolkit 混沌实验框架

在这过程,发展了很多混沌注入工具集:

1:Netflix 猴子军团

2:Chaos Monkey: 关闭节点

3:Latency Monkey : 引入延时

4:Conformity Monkey: 关闭不符合最佳实践的实例

5:Doctor Monkey: 查找不健康实例

6:Janitor Monkey: 查找不再需要的资源

7:Security Monkey: 检查系统的安全漏洞

8:i18 Monkey:检查国际化的配置

9:Chaos Gorilla :模拟整个AWS AZ故障

10:Chaos Kong: 模拟整个AWS Region故障

整个发展都是Netflix在生产实践中遇到问题时,利用混沌工程的思想,引入新的猴子(混沌注入工具),实施相应的混沌实践,观察引入故障对系统的影响

二、混沌工程的目的

今天,许多公司,包括国外的 FANG,国内的阿里,华为等,都有自己的混沌工程(Chaos Engineer)

比如阿里在开源的chaosblade  :

控制台 chaos-box :  github.com/chaosblade-io/chaosblade-box

故障工具集chaosblade:  github.com/chaosblade-io/chaosblade

混沌工程的目的:使用某种形式的混沌工程实验,给复杂的分布式系统引入扰动,并观察系统行为,借此发现系统弱点,进而修复该弱点,最总提高系统架构的可靠性.

因此,混沌工程实验中涉及的可行性调研、实验场景和环境的设计与计划、工具的选型和配合方式、系统行为的观测方法、以及找到问题后如何改善系统架构和运维模式,都需要科学的分析和有经验的混沌工程专家指导。

三、chaosbox和chaosblade架构分析

1、chaosbox架构图 chaos-box, chaos-agent,chaosblade 关系

可以看到架构关系: chaosbox控制台主要负责故障命令的编排,通过chaos agent 交互,下发故障注入,恢复命令给chaosblade

其中故障注入工具集为chaosblade,这里重点介绍该故障注入工具集原理

四、chaosblade原理分析

chaosblade 依据领域实现封装成各自独立的项目,每个项目根据各领域的最佳实践来实现,不仅能满足各领域使用习惯,而且还可以通过混沌实验模型来建立与 chaosblade cli 的交互。

目前社区演进到1.7.2,故障注入支持的场景较为丰富

目前开源出来的主要是主机类(linux OS)、JVM类、云原生(k8s)故障注入类别

1 、主机类故障注入原理

基于LinuxOS的基础命令,引发cpu,内存,网络,磁盘,进程资源的变化,基础命令尽量保证基础命令工具是大部分Linux发行版本存在的

主机类故障注入展示

磁盘充填:

blade create disk fill --percent '75' --timeout '905

                             执行前                                                                                

                            执行后

网络丢包率

blade create network corrupt --percent 80 --destination-ip 198.20.1.81  --interface eth0

指发往198.20.1.81会出现丢包

2、JVM故障注入原理

基于JVM agent运行时class重载技术

这是一种运行的JVM类修改并重新加载,一种热加载的技术,基于以下几个JVM技术:

Instrument : JVM提供的一个可以修改已加载类的类库,专门为Java语言编写的插桩服务提供支持,需要依赖JVMTI的Attach API机制实现(JDK 1.6之后可以替换类的字节码)

JVMTI: JVM工具接口,可以对JVM多种操作

Agent:   是JVMTI的一种实现, Agent有两种启动方式: 一是随Java进程启动而启动,

               二是运行时载入,通过 attach API,将模块(jar包)动态Attach到指定进程id的Java进程内

Attach API :  提供JVM进程间通信的能力

其中阿里开源的 Arthas(arthas.aliyun.com)在线诊断工具,就是用到该技术

为了更方便大家使用该技术,阿里开源了sandbox,可以方便的编写class 切面和增强代码,

因为有动态挂载过程,这个比较耗时,初次挂载可能需要10秒左右。

比如对jedis的故障注入,那就是要对jedis的实现类进行AOP增强,在before的enhance中加入故障,比如延迟1000ms 就是sleep(1000)

Jedis延迟增加

blade c jvm jedis –time 2000 –process ahas-springcloud-provider –javaHome /usr/lib/jdk1.8.0_201

                                   操作前                                                            

     

                                   操作后

文章来自个人专栏
java开发实践
6 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0