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

语雀系统崩溃了,并且经过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.mzph.cn/news/121758.shtml

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

相关文章

我们在 Linux 环境中用 C 编程时,如果对文件读写,Linux 会自动给文件加锁嘛?以及怎么加文件锁?

task1: 验证Linux不会自动给文件加锁 先说结论&#xff0c;结论是不会 我写了一个这样的程序 #include <stdio.h> #include <unistd.h>int main() {const char* pathname "your_file_pathname.txt";FILE* file NULL;int count 100;if(access(pathn…

数据可视化报表分享:区域管理驾驶舱

在零售数据分析中&#xff0c;区域管理驾驶舱报表是用来分析企业运营数据&#xff0c;以制定销售策略和提高利润。因此这张报表需要整合大量数据&#xff0c;数据整合、分析、指标计算的工作量极大&#xff0c;在讲究高效率、高度及时性的大数据时代&#xff0c;BI数据可视化分…

Linux--安装与配置虚拟机及虚拟机服务器坏境配置与连接---超详细教学

一&#xff0c;操作系统介绍 1.1.什么是操作系统 操作系统&#xff08;Operating System&#xff0c;简称OS&#xff09;是一种系统软件&#xff0c;它是计算机硬件和应用软件之间的桥梁。它管理计算机的硬件和软件资源&#xff0c;为应用程序提供接口和服务&#xff0c;并协调…

9、定义错误页

在layouts目录下新建error.vue&#xff0c;可以通过layout函数使用布局文件&#xff0c;通过props: [“error”]能拿到错误信息对象。 <template><div>{{ error.statusCode }}: {{ error.message }}</div> </template><script> export default {…

vue3 源码解析(2)— ref、toRef、toRefs、shallowRef 响应式的实现

前言 vue3 源码解析&#xff08;1&#xff09;— reactive 响应式实现 介绍完 reactive 之后还有另一个很重要的响应式API&#xff0c;其中包括 ref、toRef、toRefs 和 shallowRef。这些API在vue3中起着至关重要的作用&#xff0c;它们帮助我们更好地管理和跟踪响应式数据的变…

漏洞复现-dedecms文件上传(CVE-2019-8933)

dedecms文件上传_CVE-2019-8933 漏洞信息 Desdev DedeCMS 5.7SP2版本中存在安全漏洞CVE-2019-8933文件上传漏洞 描述 ​ Desdev DedeCMS&#xff08;织梦内容管理系统&#xff09;是中国卓卓网络&#xff08;Desdev&#xff09;公司的一套基于PHP的开源内容管理系统&#x…

【面试经典150 | 链表】合并两个有序链表

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;递归方法二&#xff1a;迭代 写在最后 Tag 【递归】【迭代】【链表】 题目来源 21. 合并两个有序链表 题目解读 合并两个有序链表。 解题思路 一种朴素的想法是将两个链表中的值存入到数组中&#xff0c;然后对数组…

轻量级仿 Spring Boot=嵌入式 Tomcat+Spring MVC

啥&#xff1f;Spring Boot 不用&#xff1f;——对。就只是使用 Spring MVC Embedded Tomcat&#xff0c;而不用 Boot。为啥&#xff1f;——因为 Boot 太重了&#xff1a;&#xff09; 那是反智吗&#xff1f;Spring Boot 好好的就只是因为太重就不用&#xff1f;——稍安勿…

有一个带头结点的单链表L,设计一个算法使其元素递增有序

有一个带头结点的单链表L&#xff0c;设计一个算法使其元素递增有序 代码思路&#xff1a; 我这里懒得搞那个指针了&#xff0c;直接遍历一遍链表&#xff0c;把链表的元素复制到数组arr里面 对数组A进行一下排序&#xff0c;排完之后再把元素复制到L里面。 至于排序你用啥算…

运维 | 使用 Docker 安装 Jenkins | Jenkins

运维 | 使用 Docker 安装 Jenkins | Jenkins 前言 本期内容主要是为了学习如何通过 Docker 安装Jenkins&#xff0c;仅作为记录与参考&#xff0c;希望对大家有所帮助。 准备工作 系统&#xff1a;CentOS 7.9配置&#xff1a;4c8g 快速安装 下面以 Docker 方式安装 Jenkin…

第2篇 机器学习基础 —(2)分类和回归

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。机器学习中的分类和回归都是监督学习的问题。分类问题的目标是将输入数据分为不同的类别&#xff0c;而回归问题的目标是预测一个连续的数值。分类问题输出的是物体所属的类别&#xff0c;而回归问题输出的是数值。本节课就…

【Matlab2016】Matlab中文版的下载、安装、激活(不建议安装过高版本!!)

这里写目录标题 首先双击R2016_win64.iso加载镜像文件双击setup.exe开始安装选择使用文件密钥安装填入密钥修改安装路径并记住此路径建议全部勾选等待安装完成 激活复制补丁到matlab路径下 创建快捷方式进入bin目录&#xff0c;找到matlab.exe 安装包 首先双击R2016_win64.iso加…

网络搭建和运维的基础题目

服务部分&#xff08;linux&#xff09; 实操部分 1.在任意文件夹下面创建形如 A/B/C/D 格式的文件夹系列。 [rootlocalhost ~]# mkdir -p A/B/C/D 2.在创建好的文件夹下面&#xff0c;A/B/C/D &#xff0c;里面创建文本文件 mkdir.txt [rootlocalhost ~]# cd A/B/C/D [r…

[17]JAVAEE-HTTP协议

目录 一、什么是HTTP协议 什么时候会用到HTTP协议&#xff1f; HTTP协议的工作流程 二、HTTP的报文格式 抓包 HTTP请求报文格式 1.首行 2.header 常见键值对&#xff1a; 3.空行 4.正文&#xff08;body&#xff09;&#xff08;有的时候可以没有&#xff09; HTTP…

ubuntu下Docker的简单使用并利用主机显示

首先分享一个docker镜像的网站&#xff1a;https://hub.docker.com/search?q 这个网站里面有很多配置好的镜像&#xff0c;可以直接拉取。 下面介绍一下docker的安装和使用。 1、docker得到安装&#xff1a; sudo apt-get install docker 2、docker拉取一个镜像到本地,这里我…

Python爬虫防止被封的方法:动态代理ip

目录 前言 一、为什么需要使用动态IP代理 1.网站反爬虫机制 2.突破本地IP限制 3.获取更多数据 二、Python爬虫动态IP代理的实现方法 1.使用第三方库 2.使用爬虫框架 三、预防被封的方法 1.代理池管理 2.请求间隔设置 3.使用多个代理 总结 前言 在进行网站爬取时&…

网络基础-3

路由开销 一条路由的开销时指到达这条路由的目的地/掩码需要付出的带价值。同一种路由协议发现有多条路由可以到达同一目的地/掩码时&#xff0c;将优选开销最小的路由&#xff0c;即只把开销最小的路由加入进本协议的路由表中。 路由协议 内部网关协议&#xff08;IGP&…

【每日一题Day361】LC2558从数量最多的堆取走礼物 | 大顶堆

从数量最多的堆取走礼物【LC2558】 给你一个整数数组 gifts &#xff0c;表示各堆礼物的数量。每一秒&#xff0c;你需要执行以下操作&#xff1a; 选择礼物数量最多的那一堆。如果不止一堆都符合礼物数量最多&#xff0c;从中选择任一堆即可。选中的那一堆留下平方根数量的礼物…

网络协议--TFTP:简单文件传送协议

15.1 引言 TFTP(Trivial File Transfer Protocol)即简单文件传送协议&#xff0c;最初打算用于引导无盘系统&#xff08;通常是工作站或X终端&#xff09;。和将在第27章介绍的使用TCP的文件传送协议&#xff08;FTP&#xff09;不同&#xff0c;为了保持简单和短小&#xff0…

C++STL----list的模拟实现

文章目录 list模拟实现的大致框架节点类的模拟实现迭代器类的模拟实现迭代器类存在的意义迭代器类的模板参数说明运算符的重载--运算符的重载&#xff01;与运算符的重载*运算符的重载->运算符的重载 list的模拟实现默认成员函数迭代器相关函数元素修改相关函数front和backi…