在CAP理论中,C代表一致性,A代表可用性(在一定时间内,用户的请求都会得到应答),P代表分区容错。
这里分区容错到底是指数据上的多个备份还是说其它的 ? 我感觉分布式系统中,CAP理论应该是C和A存在不可同时满足, 既要保证高可用,又要保证强一致性,因为多个节点之间存在数据复制,所以要么保证强一致性,就不一定能在指定的时间内返回客户的请求, 要么保证高可用,但是各个节点的数据不一定是一致的。 但是和P有什么关系呢 ?
一个分布式系统里面,节点组成的网络本来应该是连通的。然而可能因为一些故障,使得有些节点之间不连通了,整个网络就分成了几块区域。数据就散布在了这些不连通的区域中。这就叫分区。
当你一个数据项只在一个节点中保存,那么分区出现后,和这个节点不连通的部分就访问不到这个数据了。这时分区就是无法容忍的。
提高分区容忍性的办法就是一个数据项复制到多个节点上,那么出现分区之后,这一数据项就可能分布到各个区里。容忍性就提高了。
然而,要把数据复制到多个节点,就会带来一致性的问题,就是多个节点上面的数据可能是不一致的。要保证一致,每次写操作就都要等待全部节点写成功,而这等待又会带来可用性的问题。
总的来说就是,数据存在的节点越多,分区容忍性越高,但要复制更新的数据就越多,一致性就越难保证。为了保证一致性,更新所有节点数据所需要的时间就越长,可用性就会降低。C:集群中所有机器状态是一致的。
A:客户端访问集群中任意一个节点,总能得到"处理成功"的结果
假设有五个节点:n1~n5 ,出现网络分区被分成两组:[n1~n2]和[n3~n5],那么当n1出来客户端请求时(为了处理这种情况,也就是说"容忍网络分区",即支持 P):
1:如果要保证C(一致性),那么它需要把消息复制到所有节点,但是网络分区导致无法成功复制到n3~n5,所以它只能返回"处理失败"的结果给客户端。(这时系统就处于不可用状态,即丧失了A)
2:如果要保证可用性A,那么n1就只能把消息复制到n2,而不用复制到n3~n5(或者无视复制失败/超时),但n3同时也可能在处理客户端请求(譬如对同一个值进行修改),n3也为了保证A而做了同样的处理。 那么 [n1~n2]和[n3~n5]的状态就不一致了,于是就丧失了 C。
那么如果不支持P(也就是不容忍网络分区),也就是说(很乐观的认为)假设系统不会出现网络分区C:集群中所有机器状态是一致的。
A:客户端访问集群中任意一个节点,总能得到"处理成功"的结果
假设有五个节点:n1~n5 ,出现网络分区被分成两组:[n1~n2]和[n3~n5],那么当n1出来客户端请求时(为了处理这种情况,也就是说"容忍网络分区",即支持 P):
1:如果要保证C(一致性),那么它需要把消息复制到所有节点,但是网络分区导致无法成功复制到n3~n5,所以它只能返回"处理失败"的结果给客户端。(这时系统就处于不可用状态,即丧失了A)
2:如果要保证可用性A,那么n1就只能把消息复制到n2,而不用复制到n3~n5(或者无视复制失败/超时),但n3同时也可能在处理客户端请求(譬如对同一个值进行修改),n3也为了保证A而做了同样的处理。 那么 [n1~n2]和[n3~n5]的状态就不一致了,于是就丧失了 C。
那么如果不支持P(也就是不容忍网络分区),也就是说(很乐观的认为)假设系统不会出现网络分区分区容错性P其实就是每个服务都会部署多个节点,这样就可以保证此服务的一个节点挂了之后,此服务的其他节点依然可以响应,这就是分区容错性。
但是一个服务有多个节点之后,一个服务的多个节点之间的数据为了保持一致性就要进行数据复制,在此过程中就会出现数据一致性C(强一致性)的问题。 (数据一致性包含强一致性,弱一致性,最终一致性,这里指的是强一致性)
如果一定要保持一致性C,可以不做分区,即每个服务都是单节点,这样就不用考虑数据一致性问题了,但是每个服务只有一个节点,此节点挂了,此服务就能不可用了,分区就不能容错了,那就不是高可用分布式系统了,所以一般分布式系统都必须满足分区容错性P。
在满足了分区容错性P后,想要满足一致性C,一个服务的多个节点之间就必须进行数据复制达到数据一致之后再返回给调用者响应,然而在多个节点数据复制的过程中,可能节点之间会出现网络等问题使得数据复制阻塞或失败导致响应超时,服务调用失败,这就失去了系统的可用性A。
如果不强制满足强一致性,那在服务被调用的时候不用管数据复制的问题,直接返回响应,这就满足了可用性,但是由于此服务的多个节点数据可能没有完成复制,节点数据可能不一致,这就失去了系统的一致性。
结论:一个高可用的分布式系统分区容错性P是一定要满足的,在此基础上,只能满足可用性A或者一致性C。
本文来自博客园,作者:孙龙-程序员,转载请注明原文链接:https://www.cnblogs.com/sunlong88/p/13180804.html