信念的覆灭与重建
在我最开始学习编程的时候,我始终感觉写程序是很简略的事件,程序总是依照我的想法串行的执行,给一个输出,总是有着合乎预期的固定输入。那时候写代码,可能大的挑战在于了解分支,循环,但无论怎样,只有管制切当,事件总是确定的。
那段时间能够算是十分高兴的日子,直到我遇到了多线程,人生中第一次有了『自信被突破』的恐慌,在多线程的世界里,事件不会在依照我想的形式来失常的运行,我须要思考 data racing,须要思考 memory ordering。侥幸的是,在经验了短暂的不适应之后,很快我就能很好的拥抱并发了,毕竟咱们这个世界原本就是在并行运行的。尽管写多线程程序相比之前更加的艰难,但其实只有把握了一些多线程的并发原语,晓得如何应用 mutex,semaphore,channel 这些,其实会发现多线程的世界也是蛮有意思的。再加上,新一代的编程语言,无论是 Go,还是 Rust,都能让大家更加熟能生巧的解决并发问题,只有解决切当,给定一个输出,依然能失去咱们想要的输入。只不过,这时候要保障确定性要比之前艰难了很多。
但好景不长,在驾驭了多线程之后,我的『自信再一次被突破』了,因为我进入了分布式系统的世界,在这个世界外面,所有都变得不再确定。给定一个输出,我可能失去的后果是未知,因为我不晓得这个执行在远端是否被失常的执行了。而人类对于未知恰好是最恐慌的。我不晓得我的零碎什么时候会呈现网络异样,或者磁盘什么时候忽然坏掉,或者机房是不是忽然断掉了,所有的所有,对我来说都是未知的,譬如上面是咱们在理论中遇到的一个问题:
咱们的用户将 TiDB 运行在国内某云厂商的机器下面,而后跟咱们反映,读提早会不定期的增长,咱们看了看监控,发现惟一的异样指标就是 Cached 的 memory 那段时间会忽然降落。过后真的就懵了,齐全不晓得起因是什么。最终发现,云厂商的运维监控脚本外面有个 bug,会不定期的将磁盘热拔插,并且将现有的 page cache 刷到磁盘,所以那段时间 TiDB 的 read 操作很多是从磁盘从新读取数据的。
能够看到,分布式系统真的是一个非常复杂的零碎,故障无处不在,那么咱们如何在这么简单的分布式系统的世界外面生存上来呢?当初,一个很好的答案就是 – Chaos Engineering,中文外面叫做混沌工程。
混沌工程
相比于咱们成天担惊受怕零碎会呈现什么样的问题,还不如提前就模仿线上环境可能呈现的各种状况,来看咱们的零碎是否能做到容错,依然能持续对外提供服务。当然,咱们并不是简略的就在线上环境下面,把机器给断电,或者把网线给拔掉,在混沌工程畛域,有一套领导准则,以及规范的试验步骤,具体的能够参考 PRINCIPLES OF CHAOS ENGINEERING。
简略来说,要做一次混沌试验,咱们只须要做到如下的 4 个步骤:
- 定义零碎的稳态,这个稳态就是零碎在失常运行的时候一些指标,譬如以后申请的 QPS,latency 等。
- 将零碎分为实验组以及对照组,做出一个假如,譬如我在实验组引入一个故障,这个稳态依然能在实验组放弃。
- 执行试验,给实验组引入事实世界中的故障,譬如拔掉网卡。
- 验证第 2 步的假如是否成立,如果实验组的稳态跟对照组不一样了,证实咱们的零碎在第 3 步的故障中不能很好的容错,所以咱们须要改良。
能够看到,下面的步骤十分的简略,但要在理论中很好的做混沌试验,还是有一些艰难的,次要在以下几点:
- 自动化 。咱们须要有一套自动化的零碎帮咱们进行故障注入,进行假如比照等。
- 尽可能多的引入不同故障 。事实环境中可能会呈现十分多的故障,仅仅不是拔网线这么简略,所以引入的故障越多越好。
- 业务方无感知 。如果咱们每次做混沌试验,都要业务零碎去配合,譬如在业务外面写一些混沌相干的代码,让混沌试验调用,或者更改零碎的部署逻辑,跟混沌试验配合,这种的就属于紧耦合的。
你好,Chaos Mesh®!!!
所以,为了让大家更好的做混沌试验,咱们开发了 Chaos Mesh®,Chaos Mesh® 是一套基于 Kubernetes 的云原生混沌工程平台。Chaos Mesh® 的架构如下:
相比于其余混沌平台,Chaos Mesh® 有如下劣势:
- 基于 K8s。只有你的零碎能跑在 K8s 下面,那么就能够无缝的集成 Chaos Mesh®,而且不必批改任何业务代码,真正是被测系统无感知。
- 多种多样的故障注入 。Chaos Mesh® 能全方位的帮你对网络,磁盘,文件系统,操作系统等进行故障注入。咱们前面也会提供对 K8s,或者云服务本身进行 chaos 的能力。
- 易于应用 。你无需关注 Chaos Mesh® 的底层实现细节,只需用 YAML 配置好混沌试验,就能够施行,前面所有的试验是全自动化的。咱们也提供了 Dashboard 能让你在网页上就轻松的进行试验。
- 可观测性 。Chaos Mesh® 的 Dashboard 能很不便的让你观测零碎,晓得什么时候进行了什么试验,晓得你本人的零碎以后的运行状况,当然,这里须要一点配置,你须要通知 Chaos Mesh® 如何去获取你零碎的稳态指标,譬如你的零碎应用 Prometheus,那么就能够通知 Chaos Mesh® 如何去 Prometheus 查问相干的监控指标。
- 弱小的开源社区反对 。Chaos Mesh® 的社区成长的十分迅速,咱们非常高兴的看到大部分的性能曾经由社区反对,并且也有很多用户。你无需放心遇到问题不晓得如何解决,当然,你可能要放心下 Chaos Mesh® 做试验的时候把你的数据给齐全干掉,所以做试验的时候肯定要管制好试验半径,这个也是混沌工程的一条准则。
来一次 Chaos 试验?
在咱们开始一次 Chaos 试验之前,你首先须要满足两个条件:
- 你本人的业务是跑在 K8s 下面的。
- 在 K8s 下面 装置了 Chaos Mesh®。
另外,在开始试验之前,这里我还是要强调一下 Chaos 试验的一些注意事项,可能你感觉我这个大叔很啰嗦,但小心驶得万年船,因为略微一不注意,你可能就丢了数据了。
- 如果你刚筹备将你的零碎利用 Chaos Mesh®,肯定要保障首先在测试环境中应用。你的零碎应该还十分的软弱,如果在线上进行试验,会十分的危险。
- 在生产零碎中,肯定要管制好试验的爆炸半径,管制好影响范畴,譬如咱们能够先对某一个街道的用户进行烦扰,而后在扩充到某一个区域,或者某一个城市,如果咱们一开始的影响半径就很大,一个略微不注意,你的 boss 就可能让你第二天滚蛋了。
- 做混沌试验肯定不是随机的瞎做试验,咱们是带有目标的,是须要布局好的,与其漫无目的的对系统随机进行故障注入,咱们还不如先问本人一个问题『为了对系统在凌乱情况下的体现更有信念,在哪里做混沌试验最有价值?』也就是咱们要相熟理解咱们的零碎,做高杠杆价值的混沌试验。
好了,当初你曾经齐全筹备好了,当初就能够踏上混沌之旅了,因为 Chaos Mesh® 的应用是如此简略,你只须要参考 用户指南 就能上手应用,所以我就不过多介绍了,如果你依然遇到了问题,欢送给 Chaos Mesh® 提 issue,置信我,Chaos Mesh® 社区会很激情的帮你解决问题的。
总结
随着 ServiceMesh,Serverless 等理念的衰亡,咱们的零碎真的越来越趋向于分布式,这样尽管简化了咱们单个模块的实现,但整体来看,也可能会导致咱们的零碎因为过于分布式而变得复杂,那么如何在这种简单的环境下依然让咱们有信念能保证系统的失常稳固运行,混沌工程能够算是一个很不错的抉择。
当初市面下面,反对混沌工程的平台曾经有很多了,但我这里依然举荐 Chaos Mesh®,毕竟应用它能让你极大晋升你对系统的信念。
最初,欢送来到简单的分布式系统世界。