【知识整理】一文理解系统服务高可用

news2024/11/15 23:30:14

一、如何理解高可用

1、什么是高可用

高可用性(英语: High Availability,缩写为 HA),指系统无中断地执行其功能的能力,代表系统的可用性程度,是进行系统设计时的准则之一。

2、决定可用性的两大因素

谈可用性不需要绕来绕去,只谈 SLA 即可:SLA(Service-Level Agreement),服务等级协议,用于评估服务可用性等级。计算公式是 MTBF/(MTBF+MTTR)

2个9和3个9是可以靠技术完善和运气达到。但是从3个9往上,就基本超出了人力的范畴,考验的是业务的自愈能力,架构的容灾、容错设计,灾备系统的完善等等。

MTBF(Mean Time Between Failure),系统可用时长

MTTR(Mean Time To Repair),系统从故障后到恢复正常所耗费的时间

一个服务的可用度,取决于 MTBF 和 MTTR 这两个因子,要么提高 MTBF, 要么降低 MTTR。

3、构建高可用系统,面临哪些难题

不过,打造高可用系统,这个话题还是相对来说比较虚的。高可用构建不是一个点,而是所有点组合的一个结果。不像技术案例具体可实现,高可用更抽象,需要有足够的技术视野,需要能够观测并提前做好布局。即便如此,在构建稳定性时,还是会遇到很多难题。

难题一:业务变化之快

对于一个业务来说,不同阶段业务目标是不同的,对系统的要求也是如此:业务初期的要求迭代效率,业务中期的要求是业务起量,业务长期的要求是高可用(稳定性)。需要注意的是,面对业务的快速发展及不确定性,想要提升系统稳定性,需要贴合业务的节奏,对于影响稳定性高严重性、高可能性的风险进行风险管控处理。

难题二:构建范围之广

稳定性建设需要从全局视⻆总览,建设范围广,工作量大,其中包括研发、测试、运维、DBA等多个⻆色,流程规范,变更管理,涉及架构设计、数据库、缓存、消息队列、基础架构等。

例如:我们可能针对某个核心关键流程进行优化、容错、解耦设计,这个改动可能涉及系统层面从上到下的多处修改,包括数据结构调整、业务逻辑改造、数据交互方式等,涉及诸多方面,很可能有遗漏或bug,导致严重的事故,需要有逐一确认某个细节及强有力的测试才可以。

难题三:实施成本之高

稳定性建设是需要投入一定的成本,带来的收益也是隐形的,不像业务目标那么明显。一般情况下,业务上不会给技术做稳定性建设的,除非是业务已取得一定的收益,业务模型已形成闭环,此刻业务为了走的更远,打稳地基,允许投入一定的成本做稳定性建设。不过技术债,还是要尽早还,因为前期的成本要小很多。比如,服务依赖不合理,前期调整比后期调整的成本就要小的多。

4、影响稳定性因素有哪些

影响稳定性的因素有很多,比如业务代码、配置信息、基础设施、断电等,为了便于我们理解和记忆,我这里对影响稳定性的因素进行抽象的总结,分为:人为因素、自然因素两大类。


二、高可用性的方案高

可用分为4个步骤:预防、发现、恢复、复盘。

1、预防

通过良好的设计+规范+自动故障转移来实现。

架构设计原则

研发规范

设计阶段:遵循架构设计原则、技术设计文档

编码阶段:代码规范、工程结构规范、单元测试覆盖率和通过率、日志规范、CR规范、安全规范、高质量的代码发布阶段:变更三板斧(可灰度、可回滚、可观测)

故障转移

限流

限流是指对服务的并发访问量进行限制,设置单位时间内的并发数,超出限制的请求拒绝并fallback,防止后台服务被冲垮。(限流算法:计数器、滑动窗口基数、漏斗、令牌桶),集群限流、单机限流、如何做动态限流

降级

降级,是指牺牲非核心的业务功能,保证核心功能的稳定运行。简单来说,要实现优雅的业务降级,需要将功能实现拆分到相对独立的不同代码单元,分优先级进行隔离。在后台通过开关控制,降级部分非核心的业务功能,减轻系统依赖和性能损耗,从而提升集群的整体吞吐率。

开关降级:一是自动开关,这种降级方式要设立好降级预案,采集各类降级指标,包括业务指标和系统运行环境指标(例如:CPU、内存、某个支付通道的成功率等);

二是手工开关,这类降级要做的是设立好精准的告警。

读服务降级:出问题后一个接口返回(空、只读缓存、缺省、备份数据、其它服务等),前提是业务上可以容忍这类降级。

写服务降级:写服务大多数场景比较难做降级。可以控制写流量、写数据库改写成MQ或者缓存之类。

系统降级:业务中非核心的系统,流量大后可以关掉此类系统,将最好的资源留给最核心的服务。

功能开关:打开和关闭某些功能,比如消息量过大,系统处理不了,把开关打开后直接丢弃消息不处理。上线新功能增加开关,如果有问题关闭新功能。运行时动态调整日志级别,调试时打开对应开关动态调整输出级别。

熔断

当服务异常或者大量延时,满足熔断条件时服务调用方会主动启动熔断,过载保护,自我嗅探,进行流量恢复。防止因为故障、超时、重试导致故障被多重放大。

容错

FailXXX

容错的设计有个基本原则,就是面向失败设计“Design for Failure”。为了避免出现“千里之堤溃于蚁穴”这种情况,在设计上需要考虑到各种边界场景和对于服务间调用出现的异常或延迟情况,同时在架构设计和开发时也要考虑周到,这一切都是为了达到以下目标:

一个依赖服务的故障不会严᯿破坏用户的体验。

当出现下游调用失败时,我们一般有几种处理方式:

1. failretry,即失败重试,需要配合退避时间,否则马上重试不一定会有效果。失败重试能够提高成功率,但是也会造成响应时间变慢,服务提供方压力倍增。具体要不要重试要根据具体情况决定:对响应时间有要求吗?接口失败率如何?重试会不会造成雪崩?当调用外部服务异常时可以设置重试策略,每次重试时间递增,但是需要设置最大重试次数和重试开关,避免对下游系统产生影响。请求对外接口的时候,需要设置合理的超时时间,避免外部接口挂掉时,阻塞整个系统。

2. failover,即所谓的故障转移。比如调用下游a接口失败,那么RPC的负载均衡器将会调用a接口提供方的其他机器进行重试;在比如数据库x挂了,应用自适应容灾将对x库的调用切换到y库调用,此y库即可以是faillover库(流水型业务),也可以备库(状态型业务)。

3. failsafe,即静默,一般下游链路是弱依赖的时候,可以采用failsafe,即可和failover相结合,比如failover了3次还是失败,那么执行failsafe。

4. failfast,立即报错,failfast主要让工程师快速的感知问题所在,并及时进行人工干预。

5. failback,延迟补偿(回血),一般可以采用消息队列或定时扫描等。

容灾

容灾的定义指在相隔较远的两地(同城或异地)建立两套或多套功能相同的IT系统,互相之间可以进行健康状态监视和功能切换,当一处因意外(天灾、人祸、挖掘机事件或者机房断电)停止工作时,整个应用系统可以切换到另一处,使得该系统功能可以继续正常工作,侧重数据同步和系统持续可用,通俗的讲是指当灾难发生时,在保证生产系统的数据尽量少丢失的情况下,保持生产系统的业务不间断地运行,对灾难的容忍能力,容灾的核心思想是基于隔离的冗余。

方案:两地三中心、同城多活、异地多活等。

备份

对重要资源的备份,如系统、应用、数据、静态资源、配置和代码等。

隔离

对系统、业务所占有的资源进行隔离,限制某个业务对资源的占用数量,避免一个业务占用整个系统资源,对其他业务造成影响。

可以分为数据隔离、机器隔离、线程池隔离、进程隔离、模块隔离、业务隔离、机房隔离、在数据库的使用中还经常用到读写分离。

变更管理

变更:代码发布(灰度、可回滚)、DB、配置、网络、基础设施等

未变更管理:服务未续费、证书配置未更新导致过期等

2、发现

监控

监控元数据:CPU、内存、网络、IO、磁盘、负载

分层监控:网络层、接入层、服务层、基础层、中间件层、系统层等

日常监控:Nginx日志、错误日志、业务埋点日志、运行时日志,做监控检查,及早发现请求延迟、异常流ᰁ、错误等。

业务接口和数据监控:1.接口监控对核心的接口请求指标监控等等,2.核心业务数据监控。

报警

告警移动化。通过飞书、企业微信、钉钉移动化工具第一时间通知相关人员。

可视化

效率&稳定性:通过将服务的信息平台化,透明化,能够清楚了解服务的信息,提升业务方调用的效率,能够快速的对服务进行了解;另外能够清楚知道的服务的上下游依赖,业务方或调用方,这样在服务变更前能够及时通知到各个依赖方,并评估变更的影响。

服务治理:服务治理通过对当前服务的信息进行梳理、观测各项指标是否正常,包括服务职责,上下游依赖依赖是否合理,服务信息维护状态等等,防止慢慢的随着时间,逐渐的腐化。

可观测

Metrics(度量), tracing(跟踪), and logging(日志)

3、恢复

缩短故障影响时长:增大 MTBF ,减小 MTTR

优先恢复业务进行止损,再排查问题

异常预案(硬件、软件、业务) 值班

可回滚:发布版本失败时可随时快速回退到上一个稳定版本,或者开关回滚

自动恢复、自动扩缩容

4、复盘

复盘会和改进措施:排查根因、由点及面发现问题、制定改进方案计划和实施。


三、总结

人的意识是最重要的,专业能力可以锻炼培养。如果意识不足或松懈,好的能力以及机制流程也会形同虚设。

永远要对敬畏线上,敬畏客户体验。面向线上的稳定性战术上可以基于专业度锻炼后自信,但战略和思想上必须持

续如履薄冰、三省吾身。线上稳定性保障是作为技术人自己专业度的追求,始终保持敬畏。不因为业务繁忙、个人

状态、团队是否重视而有变化,只要职责在,就要守护好。技术主管以及系统负责人要有持续感知稳定性隐患和风

险,保持灵敏度以及系统性的查缺补漏。

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

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

相关文章

指针进阶(上)

二级指针 二级指针是用来存放一级指针地址。 如何使用和解引用呢&#xff1f; #include <stdio.h>int main() {int a 5;int* p &a;int** p2 &p;**p2 10;printf("%d\n", a);return 0; }这里的解引用使用两颗星号的原因是&#xff1a;一个星号找到…

Python初学者学习记录——python基础综合案例:数据可视化——动态柱状图

一、案例效果 通过pyecharts可以实现数据的动态显示&#xff0c;直观的感受1960~2019年世界各国GDP的变化趋势 二、通过Bar构建基础柱状图 反转x轴和y轴 标签数值在右侧 from pyecharts.charts import Bar from pyecharts.options import LabelOpts# 构建柱状图对象 bar Bar()…

介绍docker

一&#xff1a;介绍docker&#xff1a; Docker 并没有单独的图形界面&#xff0c;它主要通过命令行来进行管理和操作 1、 docker ps&#xff1a;显示正在运行的容器。 docker images&#xff1a;显示本地的镜像。 docker run&#xff1a;创建并启动一个新容器。 docker stop&a…

台灯学生用哪个牌子好?学生用护眼台灯品牌推荐

晚上学习&#xff0c;有台灯肯定比没台灯好。只要是盏合格的、能用的台灯&#xff0c;都能给你一个稳定又亮堂的环境。但是有些不合格的台灯会给眼睛带来伤害&#xff0c;尤其是学习负担比较重的学生。那有哪些台灯是学生用着比较好用的呢&#xff1f; 一、学生使用护眼台灯的…

2-2 动手学深度学习v2-损失函数-笔记

损失函数&#xff0c;用来衡量预测值和真实值之间的区别。是机器学习里面一个非常重要的概念。 三个常用的损失函数 L2 loss、L1 loss、Huber’s Robust loss 均方损失 L2 Loss l ( y , y ′ ) 1 2 ( y − y ′ ) 2 l(y,y^{\prime})\frac{1}{2}(y-y^{\prime})^{2} l(y,y′)21…

Unity3d Shader篇(三)— 片元半兰伯特着色器解析

文章目录 前言一、片元半兰伯特着色器是什么&#xff1f;1. 片元漫反射着色器的工作原理2. 片元半兰伯特着色器的优缺点优点&#xff1a;缺点&#xff1a; 3. 公式 二、使用步骤1. Shader 属性定义2. SubShader 设置3. 渲染 Pass4. 定义结构体和顶点着色器函数5. 片元着色器函数…

计算机毕业设计 基于SpringBoot的线上教育培训办公系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

centos7的git使用方法

下载git yum install git git克隆 git clone https...(图片中复制的内容) git提交到远程仓库 git add filename git commit -m "提交日志" git push git首次使用要配置邮箱和用户名 查看提交日志 git log 查看当前提交状态 git status

74HC154D-LED

一、引脚说明 1-11 13-17 &#xff1a;输出端。&#xff08;outputs (active LOW)&#xff09; 12&#xff1a;Gnd电源地 &#xff08;ground (0 V)&#xff09; 18-19&#xff1a;使能输入端、低电平有效 (enable inputs (active LOW)) 20-23&#xff1a;地址输入端 (addr…

ctfshow-web1~10-WP

web1 右键查看源码就能看到flag web2 打开网页提示无法查看源代码,右键也使用不了,那我们就在url前面加上view-source: view-source:http://83a83588-671e-4a94-9c6f-6857f9e20c2f.chall.ctf.show/ 访问后即可获得flag web3 右键源码也没看到信息,去查看一下请求头和响应…

私募证券基金动态-24年1月报

成交量&#xff1a;1月日均7,280.98亿元 2024年1月A股两市日均成交7,280.98亿元&#xff0c;环比下降5.40%、同比下降7.85%。1月整体22个交易日&#xff0c;无单日交易日成交金额过万亿&#xff0c;单日交易日最低成交金额为6,120.22亿元&#xff08;1月15日&#xff09;&…

【动态规划】【图论】【C++算法】1928规定时间内到达终点的最小花费

作者推荐 【动态规划】【状态压缩】【2次选择】【广度搜索】1494. 并行课程 II 本文涉及知识点 动态规划汇总 LeetCode1928. 规定时间内到达终点的最小花费 一个国家有 n 个城市&#xff0c;城市编号为 0 到 n - 1 &#xff0c;题目保证 所有城市 都由双向道路 连接在一起…

问题:淘宝网禁止出售保护动植物及其制品,以下哪种饰品可不以在淘宝上出售?() #学习方法#其他

问题&#xff1a;淘宝网禁止出售保护动植物及其制品,以下哪种饰品可不以在淘宝上出售&#xff1f;() A&#xff0e;钻石 B&#xff0e;玳瑁饰品 C&#xff0e;象牙饰品 D&#xff0e;犀牛角饰品 参考答案如图所示

vue3(笔记)

组合式Api setup-----相当于beforeCreate, create生命周期 reactive–定义状态 对象形式 响应式原理 toRefs— Pinia &#xff08;只有state、getters和actions&#xff09; 更加简洁的语法&#xff0c;完美支持Vue3的Composition api 和 对TypesCcript的完美支持

Vue3入门到实战笔记05--路由

使用路由需要做的事情&#xff1a; 1.确定好导航区、展示区 2.请来路由器 3. 制定路由的具体规则&#xff08;什么路径、对应着什么组件&#xff09; 4. 形成一个一个的.vue 1、 基本使用步骤 在cmd窗口安装: npm i vue-router在src当中创建一个router文件夹&#xff0c;并在…

docker之程序镜像的制作

目录 一、每种资源的预安装&#xff08;基础&#xff09; 安装 nginx安装 redis 二、dockerfile文件制作&#xff08;基础&#xff09; 打包 redis 镜像 创建镜像制作空间制作dockerfile 打包 nginx 镜像 三、创建组合镜像&#xff08;方式一&#xff09; 生成centos容器并…

苹果证书过期有什么影响

引言 苹果证书是一种数字签名&#xff0c;用于验证应用程序的身份和完整性。然而&#xff0c;若该证书过期&#xff0c;将会对用户和开发者带来一定的影响。在本文中&#xff0c;我们将详细介绍苹果证书过期的原理和影响&#xff0c;并提供一些解决方法。 苹果证书的原理 苹…

CleanMyMacX4.14.6如何清理mac垃圾内存

一直以来&#xff0c;苹果电脑的运行流畅度都很好&#xff0c;但是垃圾内存多了磁盘空间慢慢变少&#xff0c;还是会造成卡顿的。这篇文章就告诉大家电脑如何清理垃圾内存&#xff0c;电脑如何清理磁盘空间。 一、电脑如何清理垃圾内存 垃圾内存指的是各种缓存文件和系统垃圾…

C语言之找单身狗

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a; 我要学编程(ಥ_ಥ)-CSDN博客 题目&#xff1a; 在一个整型数组中&#xff0c;只有一个数字出现一次&#xff0c;其他数组都是成对出现的&#xff0c;请找出那个只出现一次的数字。…