欢迎大家来到IT世界,在知识的湖畔探索吧!
CAP 定理(CAP theorem)又被称作布鲁尔定理(Brewer’s theorem),是加州大学伯克利分校的计算机科学家埃里克·布鲁尔(Eric Brewer)在2000 年的 ACM PODC 上提出的一个猜想。2002 年,麻省理工学院的赛斯·吉尔伯特(Seth Gilbert)和南希·林奇(Nancy Lynch)发表了布鲁尔猜想的证明,使之成为分布式计算领域公认的一个定理。
对此定理的解释有很多,我们挑选Robert Greiner的文章作为参考,看看他是怎么理解的:
In a distributed system (a collection of interconnected nodes that share data.), you can only have two out of the following three guarantees across a write/read pair: Consistency, Availability, and Partition Tolerance – one of them must be sacrificed.
简单翻译一下,即:
在一个分布式系统(指互相连接并共享数据的节点的集合)中,当涉及读写操作时,只能保证一致性(Consistence)、可用性(Availability)、分区容错性(Partition Tolerance)三者中的两个,另外一个必须被牺牲。
这里面诠释了CAP理论适用的场景,即在一个互相连接并共享数据的节点的集合中。如果是在单机环境中,或集群环境中的各节点不共享数据,则不符合CAP理论的场景。
虽然 CAP 理论定义是三个要素中只能取两个,但放到分布式环境下来思考,我们会发现必须选择 P(分区容忍)要素,因为网络本身无法做到 100% 可靠,有可能出故障,所以分区是一个必然的现象。如果我们选择了 CA 而放弃了 P,那么当发生分区现象时,为了保证 C,系统需要禁止写入,当有写入请求时,系统返回 error(例如,当前系统不允许写入),这又和 A 冲突了,因为 A 要求返回 no error 和 no timeout。因此,分布式系统理论上不可能选择 CA 架构,只能选择 CP 或者 AP 架构。
下面我们用两个例子来解释下CP架构和AP架构
1、CP架构
如下图,当node1发生异常时,node1的i的值为1,而因为node1发生了异常,导致node1和node2之间的复制通道断开,node2中i的值还为2,为了保证数据一致性,即使node2还是正常的,可以访问的,当client客户端调用node2时,node2还是得返回error。这种情况下,在node1发生异常时(Partition Tolerance),系统保证了数据一致性(Consistence),而违背了可用性(Availability)。
2、AP架构
如下图,当node1发生异常时,node1的i的值为1,而因为node1发生了异常,导致node1和node2之间的复制通道断开,node2中i的值还为2,为了保证可用性,即使node2未达到一致性,当client客户端调用node2时,node2还是会返回2。这种情况下,在node1发生异常时(Partition Tolerance),系统保证了可用性(Availability),而违背了数据一致性(Consistence)。注意:这里 N2 节点返回 2,虽然不是一个“正确”的结果,但是一个“合理”的结果,因为2是旧的数据,并不是一个错乱的值,只是不是最新的数据而已。
CAP理论在理解上还有如下要注意的点:
1、CAP关注的粒度是数据,而不是整个系统。
2、CAP理论是忽略网络延迟的,这就意味着,CAP 理论中的 C 在实践中是不可能完美实现的,在数据复制的过程中,节点 A 和节点 B 的数据并不一致。
3、正常运行情况下,不存在 CP 和 AP 的选择,可以同时满足CA。CAP 理论告诉我们分布式系统只能选择CP 或者 AP,但其实这里的前提是系统发生了“分区”现象。如果系统没有发生分区现象,也就是说 P 不存在的时候(节点间的网络连接一切正常),我们没有必要放弃 C 或者 A,应该 C 和 A 都可以保证,这就要求架构设计的时候既要考虑分区发生时选择 CP 还是 AP,也要考虑分区没有发生时如何保证 CA。
4、CAP理论适用场景方面,分布式系统有很多类型,有异构的,比如节点之间是上下游依赖的关系,有同构的,比如分区/分片型的、副本型的(主从、多主)。CAP定理的适用场景是副本型的这种。
5、CAP理论中一致性的概念,从强到弱,线性一致性、顺序一致性、因果一致性、单调一致性、最终一致性,CAP中的一致性应该是指线性一致性。
6、CAP与ACID的区别。ACID 中的 A(Atomicity)和 CAP 中的 A(Availability)意义完全不同,而 ACID 中的 C 和 CAP 中的 C 名称虽然都是一致性,但含义也完全不一样。ACID 中的 C 是指数据库的数据完整性,而 CAP 中的 C 是指分布式节点中的数据一致性。ACID 的应用场景是数据库事务,CAP 关注的是分布式系统数据读写。
7、CAP中的可用性,与我们常说的高可用的区别。比如HBase、MongoDB属于CP架构,Cassandra、CounchDB属于AP系统,能说后者比前者更高可用么?应该不是。CAP中的可用性,是指在某一次读操作中,即便发现不一致,也要返回响应,即在合理时间内返回合理响应。我们常说的高可用,是指部分实例挂了,能自动摘除,并由其它实例继续提供服务,关键是冗余。
8、哪些情况属于网络分区。网络故障造成的分区,属于。节点应用出现问题导致超时,属于。节点宕机或硬件故障,不属于。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/100708.html