高可用系统架构——关于语雀宕机的思考

语雀系统崩溃了,并且经过8个多小时才恢复,估计语雀的小伙伴们已经哭晕在厕所里了。

本次稳定性故障再次给架构师敲响警钟:系统高可用一直是架构的重点,它涉及到系统的方方面面,并且是一件持续性的长期工作。

故障起因是“因为运维工具bug,导致存储服务器被下线”。这个味道似曾相识,记得阿里云的一次稳定性故障,也是因为运维bug,将服务器实例下线而产生大面积服务不可用,最后云阿里云CTO不得不自降一级,真是惨不忍睹啊。我也谈一下如何设计高可用系统,从系统设计理念、系统架构的原则、常用技术手段、相关制度保证几个方面简单谈一下如何架构高可用系统。

1、高可用系统设计的理念

(1)面向“失败“的架构

一个分布式系统,需要多个子系统协同才能提供完整的服务或者功能。但是“分布式“的架构,决定了各个系统的服务无法保证100%可靠。所以在架构与设计时,就应该考虑外部依赖服务失败了的情况。架构师要根据可用性要求进行取舍,或者提供如何应对失败的解决方案。

(2)怀疑一切

不要抱有侥幸心理。查找并发现一切可能发生的风险,怀疑他们,并提供相应的预案。尤其是一些强依赖的系统:例如底层中间件、上游主数据等。“黑天鹅事件“一般就出现在这些系统中,而且影响都是致命的。

(3)系统的短板决定了可用性的上限

大家都知道木桶理论,一个木桶可以盛纳的水量取决于最短的那个木板(如下图)。系统可用性也是这样,也许99%的地方都考虑了高可用,但是唯独一个地方漏掉了。那么这个1%的点就成了可用性的“阿喀琉斯之踵“,导致系统可用性极低。在本实例中,架构、设计、编码、测试都做好了,结果把运维工具给忘了,导致数据丢失,所有一切都归零了。因此,要保证系统高可用,需要全方面查找系统的短板,然后修正提高。

2、高可用系统架构的原则

(1)“n+1“的原则。

集群中实例数必须是>=2的,并且方便扩展。只有这样才可以保证系统部分实例不可用时,服务照旧可用,运维人员可以及时进行实例扩展。例如:生产环境中应用的实例数不能低于2个,数据库实例至少是1主1从2个实例。对于高可用系统则需要考虑分布式多活、数据灾备等多中技术手段。对于金融或者资产管理类的系统,一般采用“两地三中心”的部署架构。

(2)可监控可预警

高可用系统都有好的监控体系,不仅可以从多个层面监控系统运行状态,提供可视化的监控工具,而且可以及时报警,方便开发人员第一时间发现问题(先于用户),并提供线索与工具,方便其解决问题。减少系统问题影响范围与持续时间,杜绝其升级成为高可用故障。

(3)可隔离的原则

允许对问题系统进行隔离。当发生问题时,可以将问题束缚在一定的范围内。例如:为核心用户或者关键服务提供单独的资源保障,防止其受到问题系统的干扰。saas产品一般会为高价值用户提供专属环境,并且在IT资源与稳定性保障方面会给与特殊照顾,保证核心用户不会因为公有环境宕机而影响其业务。

(4)可快恢。

强调一个“快”字。在本次语雀系统故障中,数据无法快恢是导致服务长时间不可用的直接原因。从描述中可以看出,语雀应该是做了数据冷备,但不是热备,而且数据量较大,所以数据恢复时间太长,导致服务长时间不可用。

记得在故障处理时,曾经提出过1-5-10的原则,就是1 钟发现问题 5 介入问题修复,10 故障恢复。如果能够快速解决故障,故障等级有可能降低

  3、监控系统的建设 

梳理关键业务流程,监控关键服务,并提供不同级别的预警。一般我们会建立4个监控大盘:

(1)系统监控大盘。监控底层系统运行状态,包括cpu、网络、内存、硬盘的的相关状态信息

(2)应用监控大盘。监控应用系统的运行状态,例如jvm状态、服务rt,服务成功率等。

(3)业务监控大盘。与业务相关的稳定性指标,例如电商系统中的下单成功率

(4)DB监控大盘。这个是企业级系统必须有的大盘,据经验所得,企业级系统50%以上的问题是由DB问题(而且大多数是慢sql)引起的。

4、风险与预案

系统风险多种多样,需要我们识别风险并针对系统风险提前制定好预案。预案需要方便执行,最好是“一点就通“,因为当系统出现故障时,容易手忙脚乱,所以建议有一个好的预案执行工具。

5、全链路压测与灰度环境

全链路压测为我们提供了可以提前预演的可能性。一个好的全链路压测平台,可以最大限度的模拟真实的业务场景,提前暴露系统可用性问题,极大地提高系统可用性。当然,全链路压测平台建设成本也比较大,涉及的系统也很多,包括网络、应用、中间件、数据存储、安全等,并且被压测系统也需要进行适当的改造。

企业级系统在链路压测上可以进行适当的简化,仅仅针对关键链路与核心服务进行压测,通过QPS不断地“摸高“,评估标准产品的吞吐量,量化系统性能,发现可用性瓶颈。

灰度环境是高可用系统的标配, 通过灰度发布可以让小批量用户进行优先试用;不仅仅可以验证功能,万一出现问题也可以控制影响范围。 “无灰度不发布“应该是高可用系统的变更基本准则。

6、相关制度保证

(1)变更管理

为了保证生产系统的稳定性,必须严格控制变更。建立变更审批流程,保证所有的变更都是经过专家check与验证的。

(2)运维管控

运维自动化带来的问题。部分系统运维人员与设计开发人员是两拨人,运维工具/脚本没有经过严格的测试与验证,运维人员对内部执行逻辑不清晰,正常操作流程反而导致系统故障。运维工具意在提效,结果却成为系统杀手。

在平时的开发管理中,大家对系统功能测试都有足够的重视,但是运维工具的测试反而没有那么重视,因此导致系统故障。在本案中,运维升级工具bug导致数据存储服务器被下线,真的让人很无语。

(3)故障管理

建立故障管理制度。包括故障类型定义、故障等级定义,故障扣减分标准;完善故障应对机制,保证对应的处理人能在第一时间迅速解决问题。故障发生后需要及时进行复盘与定责,杜绝故障再次发生。

我是令涛,专注系统架构,尤其是大型企业系统的架构与设计。欢迎与我沟通与交流,我的微信号:x18958102865

转载请注明出处

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Security: 整体架构

Filter Spring Security 是基于 Sevlet Filter 实现的。下面是一次 Http 请求从 client 出发,与 Servlet 交互的图: 当客户端发送一个请求到应用,容器会创建一个 FilterChain,FilterChain 中包含多个 Filter 和 Servlet。这些 Fi…

代码训练营第53天:动态规划part12|leetcode309买卖股票的最佳时期含冷静期|leetcode714买卖股票的最佳时机含手续费

leetcode309:买卖股票的最佳时机含冷冻期 文章讲解:leletcode309 leetcode714:买卖股票的最佳时机含手续费 文章讲解:leetcode714 目录 1,leetcode309 买卖股票的最佳时机含冷冻期 2,leetcode714 买卖股票…

荣耀推送服务消息分类标准

前言 为了提升终端用户的推送体验、营造良好可持续的通知生态,荣耀推送服务将对推送消息进行分类管理。 消息分类 定义 荣耀推送服务将根据应用类型、消息内容和消息发送场景,将推送消息分成服务通讯和资讯营销两大类别。 服务通讯类,包…

Linux学习第26天:异步通知驱动开发: 主动

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 在正式开启今天的学习前,讲一讲为什么标题中加入了【主动】俩字。之前学习的阻塞和非阻塞IO,都是在被动的接受应用程序的操作。而今天的学…

深入浅出排序算法之计数排序

目录 1. 原理 2. 代码实现 3. 性能分析 1. 原理 首先看一个题目,有n个数,取值范围是 0~n,写出一个排序算法,要求时间复杂度和空间复杂度都是O(n)的。 为了达到这种效果,这一篇将会介绍一种不基于比较的排序方法。这…

python,pandas ,openpyxl提取excel特定数据,合并单元格合并列,设置表格格式,设置字体颜色,

python,pandas ,openpyxl提取excel特定数据,合并单元格合并列,设置表格格式,设置字体颜色, 代码 import osimport numpy import pandas as pd import openpyxl from openpyxl.styles import Font from op…

【鸿蒙软件开发】ArkTS基础组件之TextClock(时间显示文本)、TextPicker(滑动选择文本)

文章目录 前言一、TextClock1.1 子组件1.2 接口参数TextClockController 1.3 属性1.4 事件1.5 示例代码 二、TextPicker2.1 子组件2.2 接口参数 2.3 属性2.4 事件2.5 示例代码 总结 前言 TextClock组件:通过文本将当前系统时间显示在设备上。支持不同时区的时间显示&#xff0…

uni-app中tab选项卡的实现效果 @click=“clickTab(‘sell‘)“事件可传参数

一、效果图 二、代码 <template><view><view class"choose-tab"><view class"choose-tab-item" :class"chooseTab 0 ? active : " data-choose"0" click"clickTab">选项1</view><view …

docker部署prometheus+grafana服务器监控(三) - 配置grafana

查看 prometheus 访问 http://ip:9090/targets&#xff0c;效果如下&#xff0c;上面我们通过 node_exporter 收集的节点状态是 up 状态。 配置 Grafana 访问 http://ip:3000&#xff0c;登录 Grafana&#xff0c;默认的账号密码是 admin:admin&#xff0c;首次登录需要修改…

【C++初阶(三)】引用内联函数auto关键字

目录 前言 1. 引用 1.1 引用的概念 1.2 引用的特性 1.3 引用的权限 1.4 引用的使用 1.5 引用与指针的区别 2. 内联函数 2.1 什么是内联函数 2.2 内联函数的特性 3. auto关键字 3.1 auto简介 3.2 auto使用规则 3.3 auto不能使用的场景 4. 基于范围的for循环 4.1 范围for…

mathtype怎么更改编号 mathtype章节编号错乱怎么办

mathtype作为一款功能强大的公式编辑器&#xff0c;使用范围广泛&#xff0c;与多款软件兼容。但新手可能会对mathtype的操作不熟悉&#xff0c;不知道如何在mathtype中更改编号&#xff0c;以及解决章节编号错乱问题。本文将围绕mathtype怎么更改编号&#xff0c;mathtype章节…

toon boom harmony基础

以下都是tbh快捷键使用&#xff0c;或者一些常用功能介绍 1、在节点视图中&#xff0c;按回车可直接弹出节点库搜索框 2、中心线编辑器 只能编辑用笔刷画出来的线条&#xff0c;铅笔画出来的线条无法编辑。 3、镜头标记 1 右键箭头方向&#xff0c;可弹出下拉&#xff0c;&am…

StripedFly恶意软件框架感染了100万台Windows和Linux主机

导语 近日&#xff0c;一款名为StripedFly的恶意软件框架在网络安全研究人员的监视之外悄然感染了超过100万台Windows和Linux系统。这款跨平台的恶意软件平台在过去的五年中一直未被察觉。在去年&#xff0c;卡巴斯基实验室发现了这个恶意框架的真实本质&#xff0c;并发现其活…

【C++的OpenCV】第十四课-OpenCV基础强化(二):访问单通道Mat中的值

&#x1f389;&#x1f389;&#x1f389; 欢迎各位来到小白 p i a o 的学习空间&#xff01; \color{red}{欢迎各位来到小白piao的学习空间&#xff01;} 欢迎各位来到小白piao的学习空间&#xff01;&#x1f389;&#x1f389;&#x1f389; &#x1f496;&#x1f496;&…

现代挖掘机vr在线互动展示厅是实现业务增长的加速度

VR数字博物馆全景展示充分应用5G、VR全景、web3d开发和三维动画等技术&#xff0c;将实体博物馆整体还原到3D数字空间&#xff0c;让游客360全景漫游式参观&#xff0c;无论大小、贵重、破损的典藏展品都能通过3D建模技术&#xff0c;逼真重现到三维虚拟场景中&#xff0c;让参…

在全新ubuntu上用gpu训练paddleocr模型遇到的坑与解决办法

目录 一. 我的ubuntu版本![在这里插入图片描述](https://img-blog.csdnimg.cn/297945917309494ab03b50764e6fb775.png)二.首先拉取paddleocr源代码三.下载模型四.训练前的准备1.在源代码文件夹里创造一个自己放东西的文件2.准备数据2.1数据标注2.2数据划分 3.改写yml配置文件4.…

OS的Alarm定时器调度机制

调度表触发的任务在编译时就被静态定义&#xff0c;任务的触发时间和执行顺序是固定的。这种方式适用于已知的、固定的任务触发模式&#xff0c;例如周期性任务或事件驱动任务。而使用 Alarm 机制触发的任务具有更大的灵活性。Alarm 允许在运行时动态地设置和修改任务的触发时间…

Megatron-LM GPT 源码分析(三) Pipeline Parallel分析

引言 本文接着上一篇【Megatron-LM GPT 源码分析&#xff08;二&#xff09; Sequence Parallel分析】&#xff0c;基于开源代码 GitHub - NVIDIA/Megatron-LM: Ongoing research training transformer models at scale &#xff0c;通过GPT的模型运行示例&#xff0c;从三个维…

论文阅读——GPT3

来自论文&#xff1a;Language Models are Few-Shot Learners Arxiv&#xff1a;https://arxiv.org/abs/2005.14165v2 记录下一些概念等。&#xff0c;没有太多细节。 预训练LM尽管任务无关&#xff0c;但是要达到好的效果仍然需要在特定数据集或任务上微调。因此需要消除这个…

基于边缘智能网关的储能系统安全监测管理方案

“储能系统充电”是配套新能源汽车产业发展的重要应用之一。得益于电池技术的发展&#xff0c;新能源汽车正逐步迈入快充时代&#xff0c;由于在使用快速充电桩时&#xff0c;可能导致用电峰值负荷超过电网的承载能力&#xff0c;对于电网的稳定性和持续性会有较大影响&#xf…