CAP原理详解「建议收藏」

文章目录一、CAP原理介绍对CAP原理的一些常见的理解误区二、CAP原理简单证明三、CAP原理在各个系统的应用四、总结一、CAP原理介绍先简单介绍一下CAP原理是什么:C:Consistency即一致性,访问所有的节点得到的数据应该是一样的。注意,这里的一致性指的是强一致性,也就是数据更新完,访问任何节点看到的数据完全一致,要和弱一致性,最终一致性区分开来。A:Availability…

大家好,又见面了,我是你们的朋友全栈君。

一、CAP原理介绍

先简单介绍一下CAP原理是什么:

C:Consistency

即一致性,访问所有的节点得到的数据应该是一样的。注意,这里的一致性指的是强一致性,也就是数据更新完,访问任何节点看到的数据完全一致,要和弱一致性,最终一致性区分开来。

A:Availability

即可用性,所有的节点都保持高可用性。注意,这里的高可用还包括不能出现延迟,比如如果节点B由于等待数据同步而阻塞请求,那么节点B就不满足高可用性。

也就是说,任何没有发生故障的服务必须在有限的时间内返回合理的结果集。

P:Partiton tolerance

即分区容忍性,这里的分区是指网络意义上的分区。由于网络是不可靠的,所有节点之间很可能出现无法通讯的情况,在节点不能通信时,要保证系统可以继续正常服务。

以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择

CAP原理说,一个数据分布式系统不可能同时满足C和A和P这3个条件。所以系统架构师在设计系统时,不要将精力浪费在如何设计能满足三者的完美分布式系统,而是应该进行取舍。由于网络的不可靠性质,大多数开源的分布式系统都会实现P,也就是分区容忍性,之后在C和A中做抉择。

对CAP原理的一些常见的理解误区

看到网上很多文章说CAP原理是分布式系统的基石,但是CAP原理其实是对分布式数据存储系统的一个定论。我们假设一个分布式系统各个节点都读写同一个mysql实例,那么对于这个分布式系统来说,讨论CAP原理是没有意义的。因为各个节点之间可以不用因为数据复制而进行通信,满足分区容忍性(P),可以随时响应请求,满足可用性(A),同时因为访问的是一个数据库实例,本身已经保证了数据一致性(C)。

因此,在讨论CAP原理的时候,更多的是针对那些有数据存储、数据复制场景的分布式存储系统,也就是我们熟悉的NoSql数据库。

由于我们大多数人都不会去设计一款新的NoSql数据库来使用,更多的是使用现成的NoSql开源系统进行数据的存储,比如Hbase、MongoDB、Cassandra等。所以大多数时候,其实我们都用不上CAP原理。

虽然用不上,但是了解一下还是没有坏处的。下面简单证明一下CAP

二、CAP原理简单证明

假设有节点data1和节点data2,一开始有个数据number=1。之后向data1提交更新,将数据number设置为2。

接着data1就需要将更新推送给data2,让data2也更新number数据。

接下来我们分3个场景分析

1. 在保证C和P的情况下

为了保证数据一致性,data1需要将数据复制给data2,即data1和data2需要进行通信。但是由于网络是不可靠的,我们系统有保证了分区容忍性,也就是说这个系统是可以容忍网络的不可靠的。这时候data2就不一定能及时的收到data1的数据复制消息,当有请求向data2访问number数据时,为了保证数据的一致性,data2只能阻塞等待数据真正同步完成后再返回,这时候就没办法保证高可用性了。

所以,在保证C和P的情况下,是无法同时保证A的。

2. 在保证A和P的情况下

为了保证高可用性,data1和data2都有在有限时间内返回。同样由于网络的不可靠,在有限时间内,data2有可能还没收到data1发来的数据更新消息,这时候返回给客户端的可能是旧的数据,和访问data1的数据是不一致的,也就是违法了C。

也就是说,在保证A和P的情况下,是无法同时保证C的。

3. 在保证A和C的情况下

如果要保证高可用和一致性,只有在网络情况良好且可靠的情况下才能实现。这样data1才能立即将更新消息发送给data2。但是我们都知道网络是不可靠的,是会存在丢包的情况的。所以要满足即时可靠更新,只有将data1和data2放到一个区内才可以,也就丧失了P这个保证。其实这时候整个系统也不能算是一个分布式系统了。

理解CAP理论的最简单方式是想象两个节点分处分区两侧。允许至少一个节点更新状态会导致数据不一致,即丧失了C性质。如果为了保证数据一致性,将分区一侧的节点设置为不可用,那么又丧失了A性质。除非两个节点可以互相通信,才能既保证C又保证A,这又会导致丧失P性质。

三、CAP原理在各个系统的应用

在这里插入图片描述

四、总结

关于CAP原理,还需要特别注意的一点是,虽然说我们设计系统时不能同时保证拥有三点。但是也并不是说,保证了其中2点后,就要完全抛弃另外一点。只是相对的要做一些牺牲。比如在保证CP的情况下,虽然没办法保证高可用性,但这不意味着可用性为0,我们可以通过合理的设计尽量的提高可用性,让可用性尽可能的接近100%。同理,在AP的情况下,也可以尽量的保证数据的一致性,或者实现弱一致性,即最终一致性。

个人认为,对于大数据的研发人员,CAP原理还是有必要理解的。理解了CAP原理后,再去看一些开源的NoSql实现原理也会比较好理解一些。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/124629.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Qt 之等待提示框(QMovie)

    Qt 之等待提示框(QMovie)简述关于gif的使用在实际项目中我用的并不多,因为我感觉瑕疵挺多的,很多时候锯齿比较严重,当然与图存在很大的关系。关于生成gif的方法可以提供一个网站preloaders,基本是可以满足需求的。简述效果源码更多参考效果由于录制程序的原因,引起gif效果不清晰,可忽略。源码通过使用QMovie来设置动画、可以调用setSpeed()设置动画速度、start()启动动画、stop()停止动画等。Q

  • java xml 中文乱码_java写xml中文乱码解决方法

    java xml 中文乱码_java写xml中文乱码解决方法用java写xml文件,发现写完后xml文件的中文就变成了乱码。解决办法:把xml文件的头部编码改为utf-8,StreamResult编码方式也改为utf-8,StreamResult类充当转换结果的持有者,可以为XML、纯文本、HTML或某些其他格式的标记。publicStringcreateXMLbyId(){Coursec=courseService.getCou…

  • 带通滤波器作用和用途_什么是带通滤波器?工作原理及原理图详解

    带通滤波器作用和用途_什么是带通滤波器?工作原理及原理图详解带通滤波器(band-passfilter)是一个允许特定频段的波通过同时屏蔽其他频段的设备。比如RLC振荡回路就是一个模拟带通滤波器。带通滤波器是指能通过某一频率范围内的频率分量、但将其他范围的频率分量衰减到极低水平的滤波器,与带阻滤波器的概念相对。一个模拟带通滤波器的例子是电阻-电感-电容电路(RLCcircuit)。这些滤波器也可以用低通滤波器同高通滤波器组合来产生。一个理想的带通滤…

  • linux下的rar命令,Linux下的压缩解压命令「建议收藏」

    linux下的rar命令,Linux下的压缩解压命令「建议收藏」1.Linuxzip命令压缩zip-rfilename.zip./*//将当前目录下的所有文件和文件夹全部压缩成filename.zip文件-r表示递归压缩子目录下所有文件解压unzip-dtestfilename.zip//把filename.zip文件解压到./test-d:-dtest指明将文件解压缩到….

  • 防止网站被挂马_网站被挂马的原因

    防止网站被挂马_网站被挂马的原因今天遇到一个很奇怪的挂马问题,查关键词,查数据库等常规方法都没有找到原因,debug断点都放在了程序执行代码最前面还是输出挂马内容,用php探针发现也有代码,所以确认了是iis全局的问题,所以查加载查组件,最终经过比对是iis被黑添加了模块,被添加的名称很具有迷惑性,通常伪装的很像系统模块,遇到查不到是什么地方挂马,可以放一个探针来判断下是不是iis问题。»转载请保留出处:豫章小站…

  • 以太坊钱包erc20_xvg币智能合约

    以太坊钱包erc20_xvg币智能合约以太坊被称为区块链2.0,就是因为以太坊在应用层提供了虚拟机,使得开发者可以基于它自定义逻辑,通常被称为智能合约,合约中的公共接口可以作为区块链中的普通交易执行。本文就智能合约发代币流程作一完整介绍(

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号