系统高可用

article/2025/10/12 17:43:07

系统高可用

  • 1. 什么是高可用?可用性的判断标准是啥?
    • 1.1 可用性的判断标准是啥?
  • 2. 哪些情况会导致系统不可用?
  • 3. 有哪些提高系统可用性的方法?
    • 3.1 注重代码质量,定时Review代码
    • 3.2 使用集群,减少单点故障
    • 3.3 限流
    • 3.4 使用缓存
    • 3.5 异步调用
    • 3.6 超时和重试机制设置
    • 3.7 熔断机制
  • 4. QPS和TPS
    • 4.1 QPS(每秒查询率)
    • 4.2 TPS(事务/秒)
    • 4.3 区别
    • 4.4 峰值 QPS和机器计算公式
    • 4.4 提升QPS的方法
      • 4.4.1 增加并发数
      • 4.4.2 减少平均响应时间
  • 5. 限流
    • 5.1 固定窗口计数器算法
    • 5.2 滑动窗口计数器算法
    • 5.3 令牌桶
    • 5.4 漏桶

1. 什么是高可用?可用性的判断标准是啥?

高可用描述的是一个系统在大部分时间都是可用的,可以为我们提供服务的。高可用代表系统即使在发生硬件故障或者系统升级的时候,服务仍然是可用的。

1.1 可用性的判断标准是啥?

一般情况下,我们使用多少个 9 来评判一个系统的可用性,比如 99.9999% 就是代表该系统在所有的运行时间中只有 0.0001% 的时间是不可用的,这样的系统就是非常非常高可用的了!当然,也会有系统如果可用性不太好的话,可能连 9 都上不了。
除此之外,系统的可用性还可以用某功能的失败次数与总的请求次数之比来衡量,比如对网站请求 1000 次,其中有 10 次请求失败,那么可用性就是 99%。

2. 哪些情况会导致系统不可用?

  1. 硬件故障,比如服务器坏掉。
  2. 并发量/用户请求量激增导致整个服务宕掉或者部分服务不可用。
  3. 代码问题导致程序挂掉。
  4. 网站架构某个重要的角色比如 Nginx 或者数据库突然不可用。

3. 有哪些提高系统可用性的方法?

3.1 注重代码质量,定时Review代码

3.2 使用集群,减少单点故障

先拿常用的 Redis 举个例子!我们如何保证我们的 Redis 缓存高可用呢?答案就是使用集群,避免单点故障。当我们使用一个 Redis 实例作为缓存的时候,这个 Redis 实例挂了之后,整个缓存服务可能就挂了。使用了集群之后,即使一台 Redis 实例挂了,不到一秒就会有另外一台 Redis 实例顶上。

3.3 限流

流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。——来自 alibaba-Sentinel 的 wiki。

3.4 使用缓存

如果我们的系统属于并发量比较高的话,如果我们单纯使用数据库的话,当大量请求直接落到数据库可能数据库就会直接挂掉。使用缓存缓存热点数据,因为缓存存储在内存中,所以速度相当地快!

3.5 异步调用

可以使用消息队列,消息队列可以通过异步处理提高系统性能(削峰、减少响应所需时间)并且可以降低系统耦合性

3.6 超时和重试机制设置

一旦用户请求超过某个时间的得不到响应,就抛出异常。这个是非常重要的,很多线上系统故障都是因为没有进行超时设置或者超时设置的方式不对导致的。我们在读取第三方服务的时候,尤其适合设置超时和重试机制。一般我们使用一些 RPC 框架的时候,这些框架都自带的超时重试的配置。如果不进行超时设置可能会导致请求响应速度慢,甚至导致请求堆积进而让系统无法再处理请求。重试的次数一般设为 3 次,再多次的重试没有好处,反而会加重服务器压力(部分场景使用失败重试机制会不太适合)。

3.7 熔断机制

熔断机制说的是系统自动收集所依赖服务的资源使用情况和性能指标,当所依赖的服务恶化或者调用失败次数达到某个阈值的时候就迅速失败,让当前系统立即切换依赖其他备用服务。 比较常用的流量控制和熔断降级框架是 Netflix 的 Hystrix 和 alibaba 的 Sentinel。

4. QPS和TPS

4.1 QPS(每秒查询率)

是一台服务器每秒能够响应的查询次数(数据库中的每秒执行查询sql的次数),显然,这个不够全面,不能描述增删改,所以,不建议用qps来作为系统性能指标。

4.2 TPS(事务/秒)

一个事务是指客户端向服务器发起请求,服务器做出响应的过程。发送请求开始计时,收到响应结束计时,以此来计算相应的时间和完成事务的个数。
具体的事务定义,可以是一个接口、多个接口、一个业务流程等等。以单接口定义为事务举例,每个事务包括了如下3个过程
a.向服务器发请求
b.服务器自己的内部处理(包含应用服务器、数据库服务器等)
c.服务器返回结果给客户端
如果每秒能够完成N次这三个过程,tps就是N;
如果多个接口定义为一个事务,那么,会重复执行abc,完成一次这几个请求,算做一个tps。

4.3 区别

如果是对一个查询接口压测,且这个接口内部不会再去请求其它接口,那么 TPS = QPS,否则,TPS ≠ QPS。
在这里插入图片描述

4.4 峰值 QPS和机器计算公式

原理:每天80%的访问集中在20%的请求中,这20%的时间叫做峰值时间。
公式:(总PV数 * 80%)/ (每天的秒数 * 20%)= 峰值时间每秒请求数(QPS)
机器:峰值时间每秒QPS / 单台机器的QPS = 需要的机器数量

举例:每天300w PV的单台机器上,这台机器需要多少QPS?
(3000000 * 0.8) / (86400 * 0.2) =139(QPS)
如果一台机器的QPS是58,需要多少台机器?
139/58≈3

4.4 提升QPS的方法

QPS= 并发数/平均响应时间

4.4.1 增加并发数

  1. 增加处理接口的线程数,和服务器性能匹配的线程数
  2. 调用链路上的各个服务尽量不要单点,不要让其中某一点成为瓶颈

4.4.2 减少平均响应时间

  1. 流量消峰。放行适当的流量,处理的不了的请求直接返回错误或者提示
  2. 优化程序

5. 限流

5.1 固定窗口计数器算法

固定窗口其实就是时间窗口。固定窗口计数器算法 规定了我们单位时间处理的请求数量。

假如我们规定系统中某个接口 1 分钟只能访问 33 次的话,使用固定窗口计数器算法的实现思路如下:
给定一个变量 counter 来记录当前接口处理的请求数量,初始值为 0(代表接口当前 1 分钟内还未处理请求)。
1 分钟之内每处理一个请求之后就将 counter+1 ,当 counter=33 之后(也就是说在这 1 分钟内接口已经被访问 33 次的话),后续的请求就会被全部拒绝。
等到 1 分钟结束后,将 counter 重置 0,重新开始计数。

这种限流算法无法保证限流速率,因而无法保证突然激增的流量。在这里插入图片描述
就比如说我们限制某个接口 1 分钟只能访问 100次,前 59s 这个接口 1 个请求没有接收,后 1s 突然接收了 100 个请求;然后接着又来了100的请求;在当前场景下,这 200个请求在 2s 内是没办法被处理的,系统直接就被瞬时的大量请求给击垮了。

5.2 滑动窗口计数器算法

滑动窗口计数器算法 算的上是固定窗口计数器算法的升级版。
我们遍历过去一分钟内每个独立区间,也就是每10秒内的计数器的计数总数,这个总和当然就是过去一分钟内全部的请求数量了。
每经过10秒,我们需要将整个计数器区间往右移动一格。
在这里插入图片描述

5.3 令牌桶

一个固定大小的容器(令牌桶),系统以恒定的速率向令牌桶中放入令牌,如果客户端发来请求,就需要先从令牌桶中拿到一个令牌,才能正常请求,这时候令牌桶中就少了一个令牌,当令牌桶满了的时候,在向令牌桶生成令牌的时候,令牌会被舍弃。
在这里插入图片描述
请求速度大于令牌生成速度,那么令牌被拿完后,后续再进来的请求会被限流;
请求速度等于令牌生成速度,正常处理;
请求速度小于令牌生成速度,正常处理;
优点:可以短时间内大量请求,因为桶里有令牌。

5.4 漏桶

我们可以把发请求的动作比作成注水到桶中,我们处理请求的过程可以比喻为漏桶漏水。我们往桶中以任意速率流入水,以一定速率流出水。当水超过桶流量则丢弃,因为桶容量是不变的,保证了整体的速率。

如果想要实现这个算法的话也很简单,准备一个队列用来保存请求,然后我们定期从队列中拿请求来执行就好了(和消息队列削峰/限流的思想是一样的)。
在这里插入图片描述
当请求速度大于漏桶流出速度,也就是请求量大于服务最大处理能力,触发限流策略。
当请求速度小于漏桶流出速度,也就是服务处理能力大于等于请求量,正常执行。
缺点:当系统短时间内有突发的大量请求,漏桶算法处理不了。

文章来源:https://snailclimb.gitee.io/javaguide/#/docs/high-availability/high-availability-system-design?id=_7%e4%bd%bf%e7%94%a8%e7%bc%93%e5%ad%98

QPS和TPS来源:https://www.bilibili.com/video/BV17R4y1M74u/?spm_id_from=333.337.search-card.all.click&vd_source=b901ef0e9ed712b24882863596eab0ca
https://blog.csdn.net/weixin_42483745/article/details/123953857

限流:https://www.bilibili.com/video/BV1AT4y167iA/?spm_id_from=333.337.search-card.all.click&vd_source=b901ef0e9ed712b24882863596eab0ca
https://snailclimb.gitee.io/javaguide/#/docs/high-availability/limit-request?id=%e4%bb%a4%e7%89%8c%e6%a1%b6%e7%ae%97%e6%b3%95
https://www.bilibili.com/video/BV1ZY4y1w7e7/?spm_id_from=333.788&vd_source=b901ef0e9ed712b24882863596eab0ca


http://chatgpt.dhexx.cn/article/HAbRmZEW.shtml

相关文章

HBase高可用

一、HBase高可用简介 HBase集群如果只有一个master,一旦master出现故障,将导致整个集群无法使用,所以在实际的生产环境中,需要搭建HBase的高可用,也就是让HMaster高可用,也就是需要再选择一个或多个节点也…

你管这破玩意儿叫高可用

大家好,我是坤哥 今天我们来聊一下互联网三高(高并发、高性能、高可用)中的高可用,看完本文相信能解开你关于高可用设计的大部分困惑 前言 高可用(High availability,即 HA)的主要目的是为了保障…

什么是高可用?高可用介绍:

前言: 高可用(High availability,即 HA)的主要目的是为了保障「业务的连续性」,即在用户眼里,业务永远是正常(或者说基本正常)对外提供服务的。高可用主要是针对架构而言&#xff0c…

HTML Responsive Web Page

注&#xff1a;参考网站 https://www.w3schools.com HTML Responsive Web Page index.html <!DOCTYPE html> <html><head><link rel"stylesheet" href"style.css"><title>Responsive web page</title><meta lan…

响应式布局【Responsive】 与 自适应布局 【adaptive】、单页面【SPA】 和多页面【MPA】

1、响应式布局 是一个网址能兼容多个terminate【终端】&#xff0c;而不是为每个终端做一个特定的版本 优点&#xff1a; 用户体验好节约开发时间、节省设计seo友好可以适用所有设备屏幕 缺点 设计与风格有局限性《自由度太低&#xff0c;局部性较大》灵活性有所欠缺 基于不…

Bootstrap:Responsive Design with Bootstrap(一)

1.Use Responsive Design with Bootstrap Fluid Containers 现在让我们回到我们的Cat Photo应用。这次&#xff0c;我们将用流行的响应式框架Bootstrap来美化它。 Bootstrap将会根据你的屏幕的大小来调整HTML元素的大小 —— 强调 响应式设计的概念。 通过响应式设计&#x…

responsive tables

以上内容原本是整理为ppt格式的&#xff0c;贴过来格式有点乱&#xff0c;请见谅。 其他responsive tables参考&#xff1a; http://gergeo.se/RWD-Table-Patterns/ 3种类型的代码参考 unseen column&#xff1a; http://runjs.cn/code/zrhodpx5 flip scroll&#xff1a; ht…

CSS之responsive image gallery

responsive image gallery 这次实例主要是练习如何讲不同的图片设置为一个栏目&#xff0c;并且能够根据屏幕的大小进行自适应的变换。需要注意的是&#xff0c;本次实例中运用到的重要的关键的内容是&#xff1a;float-left&#xff1b;box-sizing; media screen and (max-wi…

html5 响应式表格插件,响应式表格jQuery插件 – Responsive tables

响应式表格jQuery插件 – Responsive tables 4月 24, 2014 评论 (1) Sponsor 这个Responsive tables jQuery插件依赖于Bootstrap 3使用&#xff0c;比BS自带的自适应多了一些好用的功能&#xff0c;比如筛选显示&#xff0c;Focus选定、Table头滑动固定等&#xff0c;下来看看介…

SAP Fiori 设计准则里的 Responsive 表格概述

Responsive Table 是 SAP Fiori 中的默认表控件。 它包含一组 Line item 并且完全响应(fully responsive)。 根据具体情况&#xff0c;用户还可以从行项目导航到更多详细信息页面。 一个行项目包含多个数据点(data point)&#xff0c;这些数据点被分类到列中。 数据点是指一个…

Responsive Web测试

什么是Responsive Web设计 Ethan Marcotte曾于2010年5月25日在A List Apart发表了文章《Responsive Web Design》&#xff0c;首次提出了RWD(Responsive Web Design)的概念。其理念是&#xff0c;Web页面的设计能够自适应多种设备、平台和浏览器&#xff0c;同时减少缩放、平移…

CSS之Responsive设计的关键三步

下面我们就通过这篇教程&#xff0c;帮助大家从三个步骤来了解和学习“Responsive”设计 第一步&#xff1a;Meta标签 大家都知道&#xff0c;现在智能手机上浏览web页面会让页面适应屏幕的大小&#xff0c;显示在屏幕上。不过我们可以通过“meta”标签对他进行重置&#xff…

CSS之Responsive网页设计的三个特性

Responsive网页设计无疑是网页设计中的一个热门话题。某种程度上&#xff0c;他将是一个最受欢迎的网页设计概念&#xff0c;因为随着网站用户日渐多样化的访问方法&#xff0c;比如说“iPad”、“iPhone”、“Android移动设备”、“平板电脑”、“台式机”以及“ 笔记本”等不…

下载Django中文官方文档

点击?地址&#xff0c;2.2是版本号&#xff0c;后续更新需自行更改对应的版本 https://docs.djangoproject.com/zh-hans/2.2/ 点击下载 HTML&#xff0c;即可下载全中文官方文档 有部分没有中文翻译的页面&#xff0c;请自行安装谷歌翻译插件

Django 文档 | Django

项目介绍 一款 Python 语言基于Django、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架&#xff0c;本着简化开发、提升开发效率的初衷触发&#xff0c;框架自研了一套个性化的组件&#xff0c;实现了可插拔的组件式开发方式&#xff1a;单图上传、多…

Django文档4.0(通俗易懂)

欢迎访问个人博客http://www.jkraise.top 初识 django project 01. 进入虚拟环境 创建Django 工程 使用django-admin.py 来创建 xxx 项目 django-admin startproject xxxx 创建完成后 我们查看 项目结构 目录说明&#xff1a; test——djgo_001: 项目容器 manage.py: 一…

Django技术文档

安装Django 安装python环境并添加到系统环境中 注意&#xff1a;安装的时候尽量避免路径中含有中文 virtualenv虚拟环境的使用 安装virtualenv pip install virtualenv创建virtualenv虚拟环境 CMD创建虚拟环境 cmd进入自己创建的虚拟环境文件夹输入virtualenv 虚拟环境名…

django-rest-framework文档导读

django-rest-framework文档导读 技巧反序列化校验数据保存数据ModelSerializer简化代码 APIViewrequest/responseGenericAPIViewMixinListAPIViewCreateAPIViewRetrieveAPIViewDestroyAPIViewUpdateAPIViewListCreateAPIViewRetrieveUpdateAPIViewRetrieveDestroyAPIViewRetrie…

Django Rest Framework中文文档:Serializer relations

文章目录 一&#xff0c;django模型间的关系二&#xff0c;检查序列化器实例详情三&#xff0c;序列化关系字段&#xff08;一&#xff09;StringRelatedField&#xff08;二&#xff09;PrimaryKeyRelatedField&#xff08;三&#xff09;HyperlinkedRelatedField&#xff08;…

Django官方文档

一、文档地址 https://docs.djangoproject.com/zh-hans/3.2/ 1.1 编写你的第一个 Django 应用&#xff0c;第 1 部分 1.1.1 创建项目 使用django的系统工具django-admin执行指令&#xff0c;即可创建 django-admin startproject mysite 目录结构显示如下 mysite/manage.…