分布式系统关注点——初识「高可用」_weixin_33690963的博客-程序员宅基地

一、「高可用」的作用?

首先,统一下对「高可用」的认知。

做个通俗一点的类比:独生子女时代的子女就是“单体应用”,如果出意外了,父母就「失独」了,整个家族的传承就断了,“不可用”了。然而,二胎政策就是通过分布式(冗余)来降低出现这个问题的概率,从而提高“可用性”。

对于「高可用」,专业的解释是:

「高可用」指的是通过尽量缩短因日常维护操作(计划)和突发的系统崩溃(非计划)所导致的停机时间,以提高系统和应用的可用性。

—— 百度百科

简而言之,不管发生了什么(哪怕是地震、洪水了),能够让用户尽可能的无感知,依旧能正常使用系统,也就是越「高可用」的。

为什么在「数据一致性」后面就聊「高可用」呢?我的理解是,分布式系统的关键是做冗余,但是冗余的最大敌人却是「数据一致性」。我们通过冗余打破了原先的瓶颈,打开了一些新的通道。如,可以去争取更高的可用性、更高的性能等等。但是这其中,属「高可用」最重要。从上面引用中的解释也可以看到,要想尽可能的降低停机时间,单体应用的天花板总会更快的到来。就好比让一台电脑永远保持运行是困难的,期间总得更新几次操作系统、突然出现几次硬件故障,甚至机房的光纤被挖断了!那么这个时候就处于“不可用”状态。

也因此,我认为「高可用」的价值或者说意义,必定是在我们做分布式系统获得的其它好处之上的,比如「高性能」之类。因为,在一定范围内,所谓的「高性能」其实通过优化单体应用也有可能达到某个期望值,但是「高可用」则必然需要依赖分布式系统才能达到。

二、如何来衡量「高可用」

一般我们讲到最多的是用Service Level Agrement来衡量高可用指标,简称SLA。不过,其原意表示的是关于网络服务供应商和客户间的一份合同,其中定义了服务类型、服务质量和客户付款等术语,其中还包含除了「有效工作时间」之外的其它概念,如带宽、服务就绪时间(RFSD)、平均故障间隔时间(MTBF)、服务平均恢复时间(MTRS)、平均修理时间(MTTR)等。最初,SLA多用于电信运营商之类的基础设施所提供的服务中,商定用户可以享受什么样的等级什么样的带宽服务等等。

SLA完整的定义会复杂的多,在软件系统中主要是取了其中的「有效工作时间」部分。只要系统一直能够提供服务,我们就可以说系统的可用性是100%,但这只停留在理想中。如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可用性是99%。贴一张常见的表格图:

▲图片来源于网络,版权归原作者所有

如今,我们的生活越来越依赖于移动互联网的一些应用,假设支付宝挂了几个小时,这下好了,刷不了卡了、转不了帐了、信用卡也还不了了,慌不慌?

不过,相对的,还可以投机的理解为,只要我能保证系统在你使用它的时候是可用的,那么对外宣传也可以是「高可用」的。这也是在互联网普及之前,很多企业的内部C/S架构的信息系统得以正常使用的原因,比如银行会在非营业时间更新他们的系统,所以对于服务窗口的营业员来说,系统并没有不可用,因为那个时候我不需要用它。

三、做「高可用」的本质

做「高可用」用一句话来概括就是:

更快的发现故障,更快的隔离故障。

任何对这2点有帮助的工作就是我们要做的事情。

做任何事情都有主次之分,做高可用的“主”就是「负载均衡」。

之前的文章中提到过多次,分布式系统的关键是做冗余,那么让这些冗余能发挥「高可用」作用的就是「负载均衡」。所以,这是最基本的,也是迈向「高可用」的第一步,其它的措施都是建立在「负载均衡」之上的。

「负载均衡」的作用是一个“连接者”,让上下游之间以我期望的方式“连接”起来。所以,有必要先了解一下这些上下游的全貌,并且从中找到我们要做「负载均衡」的地方。

分布式系统有各式各样的架构方式,不过本质上都是上图这样的一个分层架构。图中红点标记出的地方就是我们需要做「负载均衡」的地方,可以看到,就是每两层之间的连接处。

这些连接处在实际做「负载均衡」的时候,需要结合所处的网络层次。因为在不同的网络层次有不同的做法。如下图。

一般主流的四层负载均衡和七层负载均衡,前者指的就是传输层,主要涉及的协议是TCP、UDP等,后者指的应用层,主要涉及的协议是Http、Https和FTP等。

用来实现「负载均衡」的解决方案有很多,分为基于硬件或者基于软件的,比较成熟的诸如:F5(支持四层、七层)、LVS(支持四层)、Nginx(支持七层)等等。

近些年,随着Service Mesh的兴起,随着涌现了一大批新一代的「负载均衡」解决方案,如Envoy、Istio、Linkerd、Ribbon等,有兴趣的小伙伴们可以自行研究下。

1、具有1-5工作经验的,面对目前流行的技术不知从何下手,

需要突破技术瓶颈的可以加。

2、在公司待久了,过得很安逸,

但跳槽时面试碰壁。

需要在短时间内进修、跳槽拿高薪的可以加。

3、如果没有工作经验,但基础非常扎实,对java工作机制,

常用设计思想,常用java开发框架掌握熟练的,可以加。

4、觉得自己很牛B,一般需求都能搞定。

但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。

  1. 群号:高级架构群 Java进阶群:180705916.备注好信息!送架构视频。

6.阿里Java高级大牛直播讲解知识点,分享知识,

多年工作经验的梳理和总结,带着大家全面、

科学地建立自己的技术体系和技术认知!


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33690963/article/details/91403527

智能推荐

mfc 窗口中嵌入窗口_丘上人的博客-程序员宅基地

1、 创建资源2、设置属性(1)style: Child(2)bounder:None3、添加如下代码:参考:http://blog.sina.com.cn/s/blog_86ec70170102vk0i.html

webpack4使用babel-loader8.x将ES6语法转换成ES5_Jedi Hongbin的博客-程序员宅基地

像async和await等ES6的高级语法在低版本浏览器中是不支持的,这种情况就需要用到babel-loader将ES6的语法转换成ES5的语法,安装babel-loaderhttps://webpack.js.org/loaders/babel-loader/#rootnpm install -D babel-loader @babel/core @babel/preset-env web...

Shell脚本执行FTP操作_ftp shell_怀抱月饼吃西瓜的博客-程序员宅基地

一、从本地上传单个文件到FTP#!/bin/bashPUTFILE=test.txtftp -i -v -n ftp_ip\ ftp_port<<EOFuser ftpusername ftppasswordbinarycd /testdirlcd ./promptput $PUTFILEbyEOFecho "up file end . . ."命令解析...

quota 详解_沉沦的博客-程序员宅基地

quota 详解操作系统:redhat 61.quota 说明.   quota 命令显示磁盘使用情况和限额.在redhat 6里面默认就支持.2.创建一个用户alex[[email protected] quota]# useradd alex[[email protected] quota]# passwd alex3.让文件系统支持quota.    现在用/dev/

Elasticsearch5.1.1 安装_weixin_33726318的博客-程序员宅基地

2019独角兽企业重金招聘Python工程师标准>>> ...

在windows10上使用docker哪些坑_王鹏的博客的博客-程序员宅基地

在开发环境使用docker已经有一段时间,虽然也遇到一些问题,但是总体来说对非常值得使用,大大简化了开发环境的建立和复制, 最近发现Docker发布了针对windows10和Mac的官方封装版本普大喜奔,终于不用boot2docker了,你要知道boot2docker是基于virtualbox的,virtualbox自己在我机器上崩溃了好多回,每次都得像大爷一样伺候着,祈祷它老人家长命百岁....

随便推点

tensorflow2.x学习笔记二十:损失函数之解析交叉熵_耐心的小黑的博客-程序员宅基地

SparseCategoricalCrossentropy类的使用:tf.keras.losses.SparseCategoricalCrossentropy( from_logits=False, reduction=losses_utils.ReductionV2.AUTO, name='sparse_categorical_crossentropy')参数解...

异常日志之异常处理_异常日志处理_另一只羊的博客-程序员宅基地

1、 【强制】不要捕获 Java 类库中定义的继承自 RuntimeException 的运行时异常类,如: IndexOutOfBoundsException / NullPointerException,这类异常由程序员预检查来规避,保证程序健壮性。正例:if(obj != null) {...}反例:try { obj.method() } catch(NullPointerExcep...

线性表的顺序静态存储--C语言实现__muauma_的博客-程序员宅基地

线性表的结构体定义了一个存放元素的定长数组,一个定义了线性表的长度。OperationsinitList listEmpty clearList listLength insertElem addElem deleteElem getElem locateElem printList#include<stdio.h>#define MAXSIZE 20...

Houdini17 OptiX Denoise使用_亦庄生的博客-程序员宅基地

Houdini17 OptiX Denoise使用NVIDIA Optx Denoiser第一步 下载安装第二步 启用第三步 打开面板中的按钮一句卧槽走天下!NVIDIA Optx DenoiserNVIDIA Optx Denoiser是一个后处理的算法,在Houdini17中可以被开启使用第一步 下载安装点击 Render/ Download NVIDIA OptiX Denoiser...

Bi-LSTM-CRF算法详解-1_饥渴的小苹果的博客-程序员宅基地

第1节 介绍1.介绍Bi-LSTM-CRF算法是目前最为流行的NER算法。BiLSTM和CRF可以看做NER模型中的两个不同层1.1 开始之前假设我们有一个数据集,其中有两种实体类别:Person和Organization。对于每一个类别又分为开始单词和中间单词,所以就有了5种类别。B-Person (Person的第一个单词)I- Person ...

推荐文章

热门文章

相关标签