何为CAP
引用百度来的解释:
CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。
下面根据我的理解来逐个分析一下。
一致性(Consistency)
何为一致性在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)。
换个说法就是不管在哪里读取到的数据都是一样的。
一致性的场景很多,很常见,举个例子:
现在有一个client 提交了数据到DB,并且成功了,那么后续从DB去查询已经提交的数据,肯定是可以正常查询到。
同样的,client提交了数据到缓存系统,并且成功了,那么后续从缓存查询数据肯定也能正常查询到。
那么假设有这样的一个场景,client提交了数据到BD,但是client就不从DB查询提交了的数据,就是要从缓存取,毕竟缓存就应该干这个事儿,但是在这个系统里面 BD和缓存没有直接的交互,那么就出现了问题,提交了的数据在DB和缓存就存在了出入。(当然这个是一个放大了的问题,在实际的开发和架构设计中会有缓存和DB同步的机制,但是延时还是有可能会有的)。这样的问题就是一致性问题,其实一致性问题出现的情况还是比较多的。比如例子中的缓存和DB的一致性、集群中各个节点之间的一致性、主从DB之间的一致性等。
可用性(Availability)
在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
换个说法就是无论从请求哪个节点,最终都能及时得到一个结果(无论是不是当前状态应该有的最新的数据,可能存在节点间数据不一致,但是只要获取到就算是获取到了结果),而并非是获取错误。还是可以看之前的图 无论从BD还是缓存都能正常获取到数据。
分区容错性 (Partition tolerance)
以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
分区可以理解为网络隔离了或者说节点之间存在一定的网络问题,然后在这样的情况下系统能正常运行,正常获取到正确的数据。
为什么不能三者兼顾
既然是定理肯定是经过证明了的,至于很严谨的证明可能是通过数学来证明的,这个没有去求证过,但是可以从实际的应用环境下大概推测出一些原因。
在实际的开发环境或者生产环境中,首先有一点很明确,网络永远可能存在问题,无论是延时,还是直接网络不通,甚至是交换机或者路由器直接断电了,所以说,网络永远是一个隐患,也就是说一定会存在分区容错,或者说永远要考虑到分区容错性。
简单的想,要保持分区容错,那么就需要在分区的每一个节点都要有一样的数据备份,这样任何一个节点出错都能有备用的可以支持,不考虑极端的所有节点都不可用这样的情况的话,就会存在另外的问题 就是一致性,数据在进行同步的时候总会有一定的延时,可能节点越多延时越长。在保证数据一致的时候又回存在一个问题,在进行数据的每一个节点的同步的时候,需要防止在同步的同时进行的数据修改,这个时候是不是也就需要一个类似GC操作的时候 stop the word
,如字面意思,这个时候系统是不能对外提供一个正常的服务的,也就是说这个时候可用性可能就会存在问题。所以其实理解起来CAP中的三个特性,其实有一种相互影响的关系在里面。
如何权衡
个人理解的系统和架构的设计肯定是为了解决某一种或者多种业务场景。
所以在其中权衡的时候也应该以业务实际需求出发,是否可以容忍查询数据存在一定的延时,是否能容忍可能存在的系统响应效率,这都需要根据实际情况看。只能说定理证明了系统中总会存在某一方面的缺陷或者不足。
那么怎么尽量减少缺陷带来的问题可能会比想方设法设计一个完美的系统要明智的多。