HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

混沌工程 - 软件系统高可用、弹性化的必由之路

  • 2020-03-11
  • 本文字数:2351 字

    阅读完需:约 8 分钟

混沌工程 - 软件系统高可用、弹性化的必由之路

随着摩尔定律的终结,单机计算性能已达到了极限,然而,我们的软件系统不论是规模还是复杂度一直在增长,所以软件系统都不约而同的朝着分布式化方向发展。近年来,随着云服务、容器的出现,某些分布式系统也更容易微服务化。


抛开这些形形色色的分布式技术,我们对系统可靠性的述求却是一致的:分布式系统需要高可用,即使出现了单点或集群故障,也希望系统具备自我恢复或优雅降级的弹性能力、容错能力。


我们在合理的架构,高质量的代码,完善的测试等等方面做了很多努力,然而很多分布式系统仍旧达不到高可用、弹性化,为了尽可能发掘系统中存在的弱点,很多大型软件公司都引入了混沌工程,如国外的谷歌、网飞,国内的京东等等。哪些可以称之为系统弱点呢,比如


  • 外部系统故障,导致内部系统连锁故障,我司即出现过因为七牛服务故障导致的内部故障

  • 服务不可用时,不合适的降级方案

  • 不合适的超时机制,导致请求错误时无限次重试

混沌工程的定义:

通过观察分布式系统在受控的故障注入测试中的行为变化发掘系统弱点,并针对性的改进,从而提高系统可靠性,建立系统抵御失控条件的能力的信心。所以,混沌工程并不是一个新概念,常见的异地容灾测试也是混沌工程的一种应用。

混沌工程的一般实施步骤

  • 寻找一些系统正常运行状态下的可度量指标,作为基准的“稳定状态”

  • 假设实验组和对照组都能继续保持这个“稳定状态”

  • 对实验组进行事件注入,如服务器崩溃、硬盘故障、网络连接断开等等

  • 比较实验组和对照组“稳定状态”的差异,推翻上述第 2 条的假设


如果混沌工程实施下来两者的“稳定状态”一致,则可以认为系统应对这种故障是弹性的,从而对系统建立更多信心。相反的,如果两者的稳定状态不一致,那我们就找到了一个系统弱点,从而可以修复它,提高系统可靠性。

混沌工程的理想原则:

1)根据“稳定状态下系统的特征”做一个假设

以电商下单为例,下单系统可能包含了商品服务,交易服务,支付服务,“假设”不是着眼于各个“螺丝钉”服务的具体状态,而是着眼于整个下单系统正常运作下的外部状态,如下单量、成交金额、系统吞吐量、延时、错误率等等,这些指标一般会有大盘监控,而且除非遇到促销活动,这些指标曲线一般不会大起大落,其变化趋势是可以预期的。但是有一点需要特别注意,某些问题虽然不会怎么影响大盘数据(如缓存失效、一个 CDN 节点失效等等),但是我们仍旧需要监控系统中各个节点的微观指标(如 CPU、IO 等)以期发现这类问题(缓存失效可能导致 Mysql 集群压力增大,CPU/IO 等压力变大)。

2)事件是现实世界真的可能发生的

任何可能影响系统稳定状态的都可以作为事件,常见的,如


  • 故障类:像服务器宕机、断网等硬件故障,像七牛等外部服务不可用的软件故障

  • 非故障事件:像流量激增


我们还可以分析曾经引起系统故障的事件的种类和频次,针对性的排列优先级,并实施这些事件,避免系统再次出现这种故障。

3)在生产环境跑

根据第 1 条,一般只有生产环境的指标是可预测的,如新用户日注册量,用户日下单量。而且,由于测试环境和生产环境不可能一模一样,为了真实反映系统的可靠性,一般推荐在生产环境实施混沌工程。

4)持续集成

互联网软件每天都在更新,所以像跑持续集成一样实施混沌工程具有现实意义。

5)最小化影响范围

根据第 3 条,混沌工程可能导致线上功能不可用,甚至造成资损,所以在以找出系统弱点为目的的前提下,需要最小化故障影响范围,并且当出现严重问题时可以迅速恢复,即故障是可控的。鉴于此,有时候可以引入 A/B 测试,最小化影响范围。


上面是最理想情况下的混沌工程,现实中我们需要根据现有软件成熟度有阶段的实施混沌:

阶段一:分布式系统弹性化一般

以京东为例,他们会在双十一大促之前进行故障演练,将团队分为两组,一组作为故障的制造者,另外一组作为故障的解决者和响应者,来考察故障发生的时候,团队对故障的检测、响应、处理还有恢复能力。达到小的故障不需要人介入,大故障人工介入可以快速处理的目的。通过在大促之前的两个月期间密集的开展混沌工程,提高团队对大规模故障的容错能力。


以有赞为例,由于我们才刚刚开始,为了控制风险,起初只会在测试环境实施混沌工程,所以暂时没有可以参考的准确大盘数据,即合适的基准“稳定状态”。但也不是不可能,观察大盘数据可以认为反映的是系统宏观指标,从微观角度来讲,我们可以筛选出一批直接影响核心大盘数据(如注册量、下单量等)的接口,在对系统实施混沌后执行这些接口的场景化集成测试,通过观察测试结果来评估系统的可靠性,从而寻找系统弱点,这在测试环境是可行的。


此外,混沌工程可以认为是通用型异常不定时不定目标不定异常类型的自动化实现,如果抛开这层,手动对目标机器注入特定的一种或多种异常,并辅以对应的异常恢复手段,那我们就可以在通用异常测试中应用。

阶段二:分布式系统弹性化成熟

以网飞为例,他们基本上已经在按照上述理想的步骤和原则实施混沌工程,工作日持续、自动的实施混沌工程,系统具备高度的可靠性,弹性伸缩。

有赞混沌工程的实现:

由于混沌工程主要是注入特定的事件并引起系统故障,既然是“干坏事”的,所以我们将其命名成了“威震天”(变形金刚中的反派 Boss)。由于我们还处于第一阶段,所以故障的注入主要是人为控制,目前已实现的故障类型有:


  • CPU 高负载

  • 磁盘高负载:频繁读写磁盘

  • 磁盘空间不足

  • 优雅的下线应用:使用应用的 stop 脚本平滑的停止应用

  • 通过 kill 进程直接停止应用,可能造成数据不一致

  • 网络恶化:随机改变一些包数据,使数据内容不正确

  • 网络延迟:将包延迟一个特定范围的时间

  • 网络丢包:构造一个 tcp 不会完全失败的丢包率

  • 网络黑洞:忽略来自某个 ip 的包

  • 外部服务不可达:将外部服务的域名指向本地环回地址或将访问外部服务的端口的 OUTPUT 数据包丢弃


参考文献


PRINCIPLES OF CHAOS ENGINEERING(http://principlesofchaos.org/


2020-03-11 22:201074

评论

发布
暂无评论
发现更多内容

架构实战营 - 模块 7 - 王者荣耀商城异地多活架构设计

雪中亮

架构实战营 #架构实战营

【Flutter 专题】52 图解可折叠状态栏

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 9月日更

【LeetCode】检查平衡性Java题解

Albert

算法 LeetCode 9月日更

架构实战营模块 7 作业

zlz

css中塌陷问题指的是什么,margin和padding应该怎么区分

你好bk

CSS html css3 大前端

14. DeepMind--会打游戏的人工智能

Databri_AI

人工智能

学读代码比学写代码更重要

baiyutang

编程 工程规约 9月日更

模块七作业

袁小芬

特洛伊木马-图解VXLAN容器网络通信方案

Lance

月薪10K码农,跳槽到40K架构师,技术学习路线图汇总

小傅哥

Java 学习 运维 大前端 后端

聊聊 Jmeter 如何并发执行 Python 脚本

星安果

Python Jmeter 并发 文件上传

模块七作业

Mr.He

架构实战营

架构训练营 模块六

小卷儿

springboot vue二手交易市场毕设源码

清风

毕业设计

Kubernetes生态系统与演进路线

博文视点Broadview

手撸二叉树之二叉树的直径

HelloWorld杰少

九月

模块七作业

VE

架构实战营

计算机中遇到的单位该怎么换算

耳东@Erdong

计算机 9月日更 单位换算

模块7作业

柱林

架构实战营模块 7 作业-王者荣耀商城异地多活架构设计

蔸蔸

王者荣耀商城异地多活分析-模块7

小牧ah

架构实战营

架构实战营模块七作业

子豪sirius

架构实战营

【架构训练营】模块七作业

zclau

【OpenIM原创】C/C++调用golang函数,golang回调C/C++函数

OpenIM

深入了解Spring之ConfigurationClassPostProcessor

邱学喆

@Bean @ComponentScan @PropertySource @Import @ImportResource

模块七作业

河马先生

架构实战营

架构实战营 模块七 作业

脉醉

#架构实战营

《联想发布绿色智城解决方案,加速城市绿色低碳转型发展》

科技大数据

模块七-游戏商城异地多活架构设计

babos

#架构实战营

架构训练营模块七作业

喻高咏        

架构训练营 模块七

C#多线程开发-任务并行库04

Andy阿辉

C# asp.net 多线程 多线程并发

混沌工程 - 软件系统高可用、弹性化的必由之路_文化 & 方法_有赞技术_InfoQ精选文章