需求分析引言:架构漫谈(三)可用性专题

前文介绍了非功能性需求的各个指标和一些业界的标准。
非功能性需求里有一项可靠性,与之关联的一个指标叫可用性
本文对非功能性需求里的可用性、可靠性,进行一些详细的说明。

概念

我们在网上的云服务商处,经常看到产品介绍里会有这种字样:我们的服务可用性高达 99.99%
这个可用性的含义是什么?

  • 定义:
    指系统在一段时间内,正常运行和可正常使用的时间占比。
    例如:一年内,某系统正常运行364天,故障累计时长1天,则可用性为 364/365 ≈ 99.7%
  • 与可靠性的区别:
    可靠性是考察两次故障的平均间隔时长。
  • 通常情况下,两者是有关联的,即可靠性好,通常可用性也高。
    但是也存在例外情况,如下面2个场景对比:
    • 可用性高但可靠性不好
      每分钟都会宕机一次,1秒就恢复正常了,可用性比较好≈ 98.3%
      但是故障概率高,连续正常服务时间仅为59秒,所以可靠性差
    • 可靠性好但可用性不高
      每天宕机一次,每次2小时,可用性比上面的场景要差≈ 91.7%
      但是比上一个场景,可靠性好,它的连续正常服务时间为22小时

度量

对一个软件系统的可用性,度量方法通常有两种:

基于时间

Uptime / (Uptime+Downtime)
即正常工作的时长,除以总时长

基于请求

Success / Total
即成功响应次数,除以总请求次数

下面2张图,左边是列举一个系统达到该可用性时,每年的平均故障时间,右边是常见云服务对外承诺的可用性:
在这里插入图片描述
从上面的图,可以看出:

  • 越低的可用性,对用户的影响越大,故障多了,用户抱怨、投诉、流失的概率就越大
  • 云服务厂商承诺的可用性,有的也并不高,你的系统在设计时,一定也要考虑云服务厂商的故障影响
    参考:
    • 阿里云SLA服务等级协议声明:https://help.aliyun.com/document_detail/56773.htm
      短信服务的可用性只承诺95%,存储的可用性可以达到99.995%
    • 微软云Azure: https://azure.microsoft.com/zh-cn/support/legal/sla/

题外话:

  • 云厂商出现故障时,只要时长不超出承诺的可用性,基本上只是道歉;即使超出了,一般也只是赔偿对应的故障时长,比如故障1小时,赔偿你3小时的云服务使用时长,仅此而已。
    所以,你数据丢了,如果没闹大,一般就只能自己想办法了。
    可以搜索:2018年发生的 前沿数控在腾讯云数据丢失事件,索赔千万,只赔付13万。

  • 我以前公司的SaaS服务,部署在阿里云上,在服务出故障时,市场人员先跟用户说:阿里云又挂了,然后才是对老板投诉研发人员

  • 绝大多数的Web服务,其可用性都在3个9,甚至以下的水平

如何提升可用性

案例分析

假设某系统,有一个登录请求,需要访问4个DB数据库(mysql/mongodb/cassandra/redis),已知每个DB的可用性是99.9%,如图:
在这里插入图片描述
那么这个请求的可用性是多少?
这个串联系统请求的实际可用性:99.9%的4次方 = 99.6%,这意味着:
单个DB,是99.9%的可用性,即全年会有8.76小时不可用;
但是4个DB进行串行请求后,变为全年35.04小时不可用,故障概率翻了4倍。

而且图中还有其它服务器、网络,假设网络不稳定,导致每个DB的可用性降低到了99.5%,则:
这个串联系统请求的可用性降低为:99.5%的4次方 = 98%
相当于全年有175.2小时不可用,平均每个月宕机14.6小时

提升可用性的方法

从上面的案例,可以得出,一个系统里涉及的模块(微服务)、中间件(数据库、消息队列等)越多,可用性越低。
那么如何提升可用性呢?
唯一的答案是使用 并联,即服务冗余,也就是我们常说的负载均衡;

  • 串联系统(2个节点)的可用性计算: A = p1 * p2
    如2个节点的可用性都是99%,则 A = 99% * 99% = 98.01%
  • 并联系统(2个节点)的可用性计算: A = 1-(1-p1)*(1-p2)
    如2个节点的可用性都是99%,则 A = 1-(1-99%) * (1-99%) = 99.99%
    冗余一个节点,可用性就能从99%提升到99.99%,从年故障87.6小时,降低到52分钟

如何实现系统并联:

  • 对于每个服务,都部署在多台独立的服务器上;
  • 前端有一个网关,接收请求,根据服务的每个节点状态,发送到健康节点上
  • 网关自身也要做冗余,通常会通过一套选举机制来保证网关自身健康状态,选举机制常见的有Paxos算法、Raft算法,可以自行搜索

困难点:

  • 架构设计复杂,且涉及旧系统改造,有的系统不支持并联,比如用了内存缓存、用了Session等;
  • 成本翻倍,需要综合考虑产品的市场与开发成本、部署成本、后续的运维成本;
  • 使用容器,如K8S时,要注意同一个服务的多个实例(Pod),要部署在不同的工作节点上;
    我就碰到过一个服务的2个pod,在同一个node上,结果这个node宕机了,整个服务都不可用了。

确定优化目标

要提升系统的可用性,不是盲目的为每个服务、每个中间件去增加并联处理,而应该遵循一定的步骤:

  • 1、确定合适的可用性目标
    • 调研用户期望
    • 确定公司的商业目标(ToB产品至少99.9%以上)
    • 参考竞品规模及服务水平
  • 2、度量我们的系统
    常见的度量,确定指标,进行埋点和数据收集(如Proetheus),然后进行统计计算,统计结果:
    avg、max、min、dev(平均差(∑|x-x‘|)÷n )、长尾(95分位、99分位)

可用性结语

参考下图,指示了一个产品运营的三个阶段:
在这里插入图片描述
通过这张图,我想说:
再牛X的架构、中间件,都是逐步演化、一步步沉淀出来的,一开始大家都很人肉。。。

持续重构……

下一篇,介绍一下性能相关概念,以及如何发现性能问题的一些方法

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

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

相关文章

系列五、NotePad++下载安装

一、下载 链接:https://pan.baidu.com/s/1U2f74vfBJIds7W2wJYnBxg?pwdyyds 提取码:yyds 二、安装 2.1、安装NotePad 解压NotePad-x64.zip至指定目录即可,例如 2.2、安装NppFTP 2.2.1、查看NotePad对应的位数(32位or64位&a…

最强优化指令大全 | 【Linux技术专题】「系统性能调优实战」终极关注应用系统性能调优及原理剖析(下册)

Linux命令相关查看指标 CPU 指标 vmstat指令 vmstat -n m该命令用于每隔n秒采集系统的性能统计信息,共采集m次。 [rootsvr01]$ vmstat 1 3procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----r b swpd free buff cache …

行业榜单揭晓:项目管理软件排行榜中的行业翘楚!

在当今复杂的商业环境中,项目管理软件已经成为企业管理不可或缺的工具之一。它们帮助企业组织和协调各个部门的工作,并确保项目能够按时、按预算、按质量要求完成。这就是为什么许多公司都在积极寻找最好的项目管理软件。但是,市场上有许多项…

一个人也可以是【大厂】,三年程序员的生活规划心路分享!

自从工作之后,我就经常思考以下这些问题: 还有多久退休?明天可以退休吗?地球什么时候爆炸?我什么时候可以暴富辞职?我真的需要这份工作吗? 要问是从什么时候开始有这些问题的,大概…

探索嵌入式开发领域:单片机、ARM、Android底层的紧密联系

作为一个曾编写ARM教程和参与Android产品开发的专家,我发现单片机、ARM、嵌入式开发和Android底层开发之间存在紧密的联系。对于那些希望在嵌入式开发领域发展的人来说,了解这些领域的知识至关重要。为了帮助你更好地学习这些内容,我总结了一…

CGAL使用心得 转

CGAL使用心得 转 作者:李浩 首先我说说我研究CGAL的背景,由于,早一阵子,有一个需求,需要求出在一堆二维线中(包括直线和弧线),找出所有的最小区域和最大外包。如下图所示。 在这两…

Redis简介

Redis是基于内存,也可以基于磁盘持久化nosql数据库,使用c语言开发。 数据存储结构:key-value 安装环境准备 Redis使用c语言开发,需要使用gcc编译程序进行编译。 1) 安装gcc a) 从磁盘镜像中进行安装:&…

结合ace编辑器实现MapboxGL热力图样式在线配置

概述 MapboxGL热力图的配置参数并不多,但是有时候为了或得一个比较好用的热力图配置参数,我们不得不改代码再预览,显得尤为麻烦,为方便配置,实现实时预览,本文使用ace实现了一个热力图样式在线配置页面。 …

MapReduce分布式计算(二)

MapReduce工作流程 原始数据File 1T数据被切分成块存放在HDFS上,每一个块有128M大小 数据块Block hdfs上数据存储的一个单元,同一个文件中块的大小都是相同的 因为数据存储到HDFS上不可变,所以有可能块的数量和集群的计算能力不匹配 我们需要一个动态…

Java面试题3

[TOC]目录 1. spring事务 事务简介 事务在逻辑上是一组操作,要么执行,要不都不执行。主要是针对数据库而言的,比如说 MySQL。 为了保证事务是正确可靠的,在数据库进行写入或者更新操作时,就必须得表现出 ACID 的 4 …

ESP8266-NodeMCU搭建Arduino IDE开发环境

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、准备工作二、搭建步骤1.打开Arduino IDE 首选项2.打开Arduino IDE的“开发板管理器”3.在Arduino IDE的开发板菜单中找到“NodeMCU开发板”4.设置Arduino IDE的…

mongodb原理

一:MongoDB的优点和缺点 优点 面向文档存储(类JSON数据模式简单而强大)动态查询全索引支持,扩展到内部对象和内嵌数组查询记录分析快速,就地更新高效存储二进制大对象 (比如照片和视频)复制和故障切换支持Auto- Sharding自动分片支持云级扩展性MapReduce 支持复杂…