系统稳定性建设

news2024/11/27 16:47:27

说到系统稳定性,不知道大家会想起什么?大多数人会觉得这个词挺虚的,不知道系统稳定性指的是什么。

一年前看到这个词,也是类似于这样的感受,大概只知道要消除单点、做好监控报警,但却并没有一个体系化的方法论。

经过一段时间的摸索,对系统稳定性有了较为体系化的认识,简单聊聊系统稳定性建设这个话题吧!

何谓稳定性?

系统稳定性,从字面上来看,就是让系统尽可能稳定,不要出问题。 但业务是变化的,系统肯定也是一直变化的,有可能新加了个功能就把系统搞挂了,也有可能突然业务流量暴增把系统搞挂了。所以,要保障系统稳定性可谓非常之难。但即使再难,也还是得去做,但到底怎么做呢?

要保障系统稳定性,那就需要知道哪些因素可能会造成系统不稳定。来了一个头脑风暴,把所有可能造成系统不稳定的因素整理一下,下面是梳理的会造成系统不稳定的部分因素:

  • 未测试需求直接上线
  • 上线的需求产品不知道
  • 上线的新需求有 bug
  • 频繁发布需求
  • 发布紧急需求
  • 上线后没有线上验证
  • 系统设计方案存在缺陷
  • 系统代码实现存在缺陷
  • 漏测了某个功能
  • 上线时操作失误
  • 下游服务挂了
  • 网络中断导致调用失败
  • 上游调用流量突增,冲垮服务
  • 应用服务器内存溢出 OOM
  • 应用服务器 CPU 100%
  • 数据库主从延迟了
  • 数据库主库挂了
  • Kafka 消息挤压了
  • Redis 响应缓慢
  • 第三方服务商挂了
  • 潜在的黑客攻击
  • 潜在的系统漏洞

是不是感觉特别多,看起来有点晕了?别怕,其实可以将所有的不稳定因素根据时间维度,将其分为三大类:上线前、上线时、上线后。

  1. 上线前的不稳定因素。 这块指的是需求上线前的所有内容,包括需求评审、技术方案设计、代码编写、功能测试等等。
  2. 上线时的不稳定因素。 这块指的是上线时可能的不稳定因素,包括操作失误、某个功能有问题导致线上出问题等等。
  3. 上线后的不稳定因素。 这块指的是需求上线后,有可能出现的各种各样的问题,例如中间件挂了、网络挂了等等。

现在已经知道哪个环节可能会出什么问题,那么接下来就是针对每个环境做一些特定的动作,从而提高系统稳定性了!

上线前

很多时候都以为系统稳定只是线上运行稳定就好了,但事实上需求研发流程是否规范,也会极大地影响到系统的稳定性。

试想一下,如果谁都可以随便提需求、做的功能没有做方案设计、谁都可以直接操作线上服务器,那么这样的系统服务能够稳定得了吗?所以说,需求上线前的过程也是影响系统稳定性的重大因素。

在上线前这个阶段,主要有三大块非常重要的稳定性建设内容,分别是:

  1. 开发流程规范
  2. 发布流程规范
  3. 高可用设计

上线前的稳定性建设

研发流程规范

研发流程规范,指的是一个需求从提出到完成的整个过程应该是怎样流转的。一般的需求研发流程包括:产品提出需求、技术预研、需求评审、技术方案设计、测试用例评审、技术方案评审、测试用例评审、需求开发、CodeReview、需求测试。不同公司根据情况会有所调整,但大差不差。

在这个流程中,与研发相关的几个比较重要的节点是:技术方案设计及评审、测试用例评审及评审、需求开发、代码测试覆盖率、CodeReview。 上面提到的几个影响稳定性的因素,就是因为没有做好这几个节点的工作导致的,包括:

  • 未测试需求直接上线
  • 上线的需求产品不知道
  • 上线的新需求有 bug
  • 上线后没有线上验证
  • 系统设计方案存在缺陷
  • 系统代码实现存在缺陷

如果能够处理好上述几个节点,那么就能够极大地降低研发流程导致的问题。这里每个节点都有很深的学问,这里就不展开讲了,主要说个思路。

发布流程规范

发布流程规范主要是为了控制发布权限以及频率的问题。

在项目初始,为了快速响应业务,一般权限控制都很松,很多人都可以进行线上服务的发布。但随着业务越来越多、流量越来越大,相对应的故障也越来越多,到了某个时候就需要对权限做管控,并且需要对需求的发布频率做控制。

对于需求发布流程来说,一般有几种发布方式,分别是:Release Train 方式、零散发布方式。 Release Train 意思是固定时间窗口发布,例如每周四发布一次。如果无法赶上这次发布时间,那么就需要等到下次发布窗口。

零散发布方式,指的是有需要就发布,不做发布时间控制。但这种方式一般只在项目初期发挥作用,后期一般都会收紧。

除此之外,发布流程中都会设有紧急发布流程,即如果某个需求特别重要,或者有紧急漏洞需要修复,那么可以通过该流程来紧急修复,从而避免因未到时间窗口而对业务产生影响。

但一般来说,紧急发布流程都比较麻烦,除非迫不得已不然不要审批通过,不然 Release Train 方式可能会退化成零散发布方式。

高可用设计

高可用设计指的是为了让系统在各种异常情况下都能正常工作,从而使得系统更加稳定。 其实这块应该是属于研发流程规范中的技术方案设计的,但研发流程规范更加注重于规范,高可用设计更加注重高可用。

另外,也由于高可用设计是非常重要,因此独立拿出来作为一块来说说。对于高可用设计来说,一般可分为两大块,分别是:服务治理和容灾设计。

服务治理就包括了限流、降级、熔断、兜底、隔离等,这一些考虑点都是为了让系统在某些特殊情况下,都能稳定工作。 例如限流是为了在上游请求量太大的时候,系统不至于被巨大的流量击垮,还可以正常提供服务。

容灾设计应该说是更加高端点的设计了,指的是当下游系、第三方、中间件挂了,如何保证系统还能正常运行? 可以说容灾设计比起服务治理,其面临的情况更加糟糕。

例如支付系统最终是通过 A 服务商进行支付的,如果 A 服务商突然挂了,那支付系统是不是就挂了?那有什么办法可以在这种情况(灾难)发生的时候,让系统还能够正常提供服务呢?这就是容灾设计需要做的事情了。

上线时

上线时这个阶段,主要是确保功能按照原先设计的方案进行部署,这个阶段主要是确保规范操作,避免失误,因此可以制定相关的 CheckList 以及变更审批。

其次,为了避免还可能存在未发现的功能缺陷,有时候还可以使用灰度发布降低风险。在这个阶段能做的一些稳定性建设如下图所示。

上线时的稳定性建设

上线后

当系统成功上线后,很多小伙伴以为工作就结束了,但实际上还有不少工作可以做。根据经验,在上线后能做的稳定性建设包括:

  1. 监控报警
  2. 故障管理
  3. 紧急处理预案
  4. 容灾演练
  5. 案例学习
  6. 全链路压测

监控报警,指的是需要对应用做好运行数据的收集,监控好系统的运行状态。当系统状态异常时,需要及时地发现并报警,从而让研发人员快速地解决问题。

一般来说,监控报警分为系统级别的监控报警和业务级别的监控报警。系统级别的监控报警包括 CPU、内存、磁盘等服务器资源的监控,而业务级别的报警则需要根据业务情况自行定义。

故障管理,就是当发生故障时,需要遵循的整套处理规范。 团队小的时候可能无所谓,但是当团队大了的时候,就需要统一大家的故障处理流程,从而可以更快速地解决故障。此外,在故障解决完成之后还需要进行复盘,产出对应的故障报告。

Case Study 机制指的是定期学习其他团队的高可用或者线上故障进行学习,从而提高团队的系统设计能力,避免踩坑。

容灾演练,其实就是模拟某些中间件或者服务故障,然后看看系统是否能按照之前设计的高可用方案实施。

容灾演练是提升系统稳定性的一把利器,很多时候即使设计得很完美,但实际上却没发挥作用,究其根本就是没有实践过。是驴是马,得拉出来溜溜才知道。

紧急处理预案,简单就是要想到各种可能发现的情况,然后做好预案。 之后结合容灾演练不断进行优化,从而形成一套很好的处理预案。这样当线上发生类似故障时,就可以轻松应对了。

全链路压测,指的是对整个链路进行压测。 不同公司可能会采用不同的方案,有些会直接在线上进行压测,然后用流量标记的方式识别测试流量。

有些则是进行流量录制,之后重新搭建一套与线上非常类似的系统进行压测。一般来说,第一种效果肯定会更好,成本也更低,但是对研发人员要求也更高,风险也更大。

总结

简单地从上线前、上线时、上线后去探讨了如何做稳定性建设,其中每一块都可以展开来讲很多内容。

例如监控报警这块,那应该监控系统的哪些指标?其实这些都是有一些成熟的方案了,例如要监控 TP90、响应延迟、调用延时、消息处理延时等。

但出于篇幅原因,只是蜻蜓点水,点到为止,后续继续再慢慢不断完善,纯当抛砖引玉吧。

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

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

相关文章

ChatGLM-6B的部署步骤

2022年8月,清华背景的智谱AI基于GLM框架,正式推出拥有1300亿参数的中英双语稠密模型 GLM-130B(论文地址、代码地址,论文解读之一,GLM-130B is trained on a cluster of 96 DGX-A100 GPU (840G) servers with a 60-day,…

【Excel如何在表格中筛选重复的值之条件格式】

在使用excel进行统计时经常会遇到,数据统计出现重复的现象,为了确保数据的唯一性,可以用到条件格式筛选出重复值,以确保数据的正确性。 筛选重复值: 选中要筛选的范围,行或列或整个表选中【开始】-【条件…

记录一次k8s pod之间ip无法访问,问题排查与定位

记录一次k8s pod之间ip无法访问,问题排查与定位 问题展现现象 node之间通信正常 部分node上的pod无法通信 排查有问题node 使用启动网络测试工具 环境准备 docker 数据库mysql 使用有状态副本集合 --- apiVersion: apps/v1 kind: StatefulSet metadata:anno…

MATLAB实现图片栅格化

MATLAB实现图片栅格化 1.读取图片:首先,你需要使用imread函数读取要栅格化的图片。 2.设置栅格大小:确定你希望将图片划分成的栅格大小,即每个栅格的宽度和高度。 3.计算栅格数量:根据图片的总尺寸和栅格大小&#…

pycharm 更换Eclipse 的按键模式 keymap

流程 整体来说比较简单,其实只要下载一个eclipse keymap插件就可以完成 首先 ctrl alt s 打开设置页面,找到 plugin 安装完成后还是在 settings 下切换到 keymap即可以看到eclipse 的按键设置出现了,应用后ok 即可完成 再去试试&#x…

绿色自适应网址发布页源码

源码介绍 绿色自适应网址发布页源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,重定向这个界面 效果截图 源码下载 绿色自适应网址…

Adobe Bridge 2024 v14.0.3 (macOS, Windows) - 集中管理创意资源

Adobe Bridge 2024 v14.0.3 (macOS, Windows) - 集中管理创意资源 Acrobat、After Effects、Animate、Audition、Bridge、Character Animator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、Lightroom Classic、Media Encoder、Photoshop、Premiere Pro、Adobe XD…

51单片机入门_江协科技_31~32_OB记录的自学笔记_LCD1602液晶显示屏

31. LCD1602 31.1. LCD1602介绍 •LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符 •显示容量:162个字符&#xff0c…

【VIC水文模型】准备工作:平台软件安装

VIC水文模型所需平台软件安装 1 Arcgis安装2 Cygwin安装(Linux系统)3 Matlab/R/Fortran的安装Notepad 4 VIC模型程序代码获取参考 由于VIC模型的编程语言为C语言,交互方式为控制台输指令,需要在Linux系统上运行。Windows 上使用 …

Linux--进程间的通信-命名管道

前文: Linux–进程间的通信-匿名管道 Linux–进程间的通信–进程池 命名管道的概念 命名管道是一种进程间通信(IPC)机制,运行不同进程之间进行可靠的、单向或双向的数据通信。 特点和作用: 跨平台性:在W…

Vanna-ai 大模型开源项目 基于RAG的TextToSql框架 安装和使用教程

github项目地址:vanna-ai/vanna: 🤖 与 SQL 数据库聊天📊。通过 LLMs使用RAG进行准确的TextToSQL的生成工作 🔄 。 Vanna 是 MIT 许可的开源 Python RAG(检索增强生成)框架,用于 SQL 生成和相关…

锐捷云桌面的安装

按下 <DEL> 键进入 BIOS setup 界面&#xff08;初始密码为 admin &#xff09;。 输入密码之后就进入 BIOS 的 Main 界面 设置服务器 BMC IP 地址。 a 云服务器启动后&#xff0c;在 BIOS 的主页面&#xff0c;把光标移到 [Server Mgmt] 项。 b 选择 [BMC Network C…

C++11 数据结构3 线性表的循环链式存储,实现,测试

上一节课&#xff0c;我们学了线性表 单向存储结构&#xff08;也就是单链表&#xff09;&#xff0c;这个是企业常用的技术&#xff0c;且是后面各种的基本&#xff0c;一定要牢牢掌握&#xff0c;如果没有掌握&#xff0c;下面的课程会云里雾里。 一 &#xff0c;循环链表 1…

腾讯AI Lab:“自我对抗”提升大模型的推理能力

本文介绍了一种名为“对抗性禁忌”&#xff08;Adversarial Taboo&#xff09;的双人对抗语言游戏&#xff0c;用于通过自我对弈提升大型语言模型的推理能力。 &#x1f449; 具体的流程 1️⃣ 游戏设计&#xff1a;在这个游戏中&#xff0c;有两个角色&#xff1a;攻击者和防守…

【七 (2)FineBI FCP模拟试卷-平台新增用户留存分析】

目录 文章导航一、字段解释1、用户平台登录信息表格2、用户平台激活信息表格 二、需求三、操作步骤1、建立用户平台登录信息表格和用户平台激活信息表格的关联关系2、将用户平台激活信息表格的激活日期添加到用户平台登录信息表格3、新增公式列&#xff0c;计算激活时间和登录时…

SpringCloud(一)

微服务框架 一、分布式架构 分布式架构︰根据业务功能对系统进行拆分&#xff0c;每个业务模块作为独立项目开发&#xff0c;称为一个服务。 优点: 降低服务耦合有利于服务升级拓展 微服务是一种经过良好架构设计的分布式架构方案&#xff0c;微服务架构特征: 单一职责:微…

源码解读——SplitFed: When Federated Learning Meets Split Learning

源码地址 1. 源码概述 源码里一共包含了5个py文件 单机模型&#xff08;Normal_ResNet_HAM10000.py&#xff09;联邦模型&#xff08;FL_ResNet_HAM10000.py&#xff09;本地模拟的SFLV1&#xff08;SFLV1_ResNet_HAM10000.py&#xff09;网络socket下的SFLV2&#xff08;SF…

MySQL的内外连接

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;MySQL &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容主要介绍了MySQL中的内外连接 文章目录 MySQL的内外连接…

如何用ChatGPT进行论文撰写?

原文链接&#xff1a;如何用ChatGPT进行论文撰写&#xff1f;https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601619&idx1&snb686fbe87dedfac2df3a6afe780b2ffe&chksmfa820c34cdf5852251dca64597024ea62ddbde280086535ec251f4b62b848d9f9234688384e6…

C语言——字符函数和字符串函数

1.assert断言&#xff08;判断程序运行时是否符合条件&#xff09; <assert.h>头文件定义了宏assert&#xff08;&#xff09;&#xff0c;⽤于在运⾏时确保程序符合指定条件&#xff0c;如果不符合&#xff0c;就报 错终⽌运⾏。这个宏常常被称为“断⾔”。 assert() …