IT运维如何完成一场高质量复盘
复盘的终极目标是:还原事实,找到薄弱点加以改进。
提到复盘,很多人的第一反应是线上故障,有人要背锅了。
复盘真正的价值是还原事实,在薄弱处加以改进。如何做一次高质量的复盘,我们给出3点建议。
1、坦然接受故障的存在
在复杂的网络系统中,出现故障是再正常不过的事情。故障带来的未必都是负面的意义,譬如通过小故障发现一个大隐患。或者某次故障让相关人员意识到应急预案的主要性,甚至是由于故障原因特殊造成较大的影响,这些可以从故障复盘中获得的宝贵经验。
用辩证的眼光去看待故障,遇到故障能快速恢复,发现更多问题就是正向价值。
2、汲取经验,提升完善系统设计
复盘是为了总结和改进,复盘故障,从中汲取教训进行学习,提升我们的经验,完善系统的设计,能做到以下几点:
1、找到根因,优化改进。
2、找到降低故障发生概率的方法,保障业务稳定运行。
3、找到让业务快速恢复的方法,降低故障影响。
每一次的线上故障,都是一次实战练兵的好机会,除了系统本身的高可用,我们的组织也应该是高可用的,我们经常说好的系统架构是具有韧性的,那么好的团队组织也应该是反脆弱的。所以复盘的过程中,除了找系统本身的问题,还要找工具的问题、流程机制的问题、管理的问题等等。这样,我们才能由点及面的系统化地解决问题,即治标又治本。
3、抓住复盘关键环节
1)故障还原
还原故障,即发生了什么故障,影响什么业务或产品等基本情况。例如:“x月x日xx时,xxx系统出现异常,导致了xxx,影响了xxx业务,表象为用户无法正常下单,点击下单按钮出现网络开小差,出现了大量客诉等等”。
让人第一眼了解清楚这个复盘的来龙去脉。
2)故障影响范围
讲清楚本次故障的影响范围,包括影响时间段、影响的业务(产品)线、影响的系统(服务)、订单量、用户量、客诉量,以及有无产生资损等等。
3)故障时间线回放
提升系统可靠性的两个关键手段:降低故障发生概率和缩短故障持续时间。回放故障的时间线,即先从旁观者的角度来理一遍故障过程,是为了思考如何缩短故障持续时间(MTTR),拆解时间段:
1、从故障开始到应急响应介入的时间,一般是考察监控告警、人员值班oncall的合理性。
2、从应急响应介入到故障定位的时间,主要考察根因分析、可观测性等工具的能力。
3、从故障定位到故障恢复的时间,主要考察应急预案、快恢体系的能力。
4、从故障恢复之后到确认故障已经解决的时间,一般通过用户反馈、自动化测试等确认恢复。
因此在回放时间线的过程中,也要注意对以下几个关键时间点进行识别,然后逐个沟通讨论如何缩短其中的每一个环节耗时。
需要注意提前识别出来的关键时间点:
故障引入时间点: 即这个故障实际上是从什么时候开始的,可能是某次变更发布/线上操作/其他等。
业务指标变化时间点: 业务指标开始下跌、开始恢复等
监控告警发出时间点: 即监控是从什么发现异常的,告警什么时候发出的。告警的级别、接收人是否响应超时等相关信息都要记录进来。
人员介入响应时间点: 故障对应的系统值班owner是从什么时候开始响应的。
异常定位时间点: 即定位到故障的异常点,注意:故障处理过程中的根因定位,并非是最底层的根本原因,而是指初步确认了故障的异常点,可以进行下一步的应急止血动作。
关键操作时间点:是否做了一些应急预案,包括重启、恢复、止血、高可用配置等。还需要写清楚每个操作的结果,即每个操作之后,报错面有无缩小、系统资源水位有无变化等。
确认故障恢复时间点: 通过测试验证或者观测业务指标、系统日志等确认系统已经恢复。
4、深挖根因
一般情况下,故障是由两类原因引起的,包括直接(诱发)原因和根本原因,也就是所谓的诱因和根因。
因此在复盘过程中,既要明确诱因,更要深挖根因。比如说,某个业务系统由A/B/C 3个服务组成,依赖关系依次是A依赖B、B依赖C,某次开发同学修改了线上C服务的一个配置,使用了错误的格式,导致了整个业务系统不可用。那么在原因分析过程中,把配置文件修改为错误的格式这个动作肯定是直接原因,但是也要注意,B服务对C服务的依赖关系是强依赖么?如果C服务出现异常的情况下,B服务是否要进行兜底?等等。
可以基于5why分析法深挖根因,多问几个为什么,层层递进,比如说这样的一个场景: 线上系统运行过程中,某个ES节点突然抖动,RT时间明显变长,95线由200ms升至800ms,然后引发了上游业务异常。那么在分析原因的时候,要问以下几个问题:
1、为什么ES会抖动?
2、ES的可用性标准是什么?
3、ES抖动之后,有出现告警吗?相关人员有第一时间介入处理吗?
4、ES抖动之后,上游直接使用它的服务有兜底措施吗?是否为强依赖?
5、对于这个业务场景来说,ES的直接上游系统是这条链路的核心依赖吗,从整个链路上有无兜底机制?
要层层递进深挖根因,千万不要浅尝辄止,那样可能会错过真正的改进事项。从以往的故障来看,很多问题背后都是系统设计的问题,这样的问题挖得越深,我们的系统可用性才会越强,才能慢慢朝我们理想中的高可用架构前进。
5、改进项汇总
把时间线和根因分别确认清楚之后,就能推导出我们对于本次故障复盘的改进事项了。在梳理改进事项的时候,除了与故障相关系统的改进项之外,还需要从整个故障处理过程来看,在故障的各个环节中有无需要优化改进的地方。
比如说某个故障是靠人工(用户投诉)发现的,那么要考虑下这个业务的监控告警是否完善,是否能够降低故障触达时间;比如说某个故障的告警发出之后,迟迟没有人响应,那么要从管理制度来看,对于应急值班政策的执行是否到位;比如某个故障的排查过程中,定位比较苦难,很多地方要靠人工去梳理很多信息,那么要考虑相应的排障工具是否好用、应急预案机制是否完善等等。
还有很多其他的问题,大家可以参考上面的MTTR分解环节和故障根因分解环节,自己展开思考下,这也是上面说要深挖根因和详细分析时间线的目的,这样我们才能不浪费每一次故障的机会。
在记录改进项的时候,可以考虑结合SMART原则来设计改进项:
1、S - 必须是具体的(Specific),改进项必须是可以落地的,不要泛泛而谈,例如”优化系统设计“这类就属于反例。重新设计A系统对B系统的依赖关系,使其能够对异常进行兜底,这种就属于具体的。
2、M - 必须是可以衡量的(Measurable),即改进项是可以评估的,比如说通过故障演练来检验依赖关系的有效性。
3、可以达到的,在当前的技术环境下,这个改进项是可行的,不要写未来太远的无法达到的事情。
4、其他目标具有一定的相关性,可以理解与本次故障中其他改进项有关联性。
5、明确的截止期限,要写清楚改进项的截止时间,在到期之后进行验收。
最后,改进事项重在闭环,这个环即PDCA循环,Plan(计划)-> Do(执行)-> Check(检查)-> Act(处理),对于我们的故障复盘来说,即所有的改进事项都必须经过故障演练,通过实战演练来确保改进计划一定是有效的。
6、复盘过程中的几个关键问题
在复盘中,可以把这些作为讨论的框架:
1、故障的根因是什么?
当前我们在聊的这个是根因吗?从业务场景对应的链路上看,这个系统(组件)是强依赖吗?依赖是否合理、有无兜底机制。这次的变更流程是否完善、三板斧落实地是否到位。对应的观测指标是否能反映系统的真实状态,应急策略是否有效等等。
2、故障为什么会发生,可以避免或者降低发生概率吗?
也就是所谓的提升,如果是变更引起的,那么要考虑变更流程是否完善,是否按照流程规范操作,有无对应的防御机制。如果是某个系统组件失效导致的,那么要评估该组件的可用性是多少,与它所在的链路是否匹配,这条链路是否要设计兜底方案等。如果是外部原因引起的,那么我们对外部的这个依赖是否有过认真的评估,对方的可用性能够满足我们的诉求。
3、如何快速恢复业务?
1、监控告警的及时性与准确性。建立健全完善的告警机制,保证快速准确的发现问题。
2、流程响应,不同资产对应不同的SLA,实现告警分级。对应相关人员。保障问题得到响应。
3、准确定位,快速恢复。故障快速恢复,降低业务影响为原则,处理过程中切记不要跑偏。
4、应急预案,在故障的处理过程中,应急预案的有效性也将得到验证。
5、检测架构设计本身高可用是否完善,是否具有容灾能力。流程制度是否规范,是否需要优化。
很多故障只是表象,大部分根因深挖下去,都会有技术管理的因素,虽然引发故障的操作可能是个人,但是更应该从团队的视角去看问题,避免把根因只归结到某个人身上。在故障处理过程中,积极参与定位、快速止血才是正向之道。
最后,复盘不是故障的结束,改进事项经过验收才是,因此每一个改进事项的相关方,都应积极主动地push完成。同时,为了最大化的利用好复盘文档的价值,需要更新知识库,存档与分发,吸收前人经验,避免重复踩坑。
相关文章:
IT运维如何完成一场高质量复盘
复盘的终极目标是:还原事实,找到薄弱点加以改进。 提到复盘,很多人的第一反应是线上故障,有人要背锅了。 复盘真正的价值是还原事实,在薄弱处加以改进。如何做一次高质量的复盘,我们给出3点建议。 1、坦…...
JVM调优面试题——基础知识
文章目录1、JDK,JRE以及JVM的关系2、编译器到底干了什么事?3、类加载机制是什么?3.1、装载(Load)3.2、链接(Link)3.3、初始化(Initialize)4、类加载器有哪些?5、什么是双亲委派机制?6、介绍一下JVM内存划分(…...
三、mongdb 查询
一、 MongoDB文档检索 MongoDB中有多种方式可以检索文档: 1.1 查询过滤器 使用查询过滤器从集合中检索文档。查询过滤器是一组键值对,可按字段值查询文档。 例如: db.col.find({"status":"A"})这个示例查询status等于“A”的文档。 1.2 范围查询操作符…...
python的 ping 网络状态监测方法(含多IP)
ping 基本概念 ping (Packet Internet Groper)是一种因特网包探索器,用于测试网络连接量的程序。Ping是工作在 TCP/IP网络体系结构中应用层的一个服务命令, 主要是向特定的目的主机发送 ICMP(Internet Control Messag…...
【独家】华为OD机试提供C语言题解 - 单词反转
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明单词…...
Linux docker环境安装,docker-compose安装,jdk17安装
安装docker 删除之前安装的docker yum remove docker \docker-client \docker-client-latest \docker- common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-sqlinux \docker-engine-selinux \docker-engine \docker-ce安装yum工具 yum install -y y…...
界面开发(3)--- PyQt5用户登录界面连接数据库
文章目录数据库账户注册账号登录找回密码为了实现用户登录界面的登录功能,我们必须建立一个数据库,并把账号和对应的密码,存储到数据库中。如果输入的账号和密码与数据库中的一致,那我们就允许用户登录,进入新的界面。…...
以下真的没有任何要写的了,我需要凑字数,请大家原谅
以下真的没有任何要写的了,我需要凑字数,请大家原谅!!!!!!!!!!!!!!!&#…...
2023年 Java 发展趋势
GitHub 语言统计表明,Java在编程语言中排名第二,而在2022年的TIOBE指数中,Java排在第四。 抛开排名,Java是自诞生以来企业使用率最高的编程语言,作为一种编程语言,它比许多竞争对手都有更多的优点…...
Lsof命令介绍
LSOF(List Open Files)是一款功能强大的开源工具,用于列出当前系统上打开的文件和进程。该工具可以帮助系统管理员和开发人员快速查找正在使用某个文件的进程,以及在系统上使用磁盘空间最多的进程。 本文将介绍LSOF的基本用法和常…...
LeetCode题目笔记——1487. 保证文件名唯一
文章目录题目描述题目链接题目难度——中等方法一:哈希表代码/Python代码/C总结题目描述 给你一个长度为 n 的字符串数组 names 。你将会在文件系统中创建 n 个文件夹:在第 i 分钟,新建名为 names[i] 的文件夹。 由于两个文件 不能 共享相同…...
【概念辨析】结构体内存对齐
一、什么是结构体内存对齐 是使得结构体的每个成员能够在及其访问的特定存储单元上的一种方法。 通过这种方法可以使得机器访问效率加快,也可以使得平台一致性变高。 二、结构体对齐的规则 有两组代码: #define _CRT_SECURE_NO_WARNINGS#include <…...
pg mysql oracle 中的schema
1、schema。 pg中的schema表示当前db中数据库对象的命名空间(namespace),数据库对象包括但不限于表、函数、视图、索引等。 对于熟悉mysql的人来说,在第一次看到pg中的schema的概念时,可能会疑惑,schema不是表示database的吗&…...
电脑快捷方式删除文件后四种找回方法
快捷指令是一种用作替代快捷键操作的技术。也可以称为“快捷键”,“快捷方式”或“快捷键序列”,它们允许用户在非常快速和方便的方式建立特定操作序列,这对于执行重复性或提高效率非常有用。通过使用快捷指令,您可以执行快速复制…...
Session会话管理
会话管理Web会话管理概述常见的Web应用会话管理方式基于Server端的Session的管理方式基于Cookie的Session的管理方式Cookie与Session最大的区别Cookie-Based的管理方式基于Token-Based的管理方式Web会话管理的安全问题Web会话管理概述 会话管理:在进行人机交互的时…...
极智开发 | ubuntu源码编译cuda版opencv
欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文介绍一下 ubuntu源码编译cuda版opencv。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:https://t.zsxq.com/0aiNxERDq 如果你需要源码编译cpu版的opencv可以…...
umi学习(umi4)
umi 官方文档 官方建议使用 pnpm node版本在 14 以上 创建项目: 根据 包管理工具不同 ,官方推荐 这里使用 pnpm: 1. pnpm dlx create-umilatest 2. 选择模板 (这里使用 Simple App) 想对module处理需要使用 Ant Desig…...
EasyPoi的excel模板预览与下载、导出简单/复杂数据
官方文档地址:easypoi官网,官方仅供参考,部分描述有问题 excel模板预览 准备工作 事先将整理好的excel模板存在项目中,如图 excel模板预览代码 GetMapping("excel")ApiOperation("excel预览")NoLogpubli…...
收个滴滴Offer:从小伙三面经历,看看需要学点啥?
说在前面 在尼恩的(50)读者社群中,经常有小伙伴,需要面试大厂。 后续结合一些大厂的面试真题,给大家梳理一下学习路径,看看大家需要学点啥? 这里也一并把题目以及参考答案,收入咱…...
Spark Shuffle解析
1 Shuffle的核心要点 1.1 ShuffleMapStage与ResultStage ShuffleMapStage与ResultStage 在划分stage时,最后一个stage称为finalStage,它本质上是一个ResultStage对象,前面的所有stage被称为ShuffleMapStage。 ShuffleMapStage的结束伴随着…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
