特来电混沌工程实践

一、导语

随着大型分布式系统架构的演进和广泛应用,软件工程的最佳实践也随之改变。
我们通过分布式、服务化、DevOps、敏捷开发,快速响应业务的需求变化,支持大规模分布式应用。但这些做法带来效益的同时,也带来了另一个紧迫问题:我们到底有多少把握来确保线上复杂的系统能够正常工作呢?
即便是分布式系统中每个独立的服务都正常工作,服务之间的相互调用也仍然可能造成不可预期的结果。这些结果在现实中可能很少发生,但是一旦发生就会影响整个生产环境,使得整个分布式系统变得混乱不堪,甚至出现服务雪崩、系统全面宕机。

不是由你来选择那一刻,而是那一刻来选择你!
你只能选择为之做好准备。
           —消防队长 Mike Burtch

因此,我们有必要在线上事故出现之前,提前识别出系统的有哪些点、这些弱点的影响范围。我们需要一种方式来管控这些系统的固有混沌,在保证快速响应业务需求变化的同时,做到最后不管系统有多复杂,我们的线上应用经得住各种“”。

通过应用一些经验探索的原则,来观察系统是如何反应的。这就跟科学家做实验去学习物理定律一样,通过做实验去了解整个系统。我们从受控的试验中掌握分布式系统运行行为的过程,称为混沌工程。

混沌工程不是制造问题,而是揭示问题。
—Nora Jones,Netflix 高级混沌工程师

混沌工程的典型实践-Chaos Monkey,捣乱的猴子;拜 Netflix 所赐,现在大部分的混沌工程项目都叫做 Monkey,也就是一只捣乱的猴子,在你的系统里面上蹦下窜,不停捣乱,直到搞挂你的系统。

640?wx_fmt=png

为什么需要混沌工程:

应用混沌工程可以提升整个系统的弹性。通过设计并且进行混沌实验,我们可以了解到系统脆弱的一面,在还没出现线上事故之前,我们就能主动发现这些问题,并尽可能的解决这些问题。

混沌工程和测试有什么区别:

虽然混沌工程跟传统测试通常都会共用很多测试工具的,譬如都会使用错误注入工具,但:
混沌工程是通过实践对系统有更新的认知,而传统测试则是使用特定方式对某一块进行特定测试。
譬如在传统测试里面,我们可以写一个断言,我们给定特定的条件,产生一个特定的输出,如果不满足断言条件,测试就出错了,这个其实是具有很明确的特性。但混沌工程是试验,而试验会有怎样的结果,我们是不确定的。
譬如我们可以进行下面的这些试验:

  • 模拟整个 IDC 宕机

  • 选择一部分网络连连接注入特定时间的延迟

  • 随机让一些函数抛出

  • 异常强制 NTP 时间不同步

  • 生成 IO 错误

  • 榨干 CPU


这些混沌试验到底会有什么样的结果,有些我们可以预料,但有些可能我们就不会预先知道,只有发生了,才会惊讶,
“啊,怎么会这样!”

二、混沌工程的方法论

既然是工程,那么就会有方法论,也就能详细的归纳总结出来实施的步骤
1. 混沌工程的一般实施步骤

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

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

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

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

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

2. 实施混沌工程的推荐原则
 2.1. 根据“稳定状态下系统的特征”做一个假设
 以充电为例,充电服务可能包含了订单服务,开启充电、结束充电、电量更新服务,账户服务、计费策略服务,“假设”不是着眼于各个“螺丝钉”服务的具体状态,而是着眼于整个充电系统正常运作下的外部表现(状态),如开启充电TPS、正在充电中订单数、电量更新 TPS、结束充电TPS、充电服务异常等等,这些监控指标曲线一般不会大起大落,其变化趋势是可以预期的。
 但是有一点需要特别注意,某些问题虽然不会怎么影响整体监控指标,
 但是仍然需要监控系统中各个节点的微观指标(如CPU、IO等)。

 2.2 事件是现实世界真的可能发生的
任何可能影响系统稳定状态的都可以作为事件,常见的,如
故障类:像服务器宕机、重启、断网等硬件故障、服务超时、Nginx不可用、核心应用未重启等应用故障;
非故障事件:像流量激增
同时,还可以分析曾经引起系统故障的事件的种类和频次,针对性的排列优先级,并复现这些事件,避免系统再次出现这种故障。

 2.3. 在生产环境跑
根据第1条,一般只有生产环境的指标是可预测的,如每日充电订单量、开启充电量、电量更新TPS等。而且,由于测试环境和生产环境不可能一模一样,为了真实反映系统的可靠性,一般推荐在生产环境实施混沌工程。

 2.4. 持续集成
线上应用每天都在更新,所以像跑持续集成一样实施混沌工程,持续发现问题、解决问题。

 2.5. 最小化影响范围
 混沌工程可能导致线上功能不可用,甚至造成宕机事故,所以在以找出系统弱点为目的的前提下,需要最小化故障影响范围,并且当出现严重问题时可以迅速恢复,即故障是可控的。鉴于此,需要控制最小化影响范围。

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

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

阶段二:分布式系统弹性化成熟
以Netflix为例,他们基本上已经在按照上述理想的步骤和原则实施混沌工程,工作日持续、自动的实施混沌工程,系统具备高度的可靠性,弹性伸缩。

三、混沌工程的成熟度模型

混沌工程成熟度模型,Netflix (网飞)总结了两个维度,一个是复杂度,一个就是接受度
前者表示的是混沌工程能有多复杂,而后者则表示的是混沌工程被团队的接受程度。
复杂度分为哪几个阶段:

640?wx_fmt=png

接受度分为哪几个阶段:

640?wx_fmt=png

我们目前处于起步发展阶段,线上生产环境实施混沌工程,风险很大,也不可控,因此:

我们在压测模拟环境实施混沌工程,搭建类似生产的小型模拟环境,以正常、合理的测试结果,作为基准“稳定状态”。在模拟测试的过程中,对系统实施各类混沌实验后,通过观察测试结果来评估系统的可靠性,从而寻找系统弱点,
登记Bug,进行修复。

同时,通过自动化运维平台,实现混沌实验异常注入和持续执行。

四、混沌工程的执行

1. 混沌工程的整体实施流程

640?wx_fmt=png

2. 混沌事件注入

应用层的混沌事件

640?wx_fmt=png

640?wx_fmt=png

中间件层混沌事件

640?wx_fmt=png

数据库层和基础实施层混沌事件

640?wx_fmt=png

3. 混沌实验闭环

所有的混沌实验必须实现闭环,发现问题,分析问题,解决问题

因此我们增加了一类单据统一管理混沌实验,便于总结、分析、跟踪

640?wx_fmt=png

以上是我们今年搞混沌工程,提升系统可用性的一些实践,分享给大家。


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

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

相关文章

[ZJOI2007] 棋盘制作(单调栈 / DP悬线法)

problem 洛谷链接 solution1-单调栈 很容易想到,预处理出每个点向上最大能延伸的长度,然后对每个点求一个矩阵面积。 然后思考优化,不难想到每次对一行进行求解。 每一行的所有列一起构成了一个直方图。 直方图直接经典笛卡尔树。笛卡尔…

构建现代Web应用时究竟是选择传统web应用还是SPA

在大前端盛行的今天,似乎前后端分离的开发模式才是大势所趋,而SPA的概念更是应运而生。现在随便构建一个web应用程序如果你不是使用SPA的话,就会感觉有点low,但是真的是这样吗?今天这篇文章我们就来一起探讨下&#xf…

你所不知道的ASP.NET Core MVC/WebApi基础系列(二)

冒个泡,算起来估计有很长时间没更新公众号了,估计是我第一次停更如此之久,人总有懒惰的时候,时间越长越懒惰,但是呢,不学又不行,持续的惰性是不行dei,要不然会被时光所抛弃&#xff…

POJ-2069 Super Star(最小球覆盖)

POJ-2069 Super Star 题意&#xff1a; 给你n个点&#xff0c;求覆盖所有点的最小球的半径 4<n<30 题解&#xff1a; 求最小球覆盖的步骤&#xff1a; &#xff08;1&#xff09;对于一个点&#xff1a;球心就是这个点&#xff0c;且半径无穷小。 &#xff08;2&…

ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)

早就听说ASP.NET Core 3.0中引入了gRPC的服务模板&#xff0c;正好趁着家里电脑刚做了新系统&#xff0c;然后装了VS2019的功夫来体验一把。同时记录体验的过程。如果你也想按照本文的步骤体验的话&#xff0c;那你得先安装.NET Core3.0预览版的SDK。至于开发工具我用的时VS201…

结合使用 Draft 与 Tencent Kubernetes Engine (TKE)

Draft 是一种开源工具&#xff0c;有助于在 Kubernetes 群集中打包和部署应用程序容器&#xff0c;让你专注于开发周期 - 专注开发的“内部循环”。 在开发代码期间&#xff0c;但尚未将代码提交到版本控制之前&#xff0c;Draft 将会运行。 借助 Draft&#xff0c;可在代码发生…

[ZJOI2010] 贪吃的老鼠(二分+差分+神仙建图网络流)

problem luogu-P2570 solution 卧槽网络流尼玛神题 首先这个最小延长时间 TTT &#xff0c;套路地考虑二分&#xff0c;将问题转化为判定性问题。 其次 n,mn,mn,m 和奶酪存在时间 [l,r][l,r][l,r] 的量级差很大&#xff0c;我们肯定会猜想一段时间内选择吃奶酪的老鼠是一样…

基于IdentityServer的系统对接微信公众号

业务需求公司有两个业务系统&#xff0c;A和B&#xff0c;AB用户之间属于多对一的关系&#xff0c;数据库里面也就是两张表&#xff0c;A表有个外键指向B。现在需要实现以下几个功能。A用户扫描B的二维码&#xff0c;填写相关的注册信息&#xff0c;注册完成之后自动属于B。也就…

Ocelot Api网关教程(9)- QoS

本文介绍Ocelot中的QoS(Quality of Service)&#xff0c;其使用了Polly对超时等请求下游失败等情况进行熔断。1、添加Nuget包添加 Ocelot.Provider.Polly 到OcelotGetway项目中2、修改 Startup.ConfigureServices 如下来添加Polly&#xff1a;services .AddOcelot(new Confi…

cf1553F. Pairwise Modulo

cf1553F. Pairwise Modulo 题意&#xff1a; 给你一个数组a&#xff0c;a由n个不同的数组成,让你求出对应的数组p 数组p的定义为&#xff1a; pk∑1≤i,j≤kaimodajp_{k}\sum_{1\leq i,j\leq k}a_{i} \mod a_{j}pk​∑1≤i,j≤k​ai​modaj​ 题解&#xff1a; 官方题解 首…

Abp框架准备加入.NET Foundation

Abp团队正准备尝试将Abp项目加入.NET Foundation!既然申请了,必然有很大的自信能够成功,请大家等待好消息!Abp中文网会第一时间跟进.点击阅读原文查看最新进展.

[ZJOI2014] 璀璨光华(bfs建图 + dfs搜索)

problem luogu-P3342 solution 你感觉这道题没考什么&#xff0c;又感觉考了什么 通过样例以及题面&#xff0c;我们并未获取到『立方体每个小方块的编号是按一定规则命名』的信息。 也就是说&#xff0c;我们需要通过输入的每个小方块相邻的编号的信息来建出这个立方体的…

SignalR 中丰富多彩的消息推送方式

在上一篇 SignalR 文章中&#xff0c;演示了如何通过 SignalR 实现了简单的聊天室功能&#xff1b;本着简洁就是美的原则&#xff0c;这一篇我们也来聊聊在 SignalR 中的用户和组的概念&#xff0c;理解这些基础知识有助于更好的开发基于 SignalR 的应用&#xff0c;通过对用户…

Visual Studio 2019 使用 Live Share

一.前言Visual Studio 2019 在今天发布&#xff08;北京时间&#xff09;了&#xff0c;这次带来了一个比较有趣的 Live Share 功能&#xff0c;使用它可以进行更好的协作开发。主要功能&#xff1a;更多资料可看官方介绍&#xff1a;Visual Studio 实时共享什么是Visual Studi…

cf1523B. Lord of the Values

cf1523B. Lord of the Values 题意&#xff1a; 给你一个数组&#xff0c;有n个数&#xff0c;n为偶数&#xff0c;a1&#xff0c;a2…an 现在有两个操作&#xff1a; 对于i<j 操作1&#xff1a;aiaiaj 操作2&#xff1a;ajaj-ai 把原数组转换为-a1,-a2,-a3… 题解&#…

Asp.Net Core WebAPI使用Swagger时API隐藏与分组

1、前言为什么我们要隐藏部分接口&#xff1f;因为我们在用swagger代替接口的时候&#xff0c;难免有些接口会直观的暴露出来&#xff0c;比如我们结合Consul一起使用的时候&#xff0c;会将健康检查接口以及报警通知接口暴露出来&#xff0c;这些接口有时候会出于方便考虑&…

为您的机器配置开发环境

软件准备在本期视频中&#xff0c;我们将安装所序言的软件&#xff0c;并为我们的电脑配置.NET Core开发环境。我们需要安装如下2个软件&#xff1a;一个编辑器.NET Core SDK&#xff08;Software Development Kit&#xff09;下载并安装.NET Core 开发编辑器我的是Windows操作…

[CQOI2012] 局部极小值(状压DP + 容斥 + 搜索)

problem luogu-P3160 solution 这么小的数据范围&#xff0c;非暴力不状压。暴力 O(28!)O(28!)O(28!) 呵呵呵可以拉走了。 我们不妨从小到大填数字&#xff0c;这样如果局部极小值点还没有填的话&#xff0c;周围的九宫格就一定不能被填。 设 dp(s,i):dp(s,i):dp(s,i): 局…

基于Kubernetes 构建.NET Core 的技术体系

很多公司技术支持岗位的工作&#xff0c;如配置域名&#xff0c;部署环境&#xff0c;修改复位配置&#xff0c;服务重启&#xff0c;扩容缩容&#xff0c;梳理和完善监控&#xff0c;根据开发的需要查找日志等工作&#xff0c;需要和开发进行大量的沟通&#xff0c;如什么是外…

[CQOI2014] 危桥(网络流)

problem luogu-P3163 solution 这是一道网络流好题&#xff0c;看的着摸不着吃不着。 初读完题&#xff0c;就知道这是一道“脱光了”的最大流。 建图基础版本&#xff1a; 建立额外源汇点。 无向边相同于两条有向边&#xff0c;直接建不影响&#xff0c;危桥流量设成 22…