CAP原理CAP原理,又称CAP定理,是指分布式系统中的Consistency、Availability和Partitiontolerance。一致性:所有分布式节点必须保证数据的一致性;可用性:集群中部分节点发生故障后,其余节点仍可提供相同的服务**[高可用性]**;分区容忍度:当网络出现问题时服务出现分区【整个系统某一部分挂掉或者宕机,不影响整个系统的运行和使用--个人观点];这三个概念介绍的是分布式系统中常见的常遇到的问题。一致性(C):分布式系统中的所有数据备份是否同时具有相同的值。(相当于所有节点访问同一份最新的数据副本)。可用性(A):分布式系统集群中部分节点发生故障后,集群是否还能正常响应客户端的读写请求。(数据更新的高可用性)。Partitiontolerance(P):大多数分布式系统分布在多个子网中,每个子网称为一个分区。分区容忍意味着间隔通信可能会失败。比如阿里巴巴的服务器(不知道大家有没有注意到,不管去哪个城市,访问的服务器都是那个城市的,算法用在里面,这里就不解释了由于篇幅有限,一一展示),一台服务器位于上海,另一台服务器位于北京。这是两个区,??可能会出现不能互通的情况。在分布式系统中,一般分区容错是不可避免的,因此可以认为CAP中的P总是成立的。CAP理论告诉我们C和A之间不可能两者兼顾。C-A不能同时满足的解释:如果C是第一个需求,会影响A的性能,因为需要数据同步,否则请求结果会有所不同,但数据同步会消耗时间,期间可用性会下降;如果A是第一个要求,只要有服务,就可以正常接受请求,但是不能保证返回结果。原因是在分布式部署的情况下,数据一致性的过程不能像切线那样快;官方解释1998年,加州大学计算机科学家EricBrewer提出了分布式系统的三个指标。ConsistencyAvailabilityPartitiontolerance的首字母分别为C、A、P。EricBrewer表示,这三个指标不能同时达到。这个结论被称为CAP定理。Partitiontolerance先看Partitiontolerance,中文叫“分区容错”。大多数分布式系统分布在多个子网络中。每个子网称为一个分区。分区容忍意味着间隔通信可能会失败。例如,如果一台服务器位于中国,另一台服务器位于美国,这是两个地区,它们之间可能无法通信。上图中,G1和G2是两个spanningserver。G1向G2发送消息,G2可能不会收到该消息。在设计系统时必须考虑到这种情况。一般来说分区容错是无法避免的,所以可以认为CAP的P总是成立的。CAP定理告诉我们剩下的C和A不能同时做。一致性===========================================================================================================================一致性在中文里叫做“一致性”。意思是写操作之后的读操作必须返回这个值。例如某条记录为v0,用户向G1发起写操作,将其变为v1。接下来,用户的读操作会得到v1。这称为一致性。2020-10-09-ppjNzM问题是用户可能发起了对G2的读操作,由于G2的值没有变化,所以返回了v0。G1和G2读操作结果不一致,不满足一致性。为了让G2也改成v1,需要在G1写的时候让G1发消息给G2,请求G2也改成v1。这种情况下,用户向G2发起读操作,也可以获得v1。可用性===============================================================================================================================Availability中文叫做“可用性”,意思是只要收到用户的请求,服务器必须给出响应。用户可以选择对G1或G2发起读操作。无论是哪个服务器,只要收到请求,就必须告诉用户是v0还是v1,否则可用性得不到满足。一致性和可用性的矛盾============================================================================================================================================================================一致性和可用性为什么不能同时成立呢?答案很简单,因为可能存在通信故障(即出现分区容错)。如果保证了G2的一致性,那么G1在写操作的时候就必须锁定G2的读写操作。只有数据同步后,才能重新开启读写。锁定期间,G2不能读也不能写,没有availabilityno。如果保证G2的可用性,则G2不能被锁定,因此一致性不成立。*综上所述,G2无法同时做到一致性和可用性。系统设计时只能选择一个目标。如果追求一致性,就不能保证所有节点的可用性;如果追求所有节点的可用性,就无法做到一致性。读者问,可用性在哪些方面胜过一致性?例如,当一个网页发布到CDN时,多个服务器都有该网页的副本。后来发现错误,需要更新网页。此时每台服务器只能更新一次。一般来说,网页的更新并不特别强调一致性。短时间内,有的用户会拿到旧版本,有的用户会拿到新版本,所以问题不会特别大。当然,大家最终还是会看到新版本的。因此,这种场合是可用性高于一致性。
