DevOps落地笔记-15|混沌工程:通过问题注入提高系统可靠性

news2024/12/25 12:24:09

上一课时介绍了通过搭建一套部署流水线,高效、可靠的将软件部署到测试环境以及生产环境。到目前为止,我们学习了从用户需求到软件部署到生产环境交付给用户的全过程。随着软件工程不断发展,近几年,出现了一种新的实践,这就是今天要介绍的内容——混沌工程,它通过在生产环境中对系统进行破坏,来不断增强软件的健壮性。

什么是混沌工程?

《混沌工程原理》中这样定义:“混沌工程(Chaos Engineering)是在分布式系统上进行实验的学科, 目的是建立对系统抵御生产环境中失控条件的能力以及信心。”简而言之,混沌工程就是“故意破坏事物”的特殊方法,通过在生产环境中捣乱。比如随机重启生产环境中的服务器等,以发现生产环境中可能出现的隐藏问题;通过不断修复系统的缺陷,从而使系统更健壮、更具容错能力。

这里强调的是混沌工程并不仅仅是“搞破坏”,因为搞破坏非常容易,但在搞完破坏后,能不能有效控制破坏的爆炸半径,能不能有效控制对用户造成的影响,以及判断该问题是否需要修复并寻找修复方法…这些才是混沌工程中最关键的。

混沌工程和传统测试有很多重叠的部分。混沌工程应该成为传统测试的补充,是经过传统测试后系统已经足够稳定,可以在生产环境中被任意“破坏”,来进一步增强系统的稳定性的工程。由于需要生产环境中的真实场景,这类测试是不能通过单元测试和集成测试来模拟的。混沌工程的核心思想是以可控的方式主动注入故障,以验证系统的行为是否符合我们的预期,并在不正常的情况下进行修复,以此提高系统的稳定性。

为什么要实施混沌工程?

创建可靠的软件是当今企业获取用户,赢得市场竞争的基础。特别是当我们的系统迁移到分布式架构,一些不可预知的问题时常发生。传统的测试只能保证软件的应用层的质量,无法保证应用程序以及各种服务或整个系统在任何情况下都能正常使用,不管是“正常情况”还是极端负载或异常情况。应用程序的任何异常都会影响用户体验。

混沌工程可以主动测试生产环境中各种压力下的行为。通过比较假设行为和实际行为,我们可以在系统出现故障之前发现问题并修复问题。混沌工程可以做以下几件事情:

1.对软件和基础设施进行比传统形式更广泛的测试和验证;

2.发现传统测试无法发现的问题;

3.帮助团队了解系统在真实生产环境中的行为,服务如何被中断以及都有哪些Bug?

因此,混沌工程可以帮助我们增强系统的稳定性和可靠性,带来更好的用户体验。

如何实施混沌工程?

混沌工程也是近几年出现的一个新的工程实践,目前只是在少数大公司里实施,如 Google、Facebook、阿里巴巴等。那么,如何在企业里实施混沌工程?我们可以通过下面几个步骤来实施混沌工程。

建立基线指标

在进行混沌工程实验之前,要先收集一组基线指标数据。这些指标包含基础设施的监控指标、告警指标、严重级别指标、应用程序指标等。下面介绍下这些指标的内容。

& 基础设施的监控指标:包含服务器的CPU 峰值、IO峰值、磁盘使用率、内存使用率,网络的延迟、数据丢包率、DNS 等指标。

& 告警指标:可以按服务统计每周的告警数量,处理告警的时间,以及每种服务每周最频繁的告警类型。

& 严重级别指标:可以按服务统计每周不同严重级别的事件数量,以及按服务统计每种严重级别的 MTTD(平均检测时间)、MTTR(平均故障恢复时间)和MTBF(平均故障间隔时间)。

& 应用指标:应用程序的可观察性指标,事件数量,请求的响应时间,数据库连接数,QPS(每秒查询数量),TPS(每秒事务数量)。

模拟真实事件

在生产系统中模拟真实事件来进行实验,有两种方式:攻击和场景。

& 攻击:将故障注入系统中,如消耗计算资源、关闭系统、丢弃网络包等方法,攻击是单个的故障注入方式。

& 场景:是将一组攻击保存的集合。场景中的攻击按顺序执行,可以更好地控制攻击的执行方式,并可以模拟较为复杂的故障。保存下来的场景可以被重复执行,并能够观察系统随着时间的行为变化。

不管使用哪种方式,在执行完成后,需要记录上述指标的观察结果并与基线进行比较。

分析结果

基于从实验中获得的结果数据与假设进行比较,并得出结论。这里有几个问题需要给出答案:

& 系统行为是否符合预期?

& 如果系统有监控告警等系统,是否按预期运行?

& 本次实验发现了哪些新问题?

& 告警系统多长时间检测到问题并发出通知?该时间是否可以接收?

& 实验结束后,系统是否自动恢复到正常状态?还是需要人工干预?

重复实验

修复问题后,重复执行该实验以确保问题得到彻底解决。如果系统成功抵御了攻击,说明该问题已经被修复。此时,应该考虑增加攻击的程度,爆炸半径或者一次性攻击目标的系统数量。这对于测试集群系统、自动扩展系统或负载均衡系统比较有用。

自动化实验

一旦系统能够抵御该攻击,就可以按照常规测试惯例定期执行攻击。可以将该实验的执行嵌入到 CI/CD 流水线中,这样有利于新的变更不会引起新的可靠性问题。下图显示了可以在软件生命周期中执行不同类型的混沌实验的各个阶段。只要有设计良好的混沌实验,就可以在每次执行流水线时都会执行这些混沌实验。这一步的目的是通过在生产之前或者在生产中引起问题之前发现实际问题。
在这里插入图片描述
混沌工程案例

下面介绍一下如何将 Chaos Monkey 集成到 Spring Boot 应用程序中。

SpringBoot 集成 ChaosMonkey

Netflix 不仅制定了《混沌工程原理》,还提供了一个将理论付出实际的强大工具:ChaosMonkey。ChaosMonkey 是一种工具,该工具会随机终止生产环境中运行的虚拟机实例和容器,使工程师能够构建更加弹性的服务。Spring Boot 是目前构建 Java 后台应用程序最受欢迎的框架。Spring Boot Chaos Monkey 是一个依赖库,可以将混沌工程的实践集成到 Spring Boot 的应用中。只需要下面两步就可以将 Chaos Monkey 添加的应用程序中。

STEP 1:在应用程序中添加 ChaosMonkey 的依赖包。

<dependency>

    <groupId>de.codecentric</groupId>

    <artifactId>chaos-monkey-spring-boot</artifactId>

    <version>2.2.0</version>

</dependency>

STEP 2:在启动应用程序的时候,需要激活 chaos-monkey的profile 来初始化 ChaosMonkey。

java -jar chaosmonkeyforspringboot.jar --spring.profiles.active=chaos-monkey

启动后,就会在控制台中打印出 Chaos Moneky 的字样。
在这里插入图片描述
ChaosMonkey 配置

Chaos Monkey 在引入后并未开启,需要通过 chaos.monkey.enabled 配置项来开启。Chaos Monkey 提供了四种不同的攻击方式:

& 延迟攻击;

& 异常攻击;

& 杀掉应用程序攻击;

& 内存攻击。

这种攻击的开启和关闭可以通过下面四个配置项决定,并且每种攻击方式也有相应的配置参数。比如,延迟攻击是在每个请求处理时添加随机的延迟时间,该值由 chaos.monkey.assaults.latency-range-start 和chaos.monkey.assaults.latency-range-end 两个参数的区间值来设置。

chaos.monkey.assaults.latency-active=true

chaos.monkey.assaults.exceptions-active=true

chaos.monkey.assaults.memory-active=true

chaos.monkey.assaults.kill-application-active=true

ChaosMonkey 的配置项清单可以通过 Spring Boot Actuator 的访问端口查看,首先需要通过下面两个配置项开启并将 chaosmonkey 添加到暴露的端口列表中。

management.endpoint.chaosmonkey.enabled=true

management.endpoints.web.exposure.include=health,info,chaosmonkey

``
在地址栏里输入 http://localhost:8080/actuator/chaosmonkey 可以看到如下配置项清单:

{

“chaosMonkeyProperties”: {

“enabled”: true

},

“assaultProperties”: {

“level”: 5,

“latencyRangeStart”: 1000,

“latencyRangeEnd”: 2000,

“latencyActive”: true,

“exceptionsActive”: true,

“exception”: {

“type”: null,

“arguments”: null

},

“killApplicationActive”: true,

“memoryActive”: true,

“memoryMillisecondsHoldFilledMemory”: 90000,

“memoryMillisecondsWaitNextIncrease”: 1000,

“memoryFillIncrementFraction”: 0.15,

“memoryFillTargetFraction”: 0.25,

“runtimeAssaultCronExpression”: “OFF”,

“watchedCustomServices”: null

},

“watcherProperties”: {

“controller”: false,

“restController”: false,

“service”: true,

“repository”: false,

“component”: false

}

}

**测试示例项目**

在 Chaos Monkey 的设置里开启 chaos.monkey.assaults.exceptions-active=true,添加一个测试的 Controller 类,如下:

@RestController

@RequestMapping(“/v1/test/chaosmonkey”)

public class OrderController {

@Autowired

private OrderMapper orderMapper;



@GetMapping("/orders")

public List<Order> getOrders() {

    try {

       return orderMapper.selectAll();

    } catch (Exception e) {

        e.printStackTrace();

        return null;

    }

}

}

当调用该接口时,会随机产生异常。下图是使用 postman 批量调用该接口产生的结果,可以看出该接口执行了 10 次,其中成功 8 次,失败 2 次。这 2 次失败就是因为 Chaos Monkey 导致的。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a44dcf024ebc4bb3af4db5d448dc9593.png)
在服务的后台日志中也打印出来异常信息,如下图所示。从日志可以看出,该 RuntimeException 是由 Chaos Monkey 抛出的。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/af50d9cb676542ff93e9e0b49e351498.png)
混沌工程的落地离不开工具或平台,Spring Boot Chaos Monkey 是一个不错的开源项目,可以应用在企业内部的故障演练中,暴露服务本身以及服务与服务之间的调用问题,提升系统的健壮性。

**总结**

本课时主要介绍了如何使用混沌工程的实践来进一步提高服务的稳定性和健壮性。混沌实验可以在软件开发生命周期的多个阶段进行开展,尽可能在部署到生产环境之前做尽可能多的测试,减少部署到生产环境中出现问题的风险。当有些测试场景无法在测试环境中模拟时,需要在生产环境中进行实验,此时对应用程序来说也是最大的挑战。在生产环境中进行混沌实验时,务必要进行充分的设计和回滚方案的制定,以及对故障产生的影响范围的把控,以为真的对业务系统造成破坏。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1434686.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【240113】东北石油大学—调剂信息

东北石油大学 学校层级&#xff1a;双非 调剂专业&#xff1a;0857专业&#xff08;接收0854专业考生&#xff09; 发布时间&#xff1a;2024.1.13 发布来源&#xff1a;网络发布 背景&#xff1a;学习地点: 黑龙江省大庆市 (地处东北&#xff0c;冬季寒冷&#xff0c;需提…

springAop讲解

写在前面 本文旨在帮助入门和了解aop的概念以及基本用法&#xff0c;如有错误请在评论区指出&#xff0c;万分感谢。 部分资料出自尚硅谷课堂笔记,改内容更好&#xff0c;更完善。依赖准备 使用aop编程的话&#xff0c;我们需要先导入需要的依赖 spring-context: 包含Spring…

随记-Java项目处理SQL注入问题

现象&#xff1a;http://10.xx.xx.xx:xx/services/xxService 存在SQL注入情况 加固意见&#xff1a; 需要对网站所有参数中提交的数据进行过滤&#xff0c;禁止输入“"、"xor"、"or"、”--“、”#“、”select“、”and“等特殊字符&#xff1b;所有…

【LongChain-03】在本地运行LLM的另一些案例

​ 一、使用案例说明 PrivateGPT、 llama.cpp和 GPT4All等项目的流行 强调了在本地&#xff08;在您自己的设备上&#xff09;运行 LLM 的需求。 这至少有两个重要的好处&#xff1a; Privacy&#xff1a;您的数据不会发送给第三方&#xff0c;并且不受商业服务的服务条款的约…

复旦大学NLP团队发布86页大模型Agent综述

复旦大学自然语言处理团队&#xff08;FudanNLP&#xff09;发布了一篇长达86页的综述论文&#xff0c;探讨了基于大型语言模型的智能代理的现状和未来。该论文从AI Agent的历史出发&#xff0c;全面梳理了基于大型语言模型的智能代理现状&#xff0c;包括LLM-based Agent的背景…

Linux系统安全①iptables防火墙

目录 一.iptables防火墙概述 1.netfilter与iptables &#xff08;1&#xff09;netfilter &#xff08;2&#xff09;iptables 2.iptables防火墙默认规则表、链结构 二.iptables四表五链 1.四表 2.五链 3.总结 三.iptables的配置 1.安装 2.配置方法 &#xff08;1…

React开发必知必会的Hooks

文章目录 前言1、React的组件创建方式2、什么是Hook&#xff1f;3、Hook总的使用规则 一、useState二、useRef三、useEffect四、useLayoutEffect五、useReducer六、useContext七、memo与useMemo、useCallback1、memo2、useMemo3、useCallback4、三者区别 八、useImperativeHand…

C++重新入门-C++数据类型

目录 1.基本的内置类型 2.typedef 声明 3.枚举类型 4.类型转换 使用编程语言进行编程时&#xff0c;需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着&#xff0c;当您创建一个变量时&#xff0c;就会在内存中保留一些空间。 您可能需要存储…

网站为什么要用CND?

CDN对于网站来说至关重要&#xff0c;CDN对网站的重要性主要体现在可以提升用户体验、提高网站安全性、减轻服务器负担、提高SEO排名等&#xff0c;还可以为网站节省带宽成本。因此&#xff0c;选择一个性能好、速度快的CDN是很有必要的。 CDN对于现代网站来说是不可或缺的&am…

【算法分析与设计】无重复的最长子串

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 示例 1: 输入: s "abcabcbb" 输…

redis下载与安装教程(centos下)

文章目录 一&#xff0c;redis下载1.1上传到linux服务器上 二&#xff0c;redis安装2.1 安装依赖2.2 解压包2.3 编译并安装2.4 指定配置启动2.5 设置redis开机自启 一&#xff0c;redis下载 官网&#xff1a; https://redis.io1.1上传到linux服务器上 我用filezila上传到/us…

【前端web入门第四天】02 CSS三大特性+背景图

文章目录: 1. CSS三大特性 1.1继承性 1.2 层叠性 1.3 优先级 1.3.1 优先级1.3.2 优先级-叠加计算规则 2. 背景图 2.1 背景属性2.2 背景图2.3 背景图的平铺方式2.4 背景图位置2.5 背景图缩放2.6 背景图固定2.7 背景复合属性 1. CSS三大特性 1.1继承性 什么是继承性? 子级默…

华大基因PMseq病原微生物高通量基因检测产品耐药数据库持续

23年肺炎支原体感染的患者数量持续上升&#xff0c;与此同时&#xff0c;由肺炎支原体感染引发的住院患者数量也在迅速增加。这就导致近期儿科和发热门诊都处于床位爆满状态。而在疑难危重的肺炎患者中&#xff0c;肺炎支原体的检出率也在不断提高。华大基因PM Online线上数据管…

Python程序设计 函数

简单函数 函数&#xff1a;就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量代码的重复使用。 函数的使用包含两个步骤&#xff1a; 定义函数 —— 封装 独立的功能 调用函数 —— 享受 封装 的成果 函数的作用&#xff0c;在开发程序时&#xff0c;使用…

.NET Core Web API使用HttpClient提交文件的二进制流(multipart/form-data内容类型)

需求背景&#xff1a; 在需要通过服务端请求传递文件二进制文件流数据到相关的服务端保存时&#xff0c;如对接第三方接口很多情况下都会提供一个上传文件的接口&#xff0c;但是当你直接通过前端Ajax的方式将文件流上传到对方提供的接口的时候往往都会存在跨域的情况&#xff…

第97讲:MHA高可用集群模拟主库故障以及修复过程

文章目录 1.分析主库故障后哪一个从库会切换为主库2.模拟主库故障观察剩余从库的状态2.1.模拟主库故障2.3.当前主从架构 3.修复故障的主库3.1.修复主库3.2.当前主从架构3.3.恢复MHA 1.分析主库故障后哪一个从库会切换为主库 在模拟MHA高可用集群主库故障之前&#xff0c;我们先…

jenkins 发布远程服务器并部署项目

安装参考另一个文章 配置maven 和 jdk 和 git 注意jdk的安装目录&#xff0c;是jenkins 安装所在服务器的jdk目录 注意maven的目录 是jenkins 安装所在服务器的maven目录 注意git的目录 是jenkins 安装所在服务器的 git 目录 安装 Publish Over SSH 插件 配置远程服务器 创…

C++之函数重载,默认参数,bool类型,inline函数,异常安全

函数重载 在实际开发中&#xff0c;有时候需要实现几个功能类似的函数&#xff0c;只是细节有所不同。如交换两个变量的值&#xff0c;但这两种变量可以有多种类型&#xff0c;short, int, float等。在C语言中&#xff0c;必须要设计出不同名的函数&#xff0c;其原型类似于&am…

DockerUI如何部署结合内网穿透实现公网环境管理本地docker容器

文章目录 前言1. 安装部署DockerUI2. 安装cpolar内网穿透3. 配置DockerUI公网访问地址4. 公网远程访问DockerUI5. 固定DockerUI公网地址 前言 DockerUI是一个docker容器镜像的可视化图形化管理工具。DockerUI可以用来轻松构建、管理和维护docker环境。它是完全开源且免费的。基…

如何部署Linux AMH服务器管理面板并结合内网穿透远程访问

文章目录 1. Linux 安装AMH 面板2. 本地访问AMH 面板3. Linux安装Cpolar4. 配置AMH面板公网地址5. 远程访问AMH面板6. 固定AMH面板公网地址 AMH 是一款基于 Linux 系统的服务器管理面板&#xff0c;它提供了一系列的功能&#xff0c;包括网站管理、FTP 管理、数据库管理、DNS 管…