分布式理论协议与算法 第一弹 CAP理论

news2024/11/18 21:40:39

CAP 理论,也被称为 CAP 协议,指的是在一个分布式系统中,最多只能同时满足「一致性(Consistency)」、「可用性(Availability)」和「分区容错性(Partition tolerance)」这三项中的两项,不可能三者兼顾。

本篇内容主要包括:CAP 理论相关概念概述、CAP 理论的证明、CAP 的权衡取舍


文章目录

    • 一、CAP 理论相关概念概述
        • 1、CAP 理论
        • 2、一致性(Consistency)
        • 3、可用性(Availability)
        • 4、分区容错性(Partition tolerance)
    • 二、CAP 理论的证明
        • 1、CAP 理论的证明-基本场景
        • 2、CAP 理论的证明-正常运转
        • 3、CAP 理论的证明-出现异常
    • 三、CAP 的权衡取舍
        • 1、CAP 的权衡取舍
        • 2、ACID 理论
        • 3、BASE 理论


一、CAP 理论相关概念概述

1、CAP 理论

CAP 理论,也被称为 CAP 协议,指的是在一个分布式系统中,最多只能同时满足「一致性(Consistency)」、「可用性(Availability)」和「分区容错性(Partition tolerance)」这三项中的两项,不可能三者兼顾。

image-20221226192538664

2、一致性(Consistency)

在 CAP 理论中,一致性(Consistency)通常指的是:“All nodes see the same data at the same time”,即 “所有节点在同一时间的数据完全一致”。Ps:一致性问题是多个数据拷贝并发读写场景下才有的问题,因此理解时一定要注意结合考虑多个数据拷贝下并发读写的场景。

对于一致性模型划分,可以分为从「读写角度」、「客户中心-数据中心」角度进行一致性模型划分:

# 读写角度一致性划分

读写角度一致性划分,是 Werner Vogels(亚马逊 CTO)提出的基于读写响应的一致性分类,其将一致性划分强一致性、弱一致性、最终一致性。其中最终一致性是弱一致性的一种特殊情况,表示系统最终将达成一致:

  • 强一致性(Strong Consistency):系统保证某个被更新的数据在后续的读操作中都可读到更新后的新值。为达到强一致性,存储同一份数据的多个副本上的操作必须同步进行。也就是说:在执行一次更新操作时系统必须被阻塞,所有的副本在操作完成前都需被锁定;
  • 弱一致性(Weak Consistency):系统不强制要求某个被更新的数据在后续读操作中都可读到更新后的新值,即允许在更新后的一段时间内才读到新值。这里将从该数据开始更新到后续读取操作读到该数据的最新值的这段延时称为 “不一致性窗口(inconsistency window)”;
  • 最终一致性(Eventual Consistency):系统保证对某个后续不再更新的数据在一次更新后能在有限的时间内最终读取到该数据的最新值。大多数NoSQL数据库都基于最终一致性模型构建,如Redis、MongoDB等。

# 客户中心-数据中心角度,客户中心一致性划分

以客户为中心的一致性模型从用户角度出发,它将整个系统看做一个黑盒进行交互。该模型仅保证单一用户对存储数据的访问一致性。该模型并不保证不同用户的并发操作的一致性。以客户为中心的一致性模型分类可分为:单调读一致性(Monotonic Read Consistency)、单调写一致性(Monotonic Writes Consistency)、读已之所写一致性(Read Your Writes Consistency)以及 读后写一致性(Write Follows Read Consistency)。Ps:每种分类的详细内容以后介绍!

# 客户中心-数据中心角度,数据中心一致性划分

以数据为中心的一致性从服务端出发,关注副本间的同步过程及副本上操作的执行顺序。该模型考虑到并发(多个副本可能同时被更新)情景的存在并提供该种情景下的一致性模型。以数据为中心的一致性模型分类如下:弱一致性(Weak Consistency)、最终一致性(Eventual Consistency)、因果一致性(Causal Consistency)以及 顺序一致性(Sequential Consistency)。Ps:每种分类的详细内容以后介绍!

3、可用性(Availability)

在 CAP 理论中,可用性(Availability)通常指的是:“Reads and writes always succeed”,即 “服务在正常响应时间内一直可用”。好的可用性主要是指系统能够很好的为用户服务,不出现用户操作失败或者访问超时等用户体验不好的情况。可用性通常情况下可用性和分布式数据冗余,负载均衡等有着很大的关联。

4、分区容错性(Partition tolerance)

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

网络分区解释:比如现在有两台服务器(服务器A、服务器B),二者之间是存在通信的,但是突然间,由于位置原因,二者之间的网络链接中断,导致原本在同一个网络的「服务器A」与「服务器B」发生了网络分区,变成了「服务器A」所在的「A网络」和「服务器A」所在的「B网络」。

而所谓的分区容忍性,就是说一个数据服务的多台服务器在发生了上述情况(网络分区)的时候,依然能继续提供服务!


二、CAP 理论的证明

1、CAP 理论的证明-基本场景

接下来是对 CAP 理论的证明,下面是一个分布式系统的基本场景:网络中有两个节点 Node1 和 Node2(可以简单的理解 Node1 和 Node2 分别是两台计算机),二者之间网络可以连通,Node1 中有一个「应用程序A」和一个「数据库A」,Node2 也有一个「应用程序B」和一个「数据库B」。现在,「应用程序A」和「应用程序B」是分布式系统的两个部分,「数据库A」和「数据库B」是分布式系统的数据存储的两个子数据库。

image-20221226202949654

  • 在满足一致性的情况下:Node1 和 Node2 中的数据是一样的,V0=V0。
  • 在满足可用性的情况下:用户不管是请求 Node1 或者 Node2,都会得到立即响应。
  • 在满足分区容错性的情况下:Node1 和 Node2 有任何一方宕机,或者网络不通的时候,都不会影响Node1和Node2彼此之间的正常运作。

2、CAP 理论的证明-正常运转

下图是分布式系统正常运转的流程,用户向 Node1 机器请求数据更新,程序 A 更新数据库 V0 为 V1,分布式系统将数据进行同步操作 M,将V1 同步到 Node2 中 V0,使得 Node2 中的数据 V0 也更新为 V1,Node2 中的数据再响应 Node2 的请求。

image-20221226203913896

这里,可以定义 Node1 和 Node2 的数据库 V 之间的数据是否一样为一致性;外部对 Node1 和 Node2 的请求响应为可用性;Node1 和 Node2之间的网络环境为分区容错性。

3、CAP 理论的证明-出现异常

这是正常运作的场景,也是理想的场景,然而现实是残酷的,当错误发生的时候,一致性和可用性还有分区容错性,是否能同时满足,还是说要进行取舍呢?

作为一个分布式系统,它和单机系统的最大区别,就在于网络,现在假设一种极端情况,Node1 和 Node2之间的网络断开了,我们要支持这种网络异常,相当于要满足分区容错性,能不能同时满足一致性和响应性呢?还是说要对他们进行取舍。

image-20221226204314196

假设在 Node1 和 Node2 之间网络断开的时候,有用户向 Node1 发送数据更新请求,那 Node1 中的数据 V0 将被更新为 V1,由于网络是断开的,所以分布式系统同步操作 M,所以 Node2 中的数据依旧是 V0;这个时候,有用户向 Node2 发送数据读取请求,由于数据还没有进行同步,应用程序没办法立即给用户返回最新的数据 V1,怎么办呢?

有二种选择:

  • 第一,牺牲数据一致性,响应旧的数据 V0 给用户;
  • 第二,牺牲可用性,阻塞等待,直到网络连接恢复,数据更新操作 M 完成之后,再给用户响应最新的数据 V1。

这个过程,证明了要满足分区容错性的分布式系统,只能在一致性和可用性两者中,选择其中一个。


三、CAP 的权衡取舍

1、CAP 的权衡取舍

通过 CAP 理论,我们知道无法同时满足一致性、可用性和分区容错性这三个特性,那要舍弃哪个呢?

  • CA without P:如果不要求 P(不允许分区),则 C(强一致性)和 A(可用性)是可以保证的。但其实分区不是你想不想的问题,而是始终会存在,因此 CA 的系统更多的是允许分区后各子系统依然保持 CA。
  • CP without A:如果不要求 A(可用),相当于每个请求都需要在 Server 之间强一致,而 P(分区)会导致同步时间无限延长,如此CP 也是可以保证的。很多传统的数据库分布式事务都属于这种模式。
  • AP wihtout C:要高可用并允许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。现在众多的 NoSQL 都属于此类。

对于多数大型互联网应用的场景,主机众多、部署分散,而且现在的集群规模越来越大,所以节点故障、网络故障是常态,而且要保证服务可用性达到 N 个 9,即保证 P 和 A,舍弃C(退而求其次保证最终一致性)。虽然某些地方会影响客户体验,但没达到造成用户流程的严重程度。

对于涉及到钱财这样不能有一丝让步的场景,C 必须保证。网络发生故障宁可停止服务,这是保证 CA,舍弃 P。貌似这几年国内银行业发生了不下 10 起事故,但影响面不大,报道也不多,广大群众知道的少。还有一种是保证 CP,舍弃 A。例如网络故障事只读不写。

2、ACID 理论

ACID 可以理解为 ACID 最重要的含义,就是 Atomicity 和 Isolation ,即强制一致性,要么全做要么不做,所有用户看到的数据一致。强调数据的可靠性, 一致性和可用性。

ACID 为 Atomicity、Consistency、Isolation and Durability,其中 ACID 分别表示为:

  • 原子性(Atomicity):事务中的操作要么都做,要么都不做;
  • 一致性(Consistency):系统必须始终处在强一致状态下;
  • 隔离性(Isolation):一个事务的执行不能被其他事务所干扰;
  • 持续性(Durability):一个已提交的事务对数据库中数据的改变是永久性的。

保证 ACID 是传统关系型数据库中事务管理的重要任务,几种事务类型为:未提交读、可提交读、可重复读、可序列化。

3、BASE 理论

BASE 理论是由 eBay 架构师提出的。BASE 是对 CAP 中一致性和可用性权衡的结果,其来源于对大规模互联网分布式系统实践的总结,是基于 CAP 定律逐步演化而来。其核心思想是即使无法做到强一致性,但每个应用都可以根据自身业务特点,才用适当的方式来使系统打到最终一致性。

BASE 理论 是 Basically Available(基本可用),Soft State(软状态)和 Eventually Consistent(最终一致性)三个短语的缩写。

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

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

相关文章

Vue3 中组合式下的侦听器

目录前言:前置代码:创建侦听器停止侦听器watch侦听:对象中的某一个属性变化(需要提供getter函数才行)watch侦听:整个对象watch侦听:如果嵌套属性发生改变,默认是无法执行回调函数的?watch侦听:…

【实战与杂谈】如何复活一个开源网站-游戏王卡片生成器

1. 杂谈 作为一名十多年游戏王玩家,学生时代玩的是PSP和PS2上的游戏,到毕业后使用YGOPRO同步新卡片进行联网对战,再到现在约到线下进行实体卡片游戏。有些卡片价格太贵,因此我们对于这些卡在未购买之前都会自己打印出来暂时游玩…

sec5-属性

1 属性 GObject系统提供属性。属性是由实例保存的值,实例是GObject的后代,它们对其他实例开放。可以通过他们的名字访问他们。 例如,GtkWindow具有"title"、“default-width”、"default-height"等属性。字符串"t…

正经科普:DDos高防ip详解

白衬衫容易发黄, 一般洗衣液很难洗掉, 不少人为此感到头疼, 不妨在洗的时候吃点头痛药。 这边我也不多废话,大家直接看图,高防ip原理如下清洗能力 DDoS高防IP采用BGP链路对接全国各地30家运营商,总防御能力超4T。采用电信云堤近源…

智能优化算法:人工兔优化算法-附代码

智能优化算法:人工兔优化算法 摘要:人工兔优化算法( [Artificial rabbits optimization,RSO)是 Liying Wang等 于 2022 年提出的一种新型元启发式优化算法 。 该算法受来源于自然界中兔子的生存策略的启发,具有寻优能力强&#x…

【2.1】服务拆分--案例Demo

服务拆分--案例Demo服务拆分注意事项:导入服务拆分Demo测试结果:总结知识内容来自于黑马程序员视频教学和百度百科。博主仅作笔记整理便于回顾学习。如有侵权请私信我。 服务拆分注意事项: 比如现在有一个需求,是查询订单&#x…

国产GPU芯片突破重围,迎来新发展,中国崛起的力量

最近,在GPU芯片领域我们终于迎来新进展,有望突破欧美企业垄断,实现完全国产化。高端GPU芯片对科技发展有着重要作用,广泛应用于云上服务、高密度高性能计算等领域,然而绝大部分GPU芯片市场都被英伟达、AMD、微软等国外…

骨传导耳挂式耳机排名前十名,最好的骨传导耳机推荐

挂耳式的骨传导耳机在佩戴时更舒适以及更加牢固,日常在多种场景使用都能完全兼顾。但是最好的骨传导耳机有哪些呢?还不知道如何选择骨传导耳机,可以看看这五款骨传导耳机~ 1、南卡Runner Pro4骨传导蓝牙耳机 ¥1498 选择骨传导耳机…

Kubernetes那点事儿——控制器Deployment

K8s应用程序生命周期管理——控制器Deployment一、部署应用程序流程二、Deployment控制器1、应用升级、弹性伸缩、回滚、删除2、滚动升级、回滚机制3、定义Deployment前言说到K8s程序的生命周期管理我们不得不提到k8s的控制器。其中Deployment是最为常用的controllers&#xff…

Liga妙谈 | 如何快速甄别、高效响应用户反馈?

敏捷开发说要「拥抱变化」,在充满不确定的环境中,唯一不变的正是变化。面对源源不断的市场反馈和需求变更,敏捷团队应该如何平衡「高效迭代」与「响应用户」的关系,既快又好地完成研发任务,交付业务价值? …

FFmpeg 滤镜详解

FFmpeg Filter 1. 概念介绍 在多媒体处理中,术语滤镜(filter)指的是修改未编码的原始音视频数据帧的一种软件工具。 2. 基本原理 ● 在编码前,ffmpeg可以对raw(真实/原)音频和视频使用libavfilter库中的滤镜进行处理。(非压缩…

骨感传导蓝牙耳机怎么样、骨感传导蓝牙耳机有什么特点

在正文开始前,先跟大家说明一下,骨感传导其实就是我们常说的骨传导,两者是相同的意思,只是表达的文字不太一样。我们可以理解为骨感传导耳机骨传导耳机,那既然是这样,骨传导耳机又是利用什么原理传播声音的…

CentOS搭建web服务器,并内网穿透实现公网访问

在web项目中,部署的web站点需要被外部访问,则需要一个媒介,通过把资源放在这个媒介中,再通过所暴露的端口指向这个站点,当外部访问这个媒介所对应的端口时,媒介指向站点,完成访问,像这种类似的媒介,常用的有tomcat容器、Apache等,这边使用Apache来建搭建。 Apache2 是一种流行…

一节摹课丨做会动的电子贺卡,当懂浪漫的成年人

你正在阅读摹客全新内容栏目【一节摹课】。 本栏目会通过一些有趣的、实用的、好看的、新潮的实操案例,分享摹客“设计12”产品矩阵 —— 「1个协作平台2款设计工具」的具体操作妙计! 带大家一步一步地解锁摹客协作、摹客RP、摹客DT中的大小功能。 一…

非正式全面解析 NebulaGraph 中 Session 管理

NebulaGraph 论坛最近有些讨论帖,各种姿势来问 NebulaGraph Session 管理相关的事情,我寻思这也不是一个法子,还是来写一篇文章来讲述下 NebulaGraph 中的 Session 管理。由于本文设定为非正式的 Session 讲解,所以本文主要分为理…

智能车|直流电机、编码器与驱动器---编码器

智能车|直流电机、编码器与驱动器---编码器编码器编码器简介编码器的工作原理四倍频采集编码器采集程序实现编码器 编码器简介 编码器是一种将角位移或者直线位移转换成一连串电数字脉冲的一种传感器。 可以通过编码器测量电机转动的位移或者速度信息。 编码器按照工作原理…

FTP多目录和多用户配置(用户隔离/虚拟目录)

FTP多目录和多用户配置(用户隔离/虚拟目录) 假设有四个部门分别是user1、user2、user3、admin。要求四个部门都有各自有独立的访问目录,且admin部门可以访问其他部门的文件但不能对其进行修改。 1、创建ftp文件→再创建LocalUser(…

【图像处理OpenCV(C++版)】——3.1几何变换之仿射变换

前言: 😊😊😊欢迎来到本博客😊😊😊 🌟🌟🌟 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义,适用于平时学习、工作快…

CSS 颜色

文章目录CSS 颜色关键字 & 十六进制 & RGBopacity 透明度RGBA 颜色CSS3 渐变线性渐变径向渐变CSS 颜色 关键字 & 十六进制 & RGB W3C十六色 opacity 透明度 语法 opacity: 数值;说明 在CSS3中,我们可以使用opacity属性来定义元素的透明度。 o…

excel排序求和:如何统计前几名数据合计 下篇

上次咱们说到一个公式SUM(LARGE(B:B,ROW(INDIRECT("1:"&H2)))),其中的ROW(INDIRECT("1:"&H2))这部分如果写成ROW(1:H2)就会报错: 原因也告诉大家了,就是ROW函数的参数只能使用单元格或单元格区域。 因此解决的办…