【温故而知新】分布式系统(二)

news2024/11/16 17:43:49

分布式系统的 CAP 理论

时间:2022年12月12日

作者:小蒋聊技术

【温故而知新】分布式系统(二)·分布式系统的 CAP 理论_小蒋聊技术_免费在线阅读收听下载 - 喜马拉雅手机版欢迎收听小蒋聊技术的其他类最新章节声音“【温故而知新】分布式系统(二)·分布式系统的 CAP 理论”。icon-default.png?t=M85Bhttps://m.ximalaya.com/sound/596020220?from=pc

前言

       大家好,欢迎来到小蒋聊技术。小蒋准备和大家一起聊聊技术的那些事。

       今天小蒋继续坚持“温故而知新”的落地实践,准备和大家聊一聊“分布式系统的 CAP 理论”。

小蒋个人认为,对于分布式系统的参与者来说,CAP 是必须要掌握的基础理论之一,CAP 理论可以帮助我们对系统设计中的目标进行取舍,合理地规划系统拆分的维度。

       CAP理论作为分布式系统的基石,小蒋将和大家一起来复习一遍。

分布式系统的特点

       既然CAP是分布式系统的基石,咱们得先来看看分布式系统,以及分布式系统它的特点。

       分布式系统是多个服务器通过网络互联而构建的松耦合系统,其具备以下特点:

  1. 分布式:分布式由多台计算机组成,在地域上是独立分散的,可以分散在一个单位,一个城市,一个国家,或是全球范围内。整个系统的统一功能是分散在多个节点上实现的,因而分布式系统具有数据处理的分布式特性。
  2. 自治性:分布式系统各个节点包含自己独有的cpu和内存,具备独立的处理数据能力。一般来说每个节点是对等的,没有主次之分,可以自治的进行任务处理,还可以通过网络传输信息,协同完成任务处理。
  3. 并行性:一个大的任务可以按规则划分到多个计算节点上进行独立的子任务支持,体现了并行性。
  4. 全局性:分布式系统必须存在一个单一的,全局的通信机制,使得任何一个进程都能和其他进程通信,并且不区分本地通信和远程通信。在一个分布式集群中,往往所有机器具有统一的系统调用能力。

        在不同的抽象层次上来说,分布式系统中每一个物理机,虚拟机,docker镜像,等等,独立进程都可以认为是一个节点。

        分布式系统的核心理念是让多台服务器协同工作,完成单台服务器无法处理的任务,尤其是高并发或者大数据量的任务。除了对可扩展性的需求,分布式系统还有不出现单点故障、提供服务或者存储无状态等特点。

  • 单点故障(Single Point Failure):是指在系统中某个组件一旦失效,这会让整个系统无法工作。而不出现单点故障,这意味着单点不影响整体,就是分布式系统的设计目标之一;
  • 无状态(Stateless):是因为无状态的服务才能满足部分机器宕机不影响全部,可以随时进行扩展的需求。 由于分布式系统的特点,在分布式环境中更容易出现问题,比如节点之间通信失败、网络分区问题、多个副本的数据不一致问题等,为了更好地在分布式系统下进行开发,学者们提出了一系列的理论,其中具有代表性的就是 CAP 理论。

2000年7月,加州大学伯克利分校的Eric Brewer(埃里克 布鲁尔)教授在ACM PODC(分布式计算原理会议)会议上提出CAP猜想。2年后,也就是2002年,麻省理工学院的Seth Gilbert(赛斯 吉尔伯特)和Nancy Lynch(南希 林奇)从理论上证明了CAP。之后,CAP理论正式成为分布式计算领域的公认定理。

CAP理论概述

维基百科地址:https://zh.wikipedia.org/wiki/CAP%E5%AE%9A%E7%90%86

        一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。

一·Consistency 一致性

        一致性指“all nodes see the same data at the same time”,即所有节点在同一时间的数据完全一致。

        一致性是因为多个数据拷贝下并发读写才有的问题,因此理解时一定要注意结合考虑多个数据拷贝下并发读写的场景。

        对于一致性,可以分为从客户端和服务端两个不同的视角分析。

  • 客户端

        从客户端来看,一致性主要指的是多并发访问时更新过的数据如何获取的问题。

  • 服务端

        从服务端来看,则是更新如何分布到整个系统,以保证数据最终一致。

        对于一致性,可以分为强/弱/最终一致性三类。

        从客户端角度,多进程并发访问时,更新过的数据在不同进程如何获取的不同策略,决定了不同的一致性。

  • 强一致性

        对于关系型数据库,要求更新过的数据能被后续的访问都能看到,这是强一致性。

  • 弱一致性

        如果能容忍后续的部分或者全部访问不到,则是弱一致性。

  • 最终一致性

        如果经过一段时间后要求能访问到更新后的数据,则是最终一致性。

二·Availability 可用性

        可用性指“Reads and writes always succeed”,即服务在正常响应时间内一直可用。

        好的可用性主要是指系统能够很好的为用户服务,不出现用户操作失败或者访问超时等用户体验不好的情况。可用性通常情况下和分布式数据冗余,负载均衡等有着很大的关联。

        我们可以看到一些IT公司对外宣传,系统稳定性已经做到 3 个 9、4 个 9,即 99.9%、99.99%,这里的 N 个 9 就是对可用性的一个描述,叫做 SLA,即服务水平协议。

        比如说月度 99.95% 的 SLA,则意味着每个月服务出现故障的时间只能占总时间的 0.05%,如果这个月是 30 天,那么就是 21.6 分钟。

三·Partition Tolerance分区容错性

        分区容错性指“the system continues to operate despite arbitrary message loss or failure of part of the system”,即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性或可用性的服务。

        在分布式系统中根据其特点,P其实是确定的,CAP 的应用模型就是 CP 架构和 AP 架构。分布式系统所关注的,就是在 Partition Tolerance 的前提下,如何实现更好的 A 和更稳定的 C。

CAP 理论的证明

        CAP 理论的证明有多种方式,通过反证的方式小蒋个人认为是比较直观的。反证法来证明 CAP 定理,最早是由 Lynch (林奇)提出的,通过一个实际场景,如果 CAP 三者可同时满足,由于允许 P 的存在,则一定存在 Server 之间的丢包,如此则不能保证 C。

        首先构造一个单机系统,如上图,Client A 可以发送指令到 Server 并且设置更新 X 的值,Client 1 从 Server 读取该值,在单点情况下,即没有网络分区的情况下,通过简单的事务机制,可以保证 Client 1 读到的始终是最新值,不存在一致性的问题。

        我们在系统中增加一组节点,因为允许分区容错,Write 操作可能在 Server 1 上成功,在 Server 2 上失败,这时候对于 Client 1 和 Client 2,就会读取到不一致的值,出现不一致的情况。如果要保持 X 值的一致性,Write 操作必须同时失败, 也就是降低系统的可用性。 可以看到,在分布式系统中,无法同时满足 CAP 定律中的“一致性”“可用性”和“分区容错性”三者。 在该证明中,对 CAP 的定义进行了更明确的声明:

  • Consistency,一致性,被称为原子对象,任何的读写都应该看起来是“原子”的,或串行的,写后面的读一定能读到前面写的内容,所有的读写请求都好像被全局排序;
  • Availability,可用性,对任何非失败节点都应该在有限时间内给出请求的回应(请求的可终止性);
  • Partition Tolerance,分区容错性,允许节点之间丢失任意多的消息,当网络分区发生时,节点之间的消息可能会完全丢失。

CAP 理论的应用

        CAP 理论提醒我们,在架构设计中,不要把精力浪费在如何设计能满足三者的完美分布式系统上,而要合理进行取舍,CAP 理论类似数学上的不可能三角,只能三者选其二,不能全部获得。

         不同业务对于一致性的要求是不同的。举个例来讲,在微博上发表评论和点赞,用户对不一致是不敏感的,可以容忍相对较长时间的不一致,只要做好本地的交互,并不会影响用户体验;

        而我们在电商购物时,产品价格数据则是要求强一致性的,如果商家更改价格不能实时生效,则会对交易成功率有非常大的影响。

         需要注意的是,CAP 理论中是忽略网络延迟的,也就是当事务提交时,节点间的数据复制一定是需要花费时间的。即使是同一个机房,从节点 A 复制到节点 B,由于现实中网络不是实时的,所以总会有一定的时间不一致。

总结

        在通常的分布式系统中,为了保证数据的高可用,通常会将数据保留多个副本(Replica),网络分区是既成的现实,于是只能在可用性和一致性两者间做出选择。CAP 理论关注的是在绝对情况下,在工程上,可用性和一致性并不是完全对立的,我们关注的往往是如何在保持相对一致性的前提下,提高系统的可用性。 业务上对一致性的要求会直接反映在系统设计中,典型的就是 CP 和 AP 架构的取舍。

  • CP 架构:对于 CP 来说,放弃可用性,追求一致性和分区容错性。

        我们熟悉的 ZooKeeper,就是采用了 CP 模式,ZooKeeper 是一个分布式的服务框架,主要用来解决分布式集群中应用系统的协调和一致性问题。其核心算法是 ZAB(ZooKeeper Atomic Broadcast),它是是为ZooKeeper设计的一种支持崩溃恢复的原子广播协议,所有设计都是为了一致性。

        在 CAP 模型中,ZooKeeper 是 CP,这意味着面对网络分区时,为了保持一致性,它是不可用的。

  • AP 架构:对于 AP 来说,放弃强一致性,追求分区容错性和可用性,这是很多分布式系统设计时的选择,后面的 Base 也是根据 AP 来扩展的。

        和 ZooKeeper 相对的是 Eureka,Eureka 是 Spring Cloud 微服务技术栈中的服务发现组件,Eureka 的各个节点都是平等的,几个节点挂掉不影响正常节点的工作,剩余的节点依然可以提供注册和查询服务,只要有一台 Eureka 还在,就能保证注册服务可用,只不过查到的信息可能不是最新的版本,不保证一致性。

      

        以上,就是今天小蒋要跟大家分享的全部内容。

        年龄的增长不可怕,可怕的是从未成长!

        感谢大家支持小蒋,小蒋希望和大家共同成长,谢谢。

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

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

相关文章

漏洞深度分析|Thinkphp 多语言 RCE

项目介绍 ThinkPHP 是一个快速、简单的面向对象的轻量级 PHP 开发框架,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。 根据目前FOFA系统最新数据(一年内数据)&#xf…

基于昇思MindSpore,实现使用胶囊网络的图像描述生成算法

项目链接 https://github.com/Liu-Yuanqiu/acn_mindspore 项目描述 图像描述生成算法 人类可以轻易的使用语言来描述所看到的场景,但是计算机却很难做到,图像描述生成任务的目的就是教会计算机如何描述所看到的内容,其中涉及到了对视觉信…

JavaOOP面试题(108道)

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:Java面试题…

mybatis以及mybatisplus批量插入问题

1. 思路分析: 批量插入是我们日常开放经常会使用到的场景,一般情况下我们也会有两种方案进行实施,如下所示。 方案一 就是用 for 循环循环插入: 优点:JDBC 中的 PreparedStatement 有预编译功能,预编译之…

vue3较vue不同的地方

自定义指令的区别: vue2的写法: Vue.directive(scroll, {}) //scroll是指令名称 vue3的写法: 定义全局的:在main.js文件中定义: createApp(App).directive("hello",{}).use(store).use(router).mount(#…

小程序import及include引用的简单理解

场景:在小程序中,WXML 提供两种文件引用方式import和include 我自己记录下自己的一些简单理解 官方文档:引用 | 微信开放文档 第一:import import,就是可以引入自定义指定的template模板 比如:我在import页…

stm32f767之ADC

一,基本介绍 1,ADC时钟。 ADC时钟一般常用来自于经可编程预分频器分频的APB2 时钟,该预分频器允许ADC 在fPCLK2/2、 /4、/6 或/8 下工作。ADCCLK 的最大值限制。2,ADC通道。 有16 条复用通道。我的理解是每个ADC(1&…

气泡水位计安装示意图 气泡水位计工作原理

气泡式水位计测量精度高,免气瓶,免测井,免维护,抗振动,寿命长,特别适用于流动水体、大中小河流等水深比较大的场合。具有安装简单,操作、组网灵活,尤其是无井水位测量最理想的水位监…

城市燃气系统安全解决方案

汽车制造业 MES系统 DNC系统 生产 安全域1 管理层 工控安全隔离装置 交换机 安全配置核查系统 HMI 历史数据库 运行监控系统 实时数据库 打印机过程 安全域2 监控层 工控漏洞扫描系统 安全交换机 工控安全审计系统 工控入侵检测系统工程师站 A 操作员站 A 实时数据库A 操作员站…

[附源码]Python计算机毕业设计SSM基于的冠状病毒疫情防控资讯交流推荐网站(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

stream_open函数分析

在讲 stream_open() 函数之前,需要先了解 stream_open() 里面使用到的一些基本的数据结构。如下: 第一个数据结构是 struct VideoState ,VideoState 可以说是播放器的全局管理器。字段非常多,时钟,队列,解…

Android 11 的状态栏的隐藏

概述 Android 11 的状态栏与导航栏较之前的版本有较大的差异, 在Android 7.0 SystemUI 状态/导航栏的隐藏与显示中所描述的部分内容已不再适用. 比如, 自动隐藏的时间, 隐藏的动画, 较之前的版本已面目全非, 本文将对隐藏状态栏部分的内容进行一些补充. APP如何隐藏状态栏 参…

Yield Guild Games 成功举办首届 SubDAO 峰会

Yield Guild Games(YGG)于 2022 年 11 月 18 日在菲律宾马尼拉举行了第一届 SubDAO 峰会。 SubDAO 峰会与菲律宾 Web3 狂欢节两个活动同时举行,为 YGG 的区域 SubDAO 提供了在 Web3 应用中心——菲律宾进行面对面交流的机会。此次活动旨在传达…

运维开发实践 - helm

1. helm介绍 helm 是一个用于管理部署在kubernetes上的应用的工具 使用要求:一个Kubernetes集群 2.下载安装 Helm Github Download Helm Huawei Source 按照自己的操作系统版本下载相应的helm压缩包 并将helm添加到环境变量中; # 检查是否安装成功 helm version…

read_thread解复用线程分析

read_thread() 线程的主要作用从 MP4 里面读取 AVPacket,然后丢进去 PacketQueue 队列。所以需要先学习一下 strcut PacketQueue 跟 struct MyAVPacketList 数据结构。如下: typedef struct MyAVPacketList {AVPacket *pkt;int serial; } MyAVPacketLis…

html文件里怎么引用vue组件?

这里我们使用 http-vue-loader 来实现&#xff1a;https://www.npmjs.com/package/http-vue-loader Load .vue files directly from your html/js. No node.js environment, no build step. 我做了个demo如下&#xff1a; html文件里面写下面的代码 <!DOCTYPE html> &l…

计算机研究生就业方向之当老师(中小学)

我一直跟学生们说你考计算机的研究生之前一定要想好你想干什么&#xff0c;如果你只是转码&#xff0c;那么你不一定要考研&#xff0c;至少以下几个职位研究生是没有啥优势的&#xff1a; 1&#xff0c;软件测试工程师&#xff08;培训一下就行&#xff09; 2&#xff0c;前…

股票购买接口系统怎么使用vn.py进行量化策略?

一般情况下&#xff0c;股票购买接口系统主要是可以运用在股票量化交易系统开发的一个大方向&#xff0c;也就是说&#xff0c;股票购买接口系统是根据这些量化的特点来开发的&#xff0c;就比如使用vn.py进行量化策略&#xff0c;在这方面&#xff0c;对交易者进行量化分析也起…

Web前端105天-day-41-JSCORE

JSCORE01 目录 前言 一、声明提升 二、宿主 window 三、断点功能 四、匿名函数解决全局污染 五、作用域链 六、闭包 七、私有 八、arguments 九、函数重载 十、方括号属性语法 十一、重载练习 十二、this 总结 前言 JSCORE01学习开始 一、声明提升 报错方案: 让…

走进SpringCloud微服务

微服务概述一、注册中心&#xff1a;Eureka ⭐⭐⭐1.1 原理1.2 代码二、负载均衡&#xff1a;Ribbon ⭐三、远程调用&#xff1a;Feigh ⭐⭐⭐3.1 原理3.2 代码四、熔断限流&#xff1a;Hystrix ⭐⭐⭐4.1线程池策略4.2 信号量隔离策略4.3 方法降级4.4 断路器、熔断器五、网关&…