83.如何设计高可用系统
文章目录
- 一、简介
- 二、导致系统不可用的常见原因
- 三、高可用系统设计基本原则
- 四、容错性设计
- 五、弹性伸缩
- 六、可观测
- 七、安全防护设计
- 八、自动化
一、简介
什么是高可用
高可用是指系统在面对各种故障和异常情况时,仍能够提供稳定、可靠的服务。
对于企业和用户而言,高可用性是确保业务连续运行和用户体验的关键因素。 高可用系统能够降低因故障而导致的损失,提高用户满意度。
高可用与微服务架构
微服务天生具有分布式特性,有利于构建高可用系统。 通过微服务的自治性,可以实现部分服务的故障隔离,提高整体系统的可用性。
本文主要介绍,在微服务架构下,如何设计高可用的业务系统。
二、导致系统不可用的常见原因
系统不可用可能是多个因素的复杂交互导致的结果,下面是常见的导致系统不可用的因素
-
硬件故障: 服务器、网络设备或存储设备的硬件故障可能导致系统不可用。这包括硬盘故障、内存故障、电源问题等。
-
网络问题: 网络故障、带宽耗尽、
DDoS
攻击等都可能导致系统无法正常通信,影响用户访问。 -
软件错误: 程序错误、逻辑错误、内存泄漏等软件问题可能导致系统崩溃或运行缓慢。
-
配置错误: 不正确的配置可能导致系统行为异常,甚至引发系统崩溃。
-
安全问题: 安全漏洞、恶意攻击、未经授权的访问等安全问题可能导致系统被破坏或关闭。
-
人为错误: 误操作、错误的部署、不当的维护等人为因素可能导致系统不可用。
-
数据库问题: 数据库故障、连接池耗尽、数据库死锁等问题可能影响系统对数据的访问。
-
第三方服务故障: 如果系统依赖于外部服务,那么这些服务的故障也可能导致系统不可用。
-
系统过载: 高并发或大量请求超过系统处理能力,导致系统负载过高,从而使系统变得不可用。
设计高可用的系统通常需要采取措施来预防、检测和处理这些潜在问题。
三、高可用系统设计基本原则
设计高可用的系统需要遵守一些基本原则,以确保系统在面对各种故障和挑战时能够保持稳定运行。以下是一些关键的设计原则:
-
容错(
Fault Tolerance
):
系统应该能够在出现故障时仍然能够提供基本的服务,或者能够迅速从系统灾难中恢复。 -
弹性伸缩(
Scalability
):
系统应该能够适应增长的需求,通过添加更多的资源或节点来支持更多的用户或工作负载。 -
可观测(
Observability
):
实施有效的可观测性机制,包括监控、日志、度量等,以便及时检测系统性能下降、故障或异常。 -
安全性(
Security
):
系统设计应考虑到安全性,采用合适的安全措施来保护系统免受恶意攻击或数据泄露。 -
自动化(
Automation
):
自动化可以帮助降低人为错误的风险,并提高系统的响应速度。自动化可以涉及到部署、监控、扩展和故障恢复等方面。
这些原则共同构成了设计高可用系统的基础,有助于应对各种可能导致系统中断的风险和挑战。
四、容错性设计
-
冗余备份:
在关键组件或服务上使用冗余备份,确保即使其中一个组件失败,系统仍然可以继续运行。这可以包括硬件冗余、多个数据中心的部署等。 -
柔性降级:
当系统的某一部分发生故障时,设计系统能够进入一种退化模式,保持基本功能,尽量减少对用户的影响。 -
负载均衡:
使用负载均衡器分配请求到多个服务器上,确保不同服务器的负载相对均衡。这有助于防止单个服务器故障导致整个系统不可用。 -
自动故障恢复:
实施自动故障检测和恢复机制。当系统检测到故障时,能够自动切换到备份组件或服务,减少手动干预的需要。 -
幂等性设计:
确保系统操作是幂等的,即多次执行相同的操作产生的效果与执行一次相同。这有助于防止由于重试或失败导致的数据不一致性问题。 -
分布式架构:
将系统拆分为独立的微服务或组件,降低单点故障的风险。使用消息队列等手段实现异步通信,减少组件之间的依赖性。 -
限流与熔断:
当系统负载过高或出现异常时,通过限流措施防止过多请求进入系统。使用熔断机制在某个服务不可用时快速失败,避免影响整个系统。
五、弹性伸缩
弹性伸缩是保证系统高可用的一个重要的维度,它可以帮助系统根据负载情况自动调整资源。以下是几种常见的弹性伸缩设计模式:
-
垂直扩展:垂直扩展是通过增加单个节点的资源(如
CPU
、内存)来提高系统的处理能力。这种模式适用于系统的瓶颈主要在于单个节点的资源限制,例如数据库服务器。通过增加节点的资源,可以提高系统的吞吐量和性能。 -
水平扩展:水平扩展是通过增加系统的节点数量来提高系统的处理能力。这种模式适用于系统的瓶颈主要在于并发连接数或请求处理能力。通过增加节点的数量,可以将负载均衡地分布到多个节点上,提高系统的可用性和性能。
-
自动伸缩: 自动伸缩是通过监控系统的负载情况,自动调整系统的资源配置。这种模式适用于系统负载有明显的波动,例如电商网站的促销活动期间。通过设置阈值和规则,系统可以根据负载情况自动增加或减少节点的数量,以保持系统的稳定性和可用性。
-
弹性云计算: 弹性云计算是利用云服务提供商的弹性资源来扩展系统的能力。通过将系统部署在云平台上,可以根据需要动态调整资源配置,以适应系统的负载变化。云平台提供了自动伸缩和负载均衡等功能,使系统更容易实现高可用性。
-
无状态设计:无状态设计是将系统的状态和会话信息存储在外部,而不是在系统内部。这种模式适用于系统需要水平扩展的场景。通过将状态和会话信息存储在外部,可以使系统的节点无状态,从而更容易实现水平扩展和负载均衡。
六、可观测
通过系统的可观测性建设,可以帮助我们及时发现系统的问题并进行故障排查,从而提高系统的可用性和稳定性。
-
日志记录:日志记录是一种常见的可观测性设计模式,通过记录系统的运行日志,可以帮助我们了解系统的运行状态和异常情况。合理的日志记录可以帮助我们快速定位问题,并进行故障排查和分析。
-
监控指标:监控指标是通过收集和分析系统的关键指标来了解系统的运行情况。通过设置合适的监控指标,可以实时监测系统的性能、负载、资源使用情况等,及时发现潜在的问题并采取相应的措施。
-
健康检查:健康检查是通过定期检查系统的各个组件和服务的状态来判断系统是否正常运行。通过设置健康检查机制,可以及时发现故障或异常,并采取相应的措施,例如自动重启服务或切换到备用节点。
-
分布式追踪:分布式追踪是一种跟踪和分析分布式系统中请求的路径和性能的技术。通过在系统中添加唯一标识符,并记录请求的传递路径和时间,可以帮助我们了解系统中各个组件的性能瓶颈和调用关系,从而优化系统的性能和可用性。
-
告警系统:告警系统是通过设置合适的阈值和规则,实时监测系统的状态,并在出现异常或超过阈值时发送告警通知。通过及时的告警,可以帮助我们快速响应问题,并采取相应的措施,以避免系统的故障和中断。
-
可视化仪表盘:可视化仪表盘是通过将系统的关键指标和状态以图表或图形的形式展示出来,帮助我们直观地了解系统的运行情况和趋势。通过可视化仪表盘,可以快速发现系统的异常和趋势,并进行相应的调整和优化。
七、安全防护设计
安全防护是设计高可用系统的一个至关重要的维度,它可以帮助我们保护系统免受恶意攻击和数据泄露的威胁,从而提高系统的可用性和稳定性。
-
访问控制:访问控制是通过设置合适的权限和身份验证机制,限制系统的访问权限。通过使用身份验证、授权和角色管理等技术,可以确保只有经过授权的用户或服务可以访问系统的敏感资源,从而防止未经授权的访问和攻击。
-
数据加密:数据加密是通过使用加密算法对敏感数据进行加密,以保护数据的机密性和完整性。通过在数据传输和存储过程中使用加密技术,可以防止数据被窃取或篡改,从而保护系统的安全和可用性。
-
防火墙和网络隔离:防火墙和网络隔离是通过设置网络边界和访问控制规则,限制系统与外部网络的连接和通信。通过使用防火墙、网络隔离和安全组等技术,可以防止恶意攻击和网络威胁对系统的影响,提高系统的安全性和可用性。
-
安全审计和日志监控:安全审计和日志监控是通过记录和监控系统的安全事件和行为,及时发现和响应潜在的安全威胁。通过设置合适的安全审计和日志监控机制,可以帮助我们了解系统的安全状况,及时发现异常行为,并采取相应的措施,保护系统的安全和可用性。
-
异常检测和入侵防御:异常检测和入侵防御是通过使用安全监测和入侵检测系统,实时监测系统的行为和流量,发现和阻止潜在的入侵和恶意行为。通过使用异常检测和入侵防御技术,可以及时发现和阻止攻击,保护系统的安全和可用性。
-
安全演练和紧急响应:安全演练和紧急响应是通过定期进行安全演练和制定紧急响应计划,提前准备和应对系统安全事件和紧急情况。通过进行安全演练和紧急响应训练,可以提高团队的应急能力和响应速度,保护系统的安全和可用性。
八、自动化
系统实施和维护时,人工的操作往往容易出错。自动化可以帮助我们提高系统的可靠性、效率和可维护性,从而提高系统的可用性和稳定性。以下是几种常见的自动化设计模式:
-
自动化部署:自动化部署是通过使用自动化工具和脚本,实现系统的快速、可靠和一致的部署过程。通过自动化部署,可以减少人工操作的错误和时间成本,提高部署的效率和可靠性,从而保证系统的可用性和稳定性。
-
自动化配置管理:自动化配置管理是通过使用配置管理工具,实现系统配置的自动化管理和变更。通过自动化配置管理,可以确保系统的配置一致性和正确性,减少人工操作的错误和漏洞,提高系统的可用性和安全性。
-
自动化监控和告警:自动化监控和告警是通过使用监控工具和自动化脚本,实现系统的实时监控和异常告警。通过自动化监控和告警,可以及时发现系统的异常和故障,快速响应和解决问题,保证系统的可用性和稳定性。
-
自动化扩展和弹性:自动化扩展和弹性是通过使用自动化工具和规则,实现系统的自动扩展和弹性调整。通过自动化扩展和弹性,可以根据系统的负载情况自动调整资源,保持系统的性能和可用性,应对高峰期和负载波动。
-
自动化测试和验证:自动化测试和验证是通过使用自动化测试工具和脚本,实现系统的自动化测试和验证过程。通过自动化测试和验证,可以提高测试的覆盖率和效率,减少人工操作的错误和遗漏,保证系统的质量和可用性。
-
自动化故障恢复:自动化故障恢复是通过使用自动化脚本和规则,实现系统的自动化故障检测和恢复过程。通过自动化故障恢复,可以快速检测和定位故障,自动执行故障恢复策略,减少故障对系统的影响,提高系统的可用性和稳定性。
相关文章:

83.如何设计高可用系统
文章目录 一、简介二、导致系统不可用的常见原因三、高可用系统设计基本原则四、容错性设计五、弹性伸缩六、可观测七、安全防护设计八、自动化 一、简介 什么是高可用 高可用是指系统在面对各种故障和异常情况时,仍能够提供稳定、可靠的服务。对于企业和用户而言&…...

Map和Set讲解
🎥 个人主页:Dikz12📕格言:那些在暗处执拗生长的花,终有一日会馥郁传香欢迎大家👍点赞✍评论⭐收藏 目录 集合框架 模型 Set 常见方法和说明 Set总结 Map说明 Map常见方法和说明 Map 中HashMap的 …...

PHP集成开发环境 PhpStorm 2023 for mac中文激活版
PhpStorm 2023 for Mac是一款功能强大的PHP集成开发环境(IDE),旨在帮助开发者更高效地编写、调试和测试PHP代码。该软件针对Mac用户设计,提供了丰富的功能和工具,以简化开发过程并提高开发效率。 软件下载:…...

数学建模 - 线性规划入门:Gurobi + python
在工程管理、经济管理、科学研究、军事作战训练及日常生产生活等众多领域中,人们常常会遇到各种优化问题。例如,在生产经营中,我们总是希望制定最优的生产计划,充分利用已有的人力、物力资源,获得最大的经济效益&#…...

SpringBoot security 安全认证(二)——登录拦截器
本节内容:实现登录拦截器,除了登录接口之外所有接口访问都要携带Token,并且对Token合法性进行验证,实现登录状态的保持。 核心内容: 1、要实现登录拦截器,从Request请求中获取token,从缓存中获…...

详解WebRTC rtc::Thread实现
rtc::Thread介绍 rtc::Thread类不仅仅实现了线程这个执行器(比如posix底层调用pthread相关接口创建线程,管理线程等),还包括消息队列(message_queue)的实现,rtc::Thread启动后就作为一个永不停止的event l…...

阿赵UE学习笔记——13、贴花
阿赵UE学习笔记目录 大家好,我是阿赵。 继续学习虚幻引擎的使用。这次介绍一种特殊的材质类型,贴花。 一、获取贴花资源 在没有分析贴花的原理之前,可以先去获得一些免费的贴花资源来使用,比如在Quixel上面就有专门的一个资源…...

简单说说mysql的日志
今天我们通过mysql日志了解mysqld的错误日志、慢查询日志、二进制日志,redolog, undolog等。揭示它们的作用和用途,让我们工作中更能驾驭mysql。 redo 日志 如果mysql事务提交后发生了宕机现象,那怎么保证数据的持久性与完整性?…...

如何在CentOS安装DataEase数据分析服务并实现远程访问管理界面
如何在CentOS安装DataEase数据分析服务并实现远程访问管理界面 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 🌈你好呀!我是 是Yu欸 🌌 202…...

HTTP请求传递参数方式【2024-02-01】
1、HTTP请求传递参数分类 1.1、按照请求方式分类 GET方法:通过查询字符串(Query String,每个参数由参数名和参数值组成,使用等号 连接,不同参数之间使用 & 符号分隔)的方式或直接将参数放在URL中来传递参数POST…...

Error: Projects must list all files or use an ‘include‘ pattern.
博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…...

移动应用开发的方式
移动应用开发的方式(三种) Native App: 本地应用程序(原生App) Web App:网页应用程序(移动web) Hybrid App:混合应用程序(混合App) hybrid应用场景 1、微信公众号&…...

C#学习笔记_类(Class)
类的定义 类的定义是以关键字 class 开始,后跟类的名称。类的主体,包含在一对花括号内。 语法格式如下: 访问标识符 class 类名 {//变量定义访问标识符 数据类型 变量名;访问标识符 数据类型 变量名;访问标识符 数据类型 变量名;......//方…...

壹[1],Xamarin开发环境配置
1,环境 VS2022 注: 1,本来计划使用AndroidStudio,但是也是一堆莫名的配置让人搞得很神伤,还是回归C#。 2,MAUI操作类似,但是很多错误解来解去,且调试起来很卡。 3,最…...

SAM:基于 prompt 的通用图像分割模型
Paper: Kirillov A, Mintun E, Ravi N, et al. Segment anything[J]. arXiv preprint arXiv:2304.02643, 2023. Introduction: https://segment-anything.com/ Code: https://github.com/facebookresearch/segment-anything SAM 是 Meta AI 开发的一款基于 prompt 的通用视觉大…...

2024美赛数学建模C题思路+模型+代码+论文
2024美赛A-F题思路代码模型论文:2.2开赛第一时间更新,获取见文末名片 美赛流程以及经验分享 今天主要和大家分享一下我之前参加美赛的经验,主要分两部分来讲。一部分是美赛流程,另一部分是美赛经验。 一 美赛流程 比赛前&#x…...

npm run serve和npm run dev的区别
1. 功能:通常,"npm run serve"用于启动开发服务器,提供实时的开发环境,支持自动重新加载和热模块替换。这样可以在开发过程中实时查看代码更改的效果。而"npm run dev"可以是一个自定义的指令,用于…...

已解决:winform开发中删除某方法导致窗体设计报错
一、报错截图 二、解决方案 第一步,点击上图的转到代码 第二步,注释掉报错的部分(代码前面加//) 第三步,重新编译 最后,恢复正常...

开源软件的影响力
开源软件如何推动技术创新 开源软件通过开放源代码,为全球开发者提供了共同的平台,促进了协作、交流,并推动了软件技术的创新和发展。以下是一些关键方面的分析: 透明度与信任: 开源软件的源代码是公开可见的,这种透明度带来了更高水平的信任。开发者和用户能够审查代码,…...

postgresql lc_ctype不同值之间的转换
LC_CTYPE 用于决定字元是否为数字,字母,空格,标点符号,及大小写等[1]。将 LC_CTYPE 设为「C」表示 isupper(c) 或 tolower(c) 等 C 语言函数[2]仅针对 US-ASCII 范围内的字元给出预期结果。因为像 upper()、lower() 或 initcap 这类型的Postgres SQL 语句是在libc 函数上实…...

纸盒生产ERP软件怎么样?常用纸盒生产ERP系统有哪几种
市场上的纸盒种类繁多,这些差异化的商品对应多元化的销售渠道和营销策略,日常的经营管理工作较为繁琐。而纸盒生产涉及原材料、发料、车间、工时评估、排产、质检、委外、工单等诸多流程,想要随时掌握各环节进度,及时处理存在的问…...

2024年重庆市考报名照上传失败的原因
2024年重庆市考报名照需要根据以下要求生成: 1、近期6个月,免冠证件照。 2、照片背景白底或者蓝底或者红底背景。 3、照片文件jpg格式,大小在20KB以下 4、照片像素大小,295*413像素 5、照片必须使用审核工具审核后才能上传...

2023年出版的新书中提到的《人月神话》(202402更新)(1)
DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 《人月神话》于1975年出版,1995年出二十周年版。自出版以来,该书被大量的书籍和文章引用,直到现在热潮不退。 2023年,清华大学出版社推…...

gtkmm xml ui 例子(from string)
文章目录 前言来看一个从字符串中生成UI的例子 前言 glade生成的xml格式不被gtkmm4支持, 需要作修改 来看一个从字符串中生成UI的例子 #include <gtkmm/application.h> #include <gtkmm.h> #include <iostream> using namespace std;class ExampleWindow :…...

第2章 Linux 中执行命令
第2章 Linux 中执行命令 命令格式 命令 [选项] [参数....] 在linux 中命令分为内部命令和外部命令。 ctrll 可以清屏 查看帮助的命令 在使用命令之前,我们可以通过帮助来查看这个命令的格式和使用方式。在 Linux 中有两个帮助命令, help 和 man help…...

python3.8 安装缺少ssl、_ctypes模块解决办法
问题 安装pyhton3.8安装默认不依赖ssl 运行Flask项目时报错: Traceback (most recent call last):File "/usr/local/python3/bin/flask", line 8, in <module>sys.exit(main())File "/usr/local/python3/lib/python3.8/site-packages/flask…...

鸿蒙开发-UI-页面路由
鸿蒙开发-UI-组件 鸿蒙开发-UI-组件2 鸿蒙开发-UI-组件3 鸿蒙开发-UI-气泡/菜单 文章目录 一、基本概念 二、页面跳转 1.router基本概念 2.使用场景 3.页面跳转参数传递 三、页面返回 1.普通页面返回 2.页面返回前增加一个询问框 1.系统默认询问框 2.自定义询问框 总…...

【Git】多个托管平台Git账户配置
目录 多个托管平台GIt账户如何配置SSH 路由配置验证 用户名邮箱配置验证 多个托管平台GIt账户如何配置 通常情况,公司会搭建自己的gitlab代码托管服务或者将代码托管到第三方平台上,而我们自己的开源项目通常托管到Github上,每个托管平台都有…...

vue2 图片懒加载vue-lazyload 插件
1、npm install vue-lazyload --save 2、在项目的主文件(例如 main.js)中引入和使用插件: import Vue from vue import VueLazyload from vue-lazyloadVue.use(VueLazyload) 3、现在,你可以在需要懒加载图片的组件中使用 v-laz…...

element-ui button 组件源码分享
element-ui button 源码分享,基于对源码的理解,编写一个简单的 demo,主要分三个模块来分享: 一、button 组件的方法。 1.1 在方法这块,button 组件内部通过暴露 click 方法实现,具体如下: 二、…...