CSDN 的故障处理流程,实例分享

news2024/9/29 8:09:18

CSDN 的研发团队每隔一段时间会和大家分享团队的进展,请看:
2021 年年底的汇报
2022 年上半年的汇报
2022 年下半年的汇报

从上面的报告中大家可以看到,我们在取得进展的同时, 也碰到了很多问题,也有一些困惑。 我写了软件开发中的感性和理性决定,也写了如何对待错误,用正确的方法来分析问题,改进产品。 理论讲了很多,来点实际的例子吧! 这篇博客,就讲讲我们 CSDN 目前是如何处理故障的。

用户感性的诉求

在这个博客中,我就把我们质量管理的内部总结中关于 故障处理 的典型事例分享一下。 首先,CSDN 服务的可用性还是非常高的,但是,作为一个有众多业务,流量名列全世界 top 30 的网站,时不时我们就能看到用户着急忙慌的抱怨:

在这里插入图片描述

用户在声情并茂地投诉,我们技术人员怎么办?用户说 ‘崩了’, 是什么原因? 用户联网问题,DNS 问题,网站收到黑客攻击 (这发生了好几次),还是CSDN 内部的问题? 要快速解决问题, 还是要依靠理性的、系统化的流程,和技术人员过硬的技术和冷静的头脑。

理性的处理流程

首先,是定义故障的等级。 CSDN 面向用户的业务真不少,一个“故障” 有哪些方面?我们如何综合评价一个故障的的严重程度? 我们定义了下面的权重体系:在这里插入图片描述
一个故障发生并被解决后,我们会收集数据,算出这个故障的危害等级,从最严重的P1 到 最不严重的P5。

线上故障
2022年全年故障数总计17个,无 P1 故障,5个 P2 故障,7个 P3 故障,2个 P4 故障,3个 P5 故障。

总结:最短故障恢复时间为 10 分钟,最长为 9 天,大部分情况下故障都能很快得到处理。
和云服务迁移相关的故障有 2 个,这提醒我们,要关注不同云平台之间产品差异化。
在预发环境验证而遗漏到生产导致的故障有 2 个,这促使我们重视发布流程规范以及梳理合规的预发环境。
由于线上流量激增而造成的故障有 2 个,这需要我们持续完备相应的监控,以及后续需推动线上故障演练。

一个具体的故障例子

我们用一个具体的例子来看我们的故障处理:

故障现象

1、故障描述:某业务线的 mongoDB CPU 飙升,导致主站服务可用性降低
2、异常时间:16:50–18:19; 解决时间:18:19; 持续时间:1小时29分钟
3、发现方式:内部人员 (事后发现客服团队收到了 9 个相关的用户查询和投诉)
4、解决方式:drop 一个阻塞的 mongo表

故障时间线

16:42 运营人员通知开始进行某功能改版的资源切量
16:50 开始对切量资源进行跑数。单次批量插入mongoDB 20条,休眠10ms。
16:52 开始观察到 mongoDB CPU 负载过高
16:52 开始联系运维去 kill 掉跑数据的 服务。
16:54 跑数据的任务 kill 成功
16:55 mongoDB cpu 一直还处于高点。主站服务的可用性在下降
16:55 开始联系 云服务商 技术协助,进行 mongoDB 的恢复。
16:56 云服务商 建议,对 mongoDB 进行 hidden 切换。

17:01 切换完成,可是 cpu 负载还是无明显改善。
17:04 运维开始重启 mongoDB 实例
17:08 重启完了,并且开始 kill 掉一些进行中的会话。但是立马 cpu 负载飙高
17:10 运维开始重启服务,发现服务连不上 mongoDB。

17:11 运维开始执行。还原mongoDB的主备切换。
17:14 主备切换完成,服务可以连上mongoDB 但是在2分钟后 cpu 负载升高
17:15 运维开始从 graylog 分析是否有攻击。发现此时间点 爬虫的流量比较高。
17:20 尝试先降级 pc/get 接口,然后重启mongoDB。
17:25 执行完成,然后打开pc/get 接口,跑了5分钟后 cpu 再次飙高
17:30 重试该策略,并且重启了服务所在容器。
17:35 大概10分钟 mongoDB 再次 cpu 负载飙升
17:45 开始联系运维同学 临时提升 mongoDB的配置。
17:50 mongoDB 升配置成功 服务暂时正常。
18:10 cpu再次飙升,
18:15 这时候运维找了 连接数的NameSpace的监控, 发现链接数多数卡在 某个数据表,这个表是 pc/get 详情页的逻辑会走到的表。而且这个表 也是跑数据插入的表。 但是,表里数据逻辑非核心。
18:29 把这个表drop掉,重新创建了空表
18:29 服务完全恢复

故障影响和定级

  1. 影响的用户数量:按事故时段的用户量估算
  2. 用户咨询和投诉量: 9 例
  3. 对收入的影响:按影响时间和平时的成交量估算
    根据我们的事故顶级规则,这个事故定义为 P3

问题剖析

我们用的是 5WHY 方法,一环扣一环,希望找出核心的因果关系。

  1. 为什么 mongoDB 负载会变高?(分析略)
  2. 为什么 mongoDB 重启之后cpu 还是会立马飙高?(不同业务竞争同一个资源)
  3. 为什么 完全恢复 花了1个半小时?(只关注现象和解决问题的症状,没有发现核心问题:哪个 session 出现阻塞,阻塞具体在哪个数据表中
  4. 为什么在业务高峰期操作资源圈选? (不同需求都要上线,导致此任务挪到流量高峰期,对此次批量插入数据的风险性预估过低)
  5. 为什么drop表之后故障恢复了? (略)

解决方案

  1. 临时方案: drop 了阻塞的 数据库表,新建了空表,在晚上用户使用低谷期,低速写入原计划写入的数据
  2. 长期方案 (这些方案都有 jira 跟踪)
    1. 故障流程处理 - 【故障处理】— 梳理出一版故障处理流程
    1. 故障演练和故障处理方案 - 【故障处理】–梳理故障处理流程文档(故障不可怕,但是故障后的快速恢复能力很重要)
    1. 对生产操作的规范化 - 【技术优化】—梳理这个业务所有涉及生产操作的规范化 (从故障中学到了经验,个人和团队得到了成长)

后记

为了支撑 CSDN 这样体量的业务,各个业务内部的代码,业务之间的API,微服务,各种数据库,以及各个云平台的支撑服务形成了一个巨大而复杂的系统。 当每天超过百万的用户在使用 web/App/WAP 等界面访问 CSDN 的各个功能的时候,如果出了一下问题,用户的反应都是很情绪化的,例如:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这种情况下, 我们的研发小伙伴,特别是运维人员,都在忙碌地工作,处理各种大大小小的问题。我们的故障处理流程,能帮助大家理性地分析问题、解决问题、让团队成长。

当我们解决了问题之后,用户的感性表白,是对我们最好的奖赏,下面的截屏就是例子; 当我们全面收集了海量的感性表达,我们就能通过分析得到对 CSDN 服务的理性衡量,例如这个情感数据分析的博客。 感性也好,理性也好,希望大家不断使用 CSDN,给我们反馈,让我们有学习的机会,不断提高。

在这里插入图片描述

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

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

相关文章

「链表」简析

前言 前言:研究一个数据结构的时候,首先讲的是增删改查。 文章目录前言一、链表简介1. 含义2. 节点组成3. 存储方式1)数据在内存中的存储方式2)单链表在内存中的存储方式3)双链表在内存中的存储方式4)循环链…

ZYNQ IP核之MMCM/PLL

锁相环(Phase Locked Loop,PLL),一种反馈控制电路,对时钟网络进行系统级的时钟管理和偏移控制,具有时钟倍频、分频、相位偏移和可编程占空比的功能。 Xilinx 7系列器件中的时钟资源包含了时钟管理单元CMT&…

SAPIEN PrimalSQL 2023.1[x64] Crack

SAPIEN PrimalSQL 2023.1 使数据库查询开发和测试变得轻而易举,无论您的数据库类型或供应商如何。 通过单个工具支持多个数据库提供程序。 Access、SQL Server、SQL Server Compact、MySQL、Oracle、ODBC、OLEDB、Sybase 等。 使用Visual Query Builder构建复杂的…

maven基础

一、Maven基础 为什么要学习Maven? Maven作为依赖管理工具,能够管理大规模的jarjarjar包,使用MavenMavenMaven后,依赖对应的JarJarJar包,能够自动下载、方便、快捷切规范。Maven作为构建管理工具,当我们使…

HTTP实用指南

HTTP实用指南 01.初始HTTP 当我们在浏览器地址栏输入一个网址或者关键字,它会给我们跳转到对应的网页,在这一过程中,内部到底是怎么运作的? 总结上述图片过程,用流程图来表示,如下: 处理输入信…

【论文翻译】Semantic Graph Convolutional Networks for 3D Human Pose Regression

【iccv论文】https://openaccess.thecvf.com/content_CVPR_2019/papers/Zhao_Semantic_Graph_Convolutional_Networks_for_3D_Human_Pose_Regression_CVPR_2019_paper.pdf 【github】https://github.com/garyzhao/SemGCN 摘要 在本文中,我们研究了用于回归的图卷积网…

ANR触发机制分析

ANR是一套监控Android应用程序响应是否及时的机制,可以把发生ANR比作是引爆炸弹,那么整个流程包含三部分组成: 埋定时炸弹:system_server进程启动倒计时,在规定时间内如果目标应用进程没有干完所有的活,则…

QEMU之一调试uboot(vexpress-a9)

u-boot版本:u-boot-2017.05开发板:vexpress-a9(没办法,目前看到的都是这个开发板,想QEMU调试tiny210,一直没看到怎么修改qemu)编译u-boot:make ARCHarm CROSS_COMPILEarm-linux-gnueabi- vexpre…

Avast 发布免费的 BianLian 勒索软件解密器

安全软件公司 Avast 发布了 BianLian 勒索软件的免费解密器,以帮助恶意软件的受害者在不向黑客支付费用的情况下恢复锁定的文件。 在 2022 年夏天 BianLian 勒索软件的活动增加后大约半年,该威胁组织入侵了多个知名组织,解密器的可用性就出现…

swagger(前言技术)

目录 一、swagger简介 1.前后端分离的特点 2.在没有swagger之前 3.swagger的作用 4.swagger的优点 二、swagger入门 1.新建springboot项目 2.集成swagger 3.开发一个controller用于测试 5.启动服务,验证集成效果 三、swagger常用注解 四、swagger使用综…

2022年PTA行业研究报告

第一章 行业概况 PTA是精对苯二甲酸(Pure Terephthalic Acid)的英文简称,在常温下是白色粉状晶体, 无毒、易燃,若与空气混合,在一定限度内遇火即燃烧。 PTA是重要的大宗有机原料之一,广泛用于化学纤维、轻…

【数据结构入门】-线性表之顺序表(1)

个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【数据结构】 从今天开始,就正式进入数据结构的大门了,把握机会,好好学习,加油。 本文目录…

Arduino环境下对NodeMCU ESP8266将文件直接传入flash的三种方式

flash存储简答介绍 参考:https://www.elecfans.com/consume/572040.html flash存储器又称闪存(快闪存储器),就其本质而言,flash存储器属于EEPROM(电擦除可编程只读存储器)类型。是一种长寿命的…

Java多线程案例之单例模式

目录 一、饿汉模式 二、懒汉模式 前言:单例模式是校招中最常见的设计模式之一。下面我们来谈谈其中的两个模式:懒汉,饿汉。 何为设计模式? 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多…

【涂鸦蓝牙SDK】基于涂鸦蓝牙SDK数据传输与函数接口解析

基于涂鸦蓝牙SDK数据传输与函数接口解析1.【数据初始化部分】2.【蓝牙状态机控制】3.【数据广播过程】4.【涂鸦平台申请设备以及SDK】5.【涂鸦SDK模组源码思路解析】---- 重要:5.1 数据收发5.【移植涂鸦评估】2023.1.21 本文是基于涂鸦SDK的低功耗蓝牙BLE协议的数据…

Linux创建解压后的应用程序的桌面快捷方式

下面用一个例子演示,其他应用也差不多 下载好的安装文件为.tar.xz格式,通常默认在系统的下载文件夹下(按你实际路径)。右键点击文件,在下拉框中点击提取到此处(意思就是解压)。 解压后&#xff…

DocArray 0.21.0版本发布!新增OpenSearch后端存储,支持Redis后端存储的多语言文本搜索!...

github.com/docarray/docarrayDocArray 是一个用于处理、传输和存储多模态数据的 Python 工具包。DocArray 提供便捷的多模态数据处理功能,具备基于 Protobuf 提供高性能的网络传输性能,同时也为多种向量存储方案提供统一的 API 接口。💡 Doc…

三十三、Kubernetes中Service详解、实例第三篇

1、概述 在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行访问。 为了解决这个问题,kubernetes提供了Service资源&…

06.动态内存管理

1. 存在动态内存分配的原因我们已经掌握的内存开辟方式有:int val 20;//在栈空间上开辟四个字节 char arr[10] { 0 };//在栈空间上开辟10个字节的连续空间//写死了 //变长数组,int arr[n],变量的方式可以指定大小,并非意味着数组…

0th HPC Game小结

PART 1 - 基础知识 一、文件读取 二进制文件 mmap https://hpcgame.pku.edu.cn/demo/scow/api/proxy/relative/192.168.100.61/35515/ fread fwrite //readFILE* fi;if(fi fopen("input.bin", "rb")){fread(&p, sizeof(int), 1, fi);fread(&n,…