稳定性建设框架

2023-11-13

d907f65fde7c16fcdcb812b1807f6cbb.gif

一、为什么要做稳定性建设

1、从熵增定律引出稳定性建设的必要性

物理学上,用“熵”来描述一个体系的混乱程度。卡尔·弗里德曼提出熵增定律,他认为在一个封闭的系统内,如果没有外力的作用,一切物质都会从有序状态向无序状态发展。

如果我们不希望系统变混乱,有什么办法呢?答案是对抗熵增定律,对抗熵增定律的方法是借助外力,让系统从混乱回归有序。举个例子:

下图中,我们使用“熵”值来衡量“骰子系统”的混乱程度,1(最大值)表示“最混乱”,意味着我们不能控制“投骰子”的结果,每次投骰子的结果会在1~6随机出现,系统表现不稳定;1/6(最小值)表示“最有序”,意味着我们能够控制“投骰子”的结果,系统表现稳定,比如我们希望每次投筛子的结果都是6,我们可以引入作弊手段(即借助外力),让每次投骰子结果都是6。

fa7078d3e308d7413a7dfd58d3f97b8d.png

熵增定律同样适合软件系统,一个软件系统刚发布时是有序的,熵值趋于1,随着不断迭代,慢慢变成混乱的、脆弱的,从而导致线上问题频发,熵值趋于0,我们需要借助外力,即稳定性治理手段,提高系统熵值,让系统恢复稳定。

2、稳定性建设的意义

如下图分析,系统不稳定会产生真金白银的损失,因此,稳定性建设的意义是:不是让业务多挣钱,而是让业务不丢钱!

6d76a5cec579e75508d7940d12df53da.png

3、稳定性衡量公式

① 公式

通过如下公式衡量系统稳定性:Availability = MTTF / (MTTF + MTTR) 

②公式说明

36285e68054e18273f0fd9b0c6558567.png

MTTF (Mean Time To Failure,平均无故障时间),指系统无故障运行的平均时间,取所有从系统开始正

常运行到发生故障之间的时间段的平均值,即:MTTF =ΣT1/ N。

MTTR (Mean Time To Repair,平均修复时间),指系统从发生故障到维修结束之间的时间段的平均值,即:

MTTR =Σ(T2+T3)/ N。

③公式量化

通常是“SLA是几个9”去衡量,对应下表:

3f988517bd07ad2ff1cf20843acac047.png

④常见问题

问题:SLA应该按照哪个维度去定义?接口、应用、业务?

答:都可以,只要讲清楚是接口SLA,还是应用SLA,还是业务SLA就可以。但注意:提到应用SLA,应该等于核心接口的最差SLA;提到业务SLA应该等于黄金链路的最差SLA。

问题:SLA时间计算周期应该多少?

答:都可以,主要讲清楚计算周期就可以,一般以年为单位更具代表性。

4、常见误区

①不要认为“分布式环境是稳定的”

认为:网络是可靠的,带宽是无限的,网络的拓扑不会变,延时为0,传输开销为0

实际:网络会抖动,带宽有上限,存在down机导致的拓扑变化,存在响应超时的概率,等等。

②不要有“确定性思维”,要有“不确定思维”

认为:遵守经验法则,if x then y。举例:我见过天鹅是白色的,所以世界上所有天鹅都是白色的;这个系统一直运行良好,所以未来也不会有问题。

应该:世界是不确定的,if x then maybe y。举例:天鹅还有黑色的。

③不要“甩锅”,要有“主人翁精神”

认为:故障是因为他们系统挂了,我们只需要打电话通知一下,慢慢等着恢复就行。

应该:提前思考依赖系统故障了,我们如何让我们用户尽可能地正常运行;故障出现了,共同想办法解决问题。

二、业界现状

1、技术现状

互联网的发展,带来越来越大的流量,为了支撑越来越大的流量,架构也一直在演进:单体应用架构 -> 垂直应用架构 -> 分布式架构 -> SOA架构 -> 微服务架构 -> 服务网格。当前流行的微服务架构中,在应用层面、基建层面上都会有一些保障稳定性的机制:

  • 应用层面的稳定性保障机制

以SpringCloud全家桶为例,提供了很多组件,帮助我们保障系统稳定性,如下图:

914153bac8d31b3655e5adf7a98ea031.png

  • 基建层面的稳定性保障机制

基建层面上,也会有一些稳定性保障机制,如下表:

分类
中间件 稳定性设计
中间件 MySQL CPU监控,及时超负载情况;慢SQL监控机制,及时发现高危行为。
MQ MQ积压监控机制,及时发现负载情况;死信处理能力,隔离异常数据和正常数据。
其他
基础设置 Kubernetes 动态扩容机制,业务高峰多一些机器,低峰少一些机器;无损上线机制,避免上线过程的PV_LOST。
机器监控 对机器CPU、内存、磁盘进行监控,及时发现机器故障

2、落地现状

根据所见所闻,当前技术团队做稳定性治理一般采用如下2种方法:

  • 运动式的搞一波稳定性建设

当线上故障频发,通常会搞个“稳定性治理专项”,定义一些治理点,并给出方案,然后运动式的搞一波。一般经过治理后,稳定性会明显好转,但是由于是运动式的搞,随着业务不断迭代,根据“熵增定律”, 稳定性又变差。

缺点:不能闭环的搞,治理时稳定性好转,不治理时稳定性变差,给人感觉技术团队一直出问题。

  • 点状的搞,针对每个点专项闭环治理

比如搞个“慢SQL治理专项”,通过监控平台发现慢SQL,给研发发工单,并考核时效;比如搞个“限流治理专项”,让所有接口配置限流参数,配置限流告警策略。

缺点:研发会感觉稳定性专项很多,也不清楚价值,有时候会应付了事,达不到稳定性治理的目标。

三、稳定系治理应该如何开展

将稳定性建设分为3个阶段:事前预防,事中止损,事后复盘,针对这3个阶段,建设思路分别是:

1、事前预防

稳定性建设本质上是对抗熵增原理的过程,具体是通过一些技术手段(比如超时治理、限流治理、降级治理、慢SQL等),提前对系统可能出现的故障,建设应对措施,从而让系统按照设计目标去运行。

注意:稳定性治理的手段很多,每落实一种治理手段,稳定性就能提升一点,可以列出所有已知的治理手段,然后按照优先级逐个治理。

49086bc275449f878461635d0f5a4a63.png

2、事中止损

按照稳定性衡量公式(如下图),降低T2或T3可以提升SLA,因此,出现故障后,应该尽可能地降低T2和T3。降低T2的方法是尽快发现系统出现故障,需要依赖监控和告警能力;降低T3的方法是尽快解决问题,需要先止损后找原因,需要一套明确的SOP提高效率。

17919d8102ed40e2c7b616ad02d0e122.png

3、事后复盘

复盘的目标不是定责,而是为避免再犯,因此,在复盘过程中要追到直接原因和根本原因,这2者有很大区别:直接原因指的是因果关系,表达“因为干了什么,所以导致什么”;根本原因是流程规范、认知迭代层面的问题,比如“因为分支规范不是master上线,导致上丢代码,如果改用gitflow则能够能够完全避免上丢代码的问题”。

关于直接原因和根本原因的举例:陈胜吴广起义,直接原因是:下大雨,可能会迟到,迟到要杀头,所以造反了;根本原因是:秦朝严苛的制度,即使没有那场雨,即使没有陈胜吴广,也会有下一场雨,下一个张胜某广,因为别的原因进行起义。

四、稳定系治理框架

如上一章节所述,当我们从“事前预防,事中止损,事后复盘”的角度去挖掘稳定性治理手段,会发现有很多业界流行的手段,比如超时治理、限流治理、系统隔离、常态化压测、慢SQL治理等等。

然而技术资源永远有限,能够拿出15%的比例做稳定性治理,已经很不错了;另外,业务的不同发展阶段需要的稳定性手段不一样,不同稳定性治理手段的ROI也不一样,因此,我们需要回答一个问题:在有限的研发资源下,如何去按部就班的去搞稳定性治理。

最佳实践是:搭建一个稳定性治理的框架,把稳定性治理手段填充进去,根据业务所处阶段,选择适合当下的稳定性治理手段,可以通过如下的表格进行管理:

一级分类 二级分类 治理手段 解决啥问题 在啥阶段做 闭环治理方案
事前 容量 常态化压测 直观了解服务容量,帮助评估容量够不够 成熟期
限流治理 设置qps上限,避免异常流量导致的事故,如爬虫 成熟期
弹性伸缩 高峰期自动扩容,低峰期自动缩容,相同成本下让系统容量更高 成熟期
高性能 超时治理 设置接口超时时间合理,避免下游故障导致雪崩 中期 超时治理方案
慢SQL治理 解决慢sql引发数据库故障,从而导致的事故 中期
变更管控 上线checklist 通过checklist规范,降低变更引发故障的概率 早期
灰度发布 通过灰度发布能力(AB灰度、链路灰度、沙箱灰度等),控制线上问题的影响范围和影响时长 成熟期
无损发布 通过无损发布能力,避免请求链路异常断开,引发的脏数据 中期
灾备 降级治理 非核心依赖故障时,摘掉依赖,控制线上问题的影响范围和影响时长 成熟期
隔离 分物理隔离和逻辑隔离,比如微服务强调中间件隔离,即多个应用不要使用相同的DB、redis等,能够减少中间件故障导致的影响面 早期
故障演练 通过故意植入故障,检验系统的健壮性,提前发现&解决潜在问题 成熟期
多机房 同一个应用的多个机器,分布到不同机房,避免一个机房故障导致应用整体不可用 中期
大报文治理 避免大报文引起的系统故障 成熟期 治理方案
工程质量 静态代码扫描 发现&解决代码中的潜在风险,减少带到线上的问题数量 早期
单测 增加自测环节,减少带到线上的问题数量 中期
自动化测试 通过流水线等自动化工具,对应用进行测试,减少带到线上的问题数量 中期
安全 sql注入 避免sql注入的引发的线上问题 早期
越权 避免越权(水平越权、垂直越权)的引发的线上问题 早期
反爬 接入反爬平台,及时发现和反制爬虫,避免爬虫引发的线上问题 成熟期
事中 —— 监控告警 梳理监控全景图,将误报率和漏报率控制在合理区间 早期
故障定位 通过工具、平台快速定位故障,快速发现和解决线上问题 中期
SOP 指定标准操作手册,知道大家发现和解决线上问题 中期
事后 —— casestudy 对线上问题进行复盘,并落地改进项,持续提升团队技术水准 早期

备注:稳定性治理框架建起来后,治理手段可以随时增加、减少,框架的价值是给我们一个全景图,让我们知道该干什么、在干什么,而不是瞎干。

五、具体治理方案

根据上一章节的稳定性治理框架,接下来要做的就是针对某个治理手段,出具体的治理方案,要求具体方案能够形成闭环,并融入到研发过程中去,比如:

  • “慢SQL治理”的落地方案

    • 定义慢SQL的标准,即执行时间超过多少ms算慢SQL

    • 通过监控平台发现慢SQL

    • 给研发负责人发治理工单

    • 验收治理效果

  • “超时治理”的落地方案

    • 为每个接口定义合适的超时时间

    • 每周巡检一次接口,发现超时时间不合理的接口

    • 修正超时时间

六、写在最后

稳定性治理是一个长期的过程,要把稳定性的工作融入到研发过程中,一方面要有意识尽量别埋坑,比如微服务强调中间件隔离,我们就不要混用中间件了,另一方面稳定性问题要一步到位,比如治理超时时间,要有个完整规范定义超时时间,并在研发过程中对新增接口、历史接口都配置合理,且能够动态更新。

-end-

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

稳定性建设框架 的相关文章

  • multipart/form-data的使用注意

    问题描述 事情是这样的 我在使用ajax FormData对象提交数据的时候 使用request setRequestHeader Content Type application x www form urlencoded 但服务端接受的
  • 用ACL实现防火墙功能

    目录 一 实验目的 二 实验环境 三 实验内容 实验步骤 测试数据等 1 打开Cisco Packet Tracer 6 0 按以下拓扑图接好线路 PC与Server的IP地址 掩码 网关配置 路由器连接配置 2 配置好设备的IP地址和静态
  • Java线程的5种状态及状态之间转换

    Java中的线程的生命周期大体可分为5种状态 1 新建 NEW 新创建了一个线程对象 2 可运行 RUNNABLE 线程对象创建后 其他线程 比如main线程 调用了该对象的start 方法 该状态的线程位于可运行线程池中 等待被线程调度选
  • 笔记/OSI七层模型

    层级 名称 功能 协议 设备 协议数据单元 7 应用层 为应用程序提供网络服务 对应用程序提供接口 HTTP 80 TCP 超文本传输 Telnet 23 TCP 远程登陆 FTP 20 21 TCP 文件传输 SMTP 25 TCP 简单
  • AD器件距离过近报错 AD修改丝印的距离间距

    今天画板子遇见了一个间距报错 图片如下 我当时想着 修改丝印的间距就可以了 查找了一些资料之后发现是这样修改 并且我将其修改到了0 但是结果还是如上图一样 报错 最后发现除此之外 我们还需要修改元件之间的电气距离 修改完成之后就OK
  • Thinkpad笔记本快捷键大全

    Thinkpad笔记本快捷键大全 FN F2 锁定屏幕 FN F3 关闭屏幕 FN F4 待机 FN F5 无线和蓝牙开关 FN F7 不同显示设备输出切换 FN F9 安全删除硬件 FN F12 休眠 FN 空格 放大 其实就是降低分辨率
  • JackSonUtil JSONArray转换工具

    import com fasterxml jackson core type TypeReference import com fasterxml jackson databind ObjectMapper public final cla
  • Ubuntu安装nginx到配置ssl证书

    1 命令安装nginx sudo apt get install nginx 配置文件默认在 etc nginx文件夹下面 可以编辑nginx conf 或者 sites enabled文件夹下面的默认配置文件 default 2 常用命令
  • linux定时删除文件或文件夹

    本文转载自 https blog csdn net jiangnan8710 article details 51849748 linux新人 个人记录以后备用 一 常用的命令 1 查询命令 find 在删除日志前 首先要做的是查找日志所在
  • dos命令之md详解及实例应用

    dos命令之md详解及实例应用 用来创建文件夹dos的命令只有md 其英文解释为 makedirectory在windows2000 xp vista win7使用方法及实例如下 在命令行窗口输入md 可得到一份帮助信息如下图 例1 如果在
  • python爬取整个网站的广告敏感词_Python实现敏感词过滤的4种方法

    在我们生活中的一些场合经常会有一些不该出现的敏感词 我们通常会使用 去屏蔽它 例如 尼玛 gt 一些骂人的敏感词和一些政治敏感词都不应该出现在一些公共场合中 这个时候我们就需要一定的手段去屏蔽这些敏感词 下面我来介绍一些简单版本的敏感词屏蔽
  • 全国首富排行居然有他?用Python采集全国富豪榜五百名。

    背景 今天刷到一则文章 就是国内某富豪花重金迎娶泰国某 皇后 可谓是有点颠覆了我的三观啊 有钱人都玩的这么花的吗 这里内容就不一一讲了 毕竟看咱文章的都是想来学技术的 那就废话不多说 开始干活 正文 相关模块 今天不用其他的什么模块 pyt
  • linux系统使用rsync做主备服务器文件同步

    根据本文档设置 可以实现备机自动同步主机中的文件 注意 此方式缺陷为 如果主机文件修改 但是文件大小无变化或者文件变小时 无法自动同步到备机中 只有主机中文件修改后变大或者名称修改才能自动同步 一 LINUX服务器间免密登录设置 先执行 u
  • Scaling Instruction-Finetuned Language Models

    Paper name Scaling Instruction Finetuned Language Models Paper Reading Note Paper URL https arxiv org pdf 2210 11416 pdf
  • 【NLP】pkuseg:一个多领域中文分词工具包

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 软考-嵌入式系统设计师-笔记:标准化知识

    文章目录 国际标准 国家标准 行业标准 企业标准基本知识 嵌入式系统相关标准 国际标准 国家标准 行业标准 企业标准基本知识 国际标准 有效期5年 ISO 标准号 杠 分标准号 冒号 发布年号 方括号中的内容可有可无 国家标准 GB 中国
  • Python爬取携程酒店信息

    代码 from selenium import webdriver from time import sleep import xlwt 进行excel操作 谷歌驱动 告诉电脑在哪打开浏览器 driver webdriver Chrome
  • cloudflare tunnel搭建网站

    文章目录 0 写在开头 1 一些准备工作 2 Cloudflare Tunnel 3 最后 0 写在开头 如果你刚接触web项目 想让你的项目部署在公网上 但只是兴趣使然 并不打算花费金钱长期运行 或许本博客对你会有所帮助 1 一些准备工作
  • Cookie和Session 登录

    Cookie 实现免登陆和Session 01 需求说明 完成用户登录功能 登录成功后跳到成功页面 显示用户名 登录失败可以跳回登录页面 登录成功后后续操作均能显示当前登录的用户名 02 完成代码 DologinServlet java O
  • 数据挖掘实验-week8-关联规则挖掘(Association Rule Mining)

    Contents 0 引言 0 1 关联规则挖掘 0 2 Apriori算法 实验 Step 1 Familiarize yourself with the arules package in R 1 1 Load the package

随机推荐

  • python如何输出数字后三位

    想要输出数字的后三位 首先需要了解一些基础知识 在Python中 浮点数可以用round 函数来保留小数位数 这个函数有两个参数 要操作的数字和要保留的小数位数 例如 round 3 1415926 3 将返回3 142 其中第二个参数3表
  • Electron+Vue3+TypeScript+Vite +Vue.Draggable 完成事务拖动

    原文地址 Electron Vue3 TypeScript Vite Vue Draggable 完成事务拖动 前言 有了简单的框架 下面来点实际业务相关的操作吧 集成 Vue Draggable 将每一项任务拖拽任务到每个分类吧 Vue
  • Java连接MySQL数据库并实现增删改查

    首先我们需要连接数据库 我这里选择的是MySQL数据库 我们需要做的第一件事就是加载驱动 采用下列语句加载MySQL驱动 Class forName com mysql jdbc Driver 驱动加载成功后就可以创建连接对象 这里会使用到
  • 斐波那契数列计算 Python编程

    问题描述 斐波那契数列如下 F 0 0 F 1 1 F n F n 1 F n 2 编写一个计算斐波那契数列的函数 采用递归方式 输出不超过n的所有斐波那契数列元素 调用上述函数 完成如下功能 用户输入一个整数n 输出所有不超过n的斐波那契
  • Markdown表格实现合并单元格

    Markdown表格实现合并单元格 markdown基本语法的表格没有办法实现合并单元格功能 但是在实际使用中很多时候需要合并单元格 例如需要写一个这样非连续的寄存器说明 markdown语法的表格 参数 额定值 最大结温 150 C DV
  • Node写博客--用户登录和用cookie保存用户登录状态

    1 首先在index js中加入用户登录的ajax数据传输 登录 loginBox find button on click function 通过ajax提交请求 ajax type post url api user login dat
  • FPGA零基础学习之Vivado-TLC5620驱动教程

    FPGA零基础学习之Vivado TLC5620驱动教程 本系列将带来FPGA的系统性学习 从最基本的数字电路基础开始 最详细操作步骤 最直白的言语描述 手把手的 傻瓜式 讲解 让电子 信息 通信类专业学生 初入职场小白及打算进阶提升的职业
  • 创建Metasploit Payloads

    Often one of the most useful and to the beginner underrated abilities of Metasploit is the msfpayload module Multiple pa
  • 虚拟机后台运行怎么彻底关闭?

    1 首先启动vmware workstation软件 2 打开之后 在虚拟机软件的左侧工具栏中打开 编辑 工具 3 然后在弹出来的下拉菜单中使用鼠标左键点击菜单中的 首选项 4 在 工作区 选项找到 显示托盘图标 把托盘图标默认的 始终 改
  • 索引以及存储过程和存储函数介绍

    目录 索引 创建索引 创建表时创建索引 在已经存在的表中创建索引 使用alter table 语句创建 使用create index语句创建 删除索引 存储过程与函数 创建存储过程和函数 创建存储过程 创建存储函数 调用存储过程和函数 调用
  • Weblogic自动部署与手动部署 异常记录与解决方法

    weblogic在控制台部署项目时提示 The application mycim2Ejb was autodeployed and may only be redeployed by touching REDEPLOY file in t
  • http长连接

    http长连接与短连接 http协议是基于TCP协议的 http长连接即指的是TCP的长连接 TCP协议是一个面向连接 可靠 有着拥塞控制以及流量控制的传输层协议 http长连接问题由来 http是一个无状态的协议 简单点来说 如果同一个浏
  • 生产者―消费者问题算法的实现

    实验目的 掌握进程 线程的概念 熟悉相关的控制语 掌握进程 线程间的同步原理和方法 掌握进程 线程间的互斥原理和方法 掌握使用信号量原语解决进程 线程间互斥和同步方法 实验思路 生产者的主要作用是生成一定量的数据放到缓冲区中 然后重复此过程
  • Android数据加密之Rsa/MD5/Aes/Des加密算法归纳总结

    加密算法 1 加密算法通常分为对称性加密算法和非对称性加密算法 对于对称性加密算法 信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的 之后便是对数据进行 加解密了 非对称算法与之不同 发送双方A B事先均生成一堆密匙 然后A将自己的
  • JS获取日期,浏览器高度

    1 获取当前日期向前推x天或者向后推x天 并已年 月 日 时 分 秒的格式返回值 获取往前后各推x天 function getDateOfDelayOrAdvance delay advance delay 往后推x天 advance 往前
  • ue4 用武器切割物体.

    我们这里使用UE4自带的第三人称的模板开始我们的游戏 切割物体嘛 所以这里我们需要一把武器和人物的武器攻击动画 武器我们可以从官方商城的免费资源获得 人物攻击动画我们可以从下面这个网站获得 这里面有各种人物动画和模型 完全免费 业界良心啊
  • TPshop项目介绍

    熟悉项目的信息来源 组织架构图 作用 整体性的认识被测试的项目 绘制 后台 系统 子系统 模块 子模块 见到具体界面为止 不考虑界面上的模块内容 前台 tpshop购买流程 注册登录 商品展示 购物车 支付 订单管理 前台绘制原则 一个独立
  • osg+shader光照半透明

    先记录下 免得时间久了忘了 对于光照 光源有点光源 聚光灯 方向光 每种光源又有ambient diffuse specular emission几个属性 这里用点光源 不考虑衰减 1 diffuse是入射光与物体法线之间的余弦起作用 2
  • 基础回顾3

    java中有哪些容器 集合类 Collection 接口的接口 对象的集合 单列集合 List 接口 元素按进入先后有序保存 可重复 LinkedList 接口实现类 链表 插入删除 没有同步 线程不安全 ArrayList 接口实现类 数
  • 稳定性建设框架

    一 为什么要做稳定性建设 1 从熵增定律引出稳定性建设的必要性 物理学上 用 熵 来描述一个体系的混乱程度 卡尔 弗里德曼提出熵增定律 他认为在一个封闭的系统内 如果没有外力的作用 一切物质都会从有序状态向无序状态发展 如果我们不希望系统变