为什么你需要混沌工程以及 Chaos Mesh®

2024-04-08 02:38
文章标签 需要 工程 mesh 混沌 chaos

本文主要是介绍为什么你需要混沌工程以及 Chaos Mesh®,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

信心的毁灭与重建

在我最开始学习编程的时候,我一直觉得写程序是很简单的事情,程序总是按照我的想法串行的执行,给一个输入,总是有着符合预期的固定输出。那时候写代码,可能大的挑战在于理解分支,循环,但无论怎样,只要控制得当,事情总是确定的。

那段时间可以算是非常快乐的日子,直到我遇到了多线程,人生中第一次有了『自信被打破』的恐慌,在多线程的世界里,事情不会在按照我想的方式来正常的运转,我需要考虑 data racing,需要考虑 memory ordering。幸运的是,在经历了短暂的不适应之后,很快我就能很好的拥抱并发了,毕竟我们这个世界本来就是在并行运转的。虽然写多线程程序相比之前更加的困难,但其实只要掌握了一些多线程的并发原语,知道如何使用 mutex,semaphore,channel 这些,其实会发现多线程的世界也是蛮有意思的。再加上,新一代的编程语言,无论是 Go,还是 Rust,都能让大家更加游刃有余的处理并发问题,只要处理得当,给定一个输入,仍然能得到我们想要的输出。只不过,这时候要保证确定性要比之前困难了很多。

但好景不长,在驾驭了多线程之后,我的『自信再一次被打破』了,因为我进入了分布式系统的世界,在这个世界里面,一切都变得不再确定。给定一个输入,我可能得到的结果是未知,因为我不知道这个执行在远端是否被正常的执行了。而人类对于未知恰恰是最恐慌的。我不知道我的系统什么时候会出现网络异常,或者磁盘什么时候突然坏掉,或者机房是不是突然断掉了,一切的一切,对我来说都是未知的,譬如下面是我们在实际中遇到的一个问题:

我们的用户将 TiDB 运行在国内某云厂商的机器上面,然后跟我们反映,读延迟会不定期的增长,我们看了看监控,发现唯一的异常指标就是 Cached 的 memory 那段时间会突然下降。当时真的就懵了,完全不知道原因是什么。最终发现,云厂商的运维监控脚本里面有个 bug,会不定期的将磁盘热拔插,并且将现有的 page cache 刷到磁盘,所以那段时间 TiDB 的 read 操作很多是从磁盘重新读取数据的。

可以看到,分布式系统真的是一个非常复杂的系统,故障无处不在,那么我们如何在这么复杂的分布式系统的世界里面生存下去呢?现在,一个很好的答案就是 - Chaos Engineering,中文里面叫做混沌工程。

混沌工程

相比于我们成天担惊受怕系统会出现什么样的问题,还不如提前就模拟线上环境可能出现的各种情况,来看我们的系统是否能做到容错,仍然能继续对外提供服务。当然,我们并不是简单的就在线上环境上面,把机器给断电,或者把网线给拔掉,在混沌工程领域,有一套指导原则,以及标准的实验步骤,具体的可以参考 PRINCIPLES OF CHAOS ENGINEERING 。

简单来说,要做一次混沌实验,我们只需要做到如下的 4 个步骤:

  1. 定义系统的稳态,这个稳态就是系统在正常运行的时候一些指标,譬如当前请求的 QPS,latency 等。

  2. 将系统分为实验组以及对照组,做出一个假设,譬如我在实验组引入一个故障,这个稳态仍然能在实验组保持。

  3. 执行试验,给实验组引入现实世界中的故障,譬如拔掉网卡。

  4. 验证第 2 步的假设是否成立,如果实验组的稳态跟对照组不一样了,证明我们的系统在第 3 步的故障中不能很好的容错,所以我们需要改进。

可以看到,上面的步骤非常的简单,但要在实际中很好的做混沌试验,还是有一些困难的,主要在以下几点:

  1. 自动化。我们需要有一套自动化的系统帮我们进行故障注入,进行假设对比等。

  2. 尽可能多的引入不同故障。现实环境中可能会出现非常多的故障,仅仅不是拔网线这么简单,所以引入的故障越多越好。

  3. 业务方无感知。如果我们每次做混沌试验,都要业务系统去配合,譬如在业务里面写一些混沌相关的代码,让混沌试验调用,或者更改系统的部署逻辑,跟混沌试验配合,这种的就属于紧耦合的。

你好,Chaos Mesh®!!!

所以,为了让大家更好的做混沌试验,我们开发了 Chaos Mesh®,Chaos Mesh® 是一套基于 Kubernetes 的云原生混沌工程平台。Chaos Mesh® 的架构如下:

相比于其他混沌平台,Chaos Mesh® 有如下优势:

  1. 基于 K8s。只要你的系统能跑在 K8s 上面,那么就可以无缝的集成 Chaos Mesh®,而且不用修改任何业务代码,真正是被测系统无感知。

  2. 多种多样的故障注入。Chaos Mesh® 能全方位的帮你对网络,磁盘,文件系统,操作系统等进行故障注入。我们后面也会提供对 K8s,或者云服务自身进行 chaos 的能力。

  3. 易于使用。你无需关注 Chaos Mesh® 的底层实现细节,只需用 YAML 配置好混沌试验,就可以实施,后面所有的实验是全自动化的。我们也提供了 Dashboard 能让你在网页上就轻松的进行试验。

  4. 可观测性。Chaos Mesh® 的 Dashboard 能很方便的让你观测系统,知道什么时候进行了什么试验,知道你自己的系统当前的运行情况,当然,这里需要一点配置,你需要告诉 Chaos Mesh® 如何去获取你系统的稳态指标,譬如你的系统使用 Prometheus,那么就可以告诉 Chaos Mesh® 如何去 Prometheus 查询相关的监控指标。

  5. 强大的开源社区支持。Chaos Mesh® 的社区成长的非常迅速,我们非常高兴的看到大部分的功能已经由社区支持,并且也有很多用户。你无需担心遇到问题不知道如何解决,当然,你可能要担心下 Chaos Mesh® 做实验的时候把你的数据给完全干掉,所以做实验的时候一定要控制好实验半径,这个也是混沌工程的一条原则。

来一次 Chaos 实验?

在我们开始一次 Chaos 实验之前,你首先需要满足两个条件:

  1. 你自己的业务是跑在 K8s 上面的。
  2. 在 K8s 上面 安装了 Chaos Mesh®。

另外,在开始实验之前,这里我还是要强调一下 Chaos 实验的一些注意事项,可能你觉得我这个大叔很啰嗦,但小心驶得万年船,因为稍微一不注意,你可能就丢了数据了。

  1. 如果你刚准备将你的系统应用 Chaos Mesh®,一定要保证首先在测试环境中使用。你的系统应该还非常的脆弱,如果在线上进行试验,会非常的危险。

  2. 在生产系统中,一定要控制好试验的爆炸半径,控制好影响范围,譬如我们可以先对某一个街道的用户进行干扰,然后在扩大到某一个区域,或者某一个城市,如果我们一开始的影响半径就很大,一个稍微不留意,你的 boss 就可能让你第二天滚蛋了。

  3. 做混沌实验一定不是随机的瞎做实验,我们是带有目的的,是需要规划好的,与其漫无目的的对系统随机进行故障注入,我们还不如先问自己一个问题『为了对系统在混乱状况下的表现更有信心,在哪里做混沌实验最有价值?』也就是我们要熟悉了解我们的系统,做高杠杆价值的混沌实验。

好了,现在你已经完全准备好了,现在就可以踏上混沌之旅了,因为 Chaos Mesh® 的使用是如此简单,你只需要参考 用户指南 就能上手使用,所以我就不过多介绍了,如果你仍然遇到了问题,欢迎给 Chaos Mesh® 提 issue,相信我,Chaos Mesh® 社区会很热情的帮你解决问题的。

总结

随着 ServiceMesh,Serverless 等理念的兴起,我们的系统真的越来越趋向于分布式,这样虽然简化了我们单个模块的实现,但整体来看,也可能会导致我们的系统因为过于分布式而变得复杂,那么如何在这种复杂的环境下仍然让我们有信心能保证系统的正常稳定运行,混沌工程可以算是一个很不错的选择。

现在市面上面,支持混沌工程的平台已经有很多了,但我这里仍然推荐 Chaos Mesh®,毕竟使用它能让你极大提升你对系统的信心。

最后,欢迎来到复杂的分布式系统世界。

这篇关于为什么你需要混沌工程以及 Chaos Mesh®的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/884354

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

Jenkins构建Maven聚合工程,指定构建子模块

一、设置单独编译构建子模块 配置: 1、Root POM指向父pom.xml 2、Goals and options指定构建模块的参数: mvn -pl project1/project1-son -am clean package 单独构建project1-son项目以及它所依赖的其它项目。 说明: mvn clean package -pl 父级模块名/子模块名 -am参数

Vue2电商项目(二) Home模块的开发;(还需要补充js节流和防抖的回顾链接)

文章目录 一、Home模块拆分1. 三级联动组件TypeNav2. 其余组件 二、发送请求的准备工作1. axios的二次封装2. 统一管理接口API----跨域3. nprogress进度条 三、 vuex模块开发四、TypeNav三级联动组件开发1. 动态展示三级联动数据2. 三级联动 动态背景(1)、方式一:CSS样式(2)、方式二:JS 3. 控制二三级数据隐藏与显示--绑定styl

使用WebP解决网站加载速度问题,这些细节你需要了解

说到网页的图片格式,大家最常想到的可能是JPEG、PNG,毕竟这些老牌格式陪伴我们这么多年。然而,近几年,有一个格式悄悄崭露头角,那就是WebP。很多人可能听说过,但到底它好在哪?你的网站或者项目是不是也应该用WebP呢?别着急,今天咱们就来好好聊聊WebP这个图片格式的前世今生,以及它值不值得你花时间去用。 为什么会有WebP? 你有没有遇到过这样的情况?网页加载特别慢,尤其是那

数据集 3DPW-开源户外三维人体建模-姿态估计-人体关键点-人体mesh建模 >> DataBall

3DPW 3DPW-开源户外三维人体建模数据集-姿态估计-人体关键点-人体mesh建模 开源户外三维人体数据集 @inproceedings{vonMarcard2018, title = {Recovering Accurate 3D Human Pose in The Wild Using IMUs and a Moving Camera}, author = {von Marc

二、Maven工程的创建--JavaSEJavaEE

1、idea创建Maven JavaSE工程:  2、idea创建Maven JavaEE工程:   (1)手动创建 (2)插件方式创建 在idea里安装插件JBLJavaToWeb; 选择需要生成的项目文件后,右击: 项目的webapp文件夹出现小蓝点,代表成功。

插件maven-search:Maven导入依赖时,使用插件maven-search拷贝需要的依赖的GAV

然后粘贴: <dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>8.0.26</version> </dependency>

三、Maven工程的构建

首先,创建和构建是两个概念。 构建是指将源代码、依赖库和资源文件等转换为可执行或可部署的应用程序的过程。 在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。 项目构建是软件开发过程中至关重要的一部分,它能够大大提高软件开发效率,使得开发人员更加专注于应用程序的开发和维护,而不必关心应用程序的构建细节。 同时,项目构建还能将多人写的代码聚合,并能够自动化项目的构建和部署,