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

news2024/9/24 4:24:21

语雀系统崩溃了,并且经过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

转载请注明出处

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

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

相关文章

1200*A. Trust Nobody(贪心)

Problem - 1826A - Codeforces 解析&#xff1a; 从大到小枚举说谎人的个数x&#xff0c;然后查看是否有 x个人说谎即可。 #include<bits/stdc.h> using namespace std; #define int long long const int N2e55; int t,n,a[N]; signed main(){scanf("%lld",&a…

TS中类型别名和接口区别

在很多场景下&#xff0c;interface 和 type都能使用&#xff0c;因此两者在很多时候会被混淆&#xff1a; 接口可以通过之间的继承&#xff0c;实现多种接口的组合 使用类型别名也可以实现多种的&#xff0c;通过&连接,有差异&#xff1a; 子接口中不能重新覆盖父接口中…

安防监控项目---boa服务器的移植

文章目录 前言一、boa服务器简介二、移植步骤三、测试结果四、A9平台移植BOA总结 前言 书接上期&#xff0c;在配置完成环境后&#xff0c;那么接下来呢还得移植两个非常关键的东西&#xff0c;一个呢时boa服务器&#xff0c;另一个呢时cgi接口&#xff0c;boa服务器能够使得我…

医学影像乳腺肿瘤分割的同学看过来:PDPNet:用于通用乳腺肿瘤分割的渐进式双先验网络

PDPNet&#xff1a;一种渐进式双先验网络&#xff0c;可以来从动态增强的图像中分割乳腺肿瘤&#xff0c;性能表现SOTA&#xff01;并提高了模型的泛化能力&#xff0c;单位&#xff1a;贵州大学, 哈医大肿瘤医院, 贵州省人民医院 为了提高乳腺肿瘤分割模型的泛化能力&#xf…

中文编程工具免费版下载,中文开发语言工具免费版下载

中文编程工具免费版下载&#xff0c;中文开发语言工具免费版下载 中文编程工具开发的实际部分案例如下图 编程系统化课程总目录及明细&#xff0c;点击进入了解详情。 https://blog.csdn.net/qq_29129627/article/details/134073098?spm1001.2014.3001.5502

轻量封装WebGPU渲染系统示例<4>-CubeMap/天空盒(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/version-1.01/src/voxgpu/sample/ImgCubeMap.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据和渲染机制分离。 5. 用户…

【linux】文件系统+软硬连接+动静态库

文件系统软硬连接动静态库 1.理解文件系统1.1磁盘的物理结构1.2磁盘的存储结构1.3磁盘的逻辑结构1.4文件系统 2.软硬链接2.1什么是软硬链接2.2软硬链接的作用 3.动静态库3.1什么是库3.1静态库和静态链接3.2动态库和动态链接3.2.1通过环境变量找到动态库路径3.2.2把动态库拷贝到…

包含(has it)、继承(is it)

包含关系&#xff08;has it&#xff09; 继承关系&#xff08;is it&#xff09; class Person:def __init__(self, no, name, salary):self.no noself.name nameself.salary salarydef __str__(self):msg self.no "---" self.name --- self.salaryreturn m…

C++设计模式_15_Proxy 代理模式

Proxy 代理模式也是属于“接口隔离”模式&#xff0c;通过增加一层间接层来解决问题的模式。 文章目录 1. 动机( Motivation)2. 模式定义3. 结构( Structure )4. 代码演示Proxy 代理模式4.1 常规方法4.2 Proxy 代理模式 5. 要点总结6. 其他参考 1. 动机( Motivation) 在面向对…

4.2 数据库安全性控制

思维导图&#xff1a; 前言&#xff1a; 整体理解 计算机系统中的安全措施是层级设置的。用户首先需通过身份鉴定进入系统&#xff0c;然后受到多种控制和保护。 安全模型(图4.2) 用户进入计算机系统时需进行身份鉴定。合法用户进入后&#xff0c;数据库管理系统实施存取控制。…

17 HAP 覆盖特性与链路损耗特性分析

HAP 覆盖特性与链路损耗特性分析 HAP平台高度&#xff1a;17~22km之间。HAP通信业务的覆盖区域取决于覆盖区边缘至平台的仰角&#xff0c;仰角越小&#xff0c;覆盖区域越大。覆盖区内不同地点的用户至平台的距离差别也越大。HAP和终端几何关系&#xff1a; B&#xff1a;地面…

比较浮点数时,我被绊倒了

&#x1f4e2;欢迎点赞 &#xff1a;&#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff0c;赐人玫瑰&#xff0c;手留余香&#xff01;&#x1f4e2;本文作者&#xff1a;由webmote 原创&#x1f4e2;作者格言&#xff1a;新的征程&#xff0c;我们面对的不是…

大彩串口屏读写文件问题

分区 本文使用的是大彩串口屏M系列的&#xff1a; 串口屏内部有三个分区&#xff0c;分别为A、B、C三个区&#xff1a; A区&#xff1a;系统区&#xff0c;存储组态工程文件 B区&#xff1a;数据区&#xff0c;存储配置信息&#xff0c;记录数据、历史曲线等 C区&#xff1a;备…

火柴排队.

题意&#xff1a;给两列火柴&#xff0c;可以交换任意相邻的火柴&#xff0c;使得&#xff08;ai-bi)^2的和最小&#xff0c;求最小交换次数。 分析&#xff1a;使得&#xff08;ai-bi)^2的和最小&#xff0c;即a^2-2abb^2的和最小&#xff0c;那么使得2ab最大&#xff0c;就可…

Transformers实战(二)快速入门文本相似度、检索式对话机器人

Transformers实战&#xff08;二&#xff09;快速入门文本相似度、检索式对话机器人 1、文本相似度 1.1 文本相似度简介 文本匹配是一个较为宽泛的概念&#xff0c;基本上只要涉及到两段文本之间关系的&#xff0c;都可以被看作是一种文本匹配的任务&#xff0c; 只是在具体…

MySQL 5.7限制general_log日志大小

背景 需求&#xff1a; 在MySQL 5.7.41中开启general_log 并限制其大小&#xff0c;避免快速增长占用硬盘空间。 解决&#xff1a; 通过定时任务&#xff0c;执行简单的脚本&#xff0c;判断general_log 日志的大小&#xff0c;实现对通用查询日志的“每日备份”或“每日清…

CSS 滚动驱动动画与 @keyframes 新语法

CSS 滚动驱动动画与 keyframes 在 CSS 滚动驱动动画相关的属性出来之后, keyframes 也迎来变化. 以前, keyframes 的值可以是 from, to, 或者百分数. 现在它多了一种属性的值 <timeline-range-name> <percentage> 建议先了解 animation-range 不然你会对 timeli…

配置两个网关之间通过IPSec VPN互联并通过总部IPSec网关进行NAT后上网

规格 适用于V200R002C00及更高版本、所有形态的AR路由器。 组网需求 如图1所示&#xff0c;某企业分为总部和两个分支机构。分支机构1和分支机构2分别通过RouterB和RouterC与Internet相连。RouterA为NAT网关&#xff0c;总部RouterA和分支RouterB为固定公网地址&#xff0c;Rou…

Python正则表达式一点通

正则作为处理字符串的一个实用工具&#xff0c;在Python中经常会用到&#xff0c;比如爬虫爬取数据时常用正则来检索字符串等等。正则表达式已经内嵌在Python中&#xff0c;通过导入re模块就可以使用&#xff0c;作为刚学Python的新手大多数都听说”正则“这个术语。 今天来给…

Vue+el-image-viewer显示tiff图片,并能够切换图片中的帧

一、简述 在前端界面显示tiff图片&#xff0c;并能够点击翻页按钮切换tiff图片中的帧&#xff0c;接收到后端传来的buffer&#xff0c;在前端处理后进行展示 二、使用工具 引入Tiff.js文件&#xff0c;引入前先进行下载安装 import Tiff from tiff.js引入显示图片组件 comp…