分布式系统CAP理论
CAP简介
1998年提出了分布式系统的三个指标CAP(Consistency、Availablity、Partition-tolerance)其中:
Consistency
- 一致性
分布式系统所有数据备份在同一时刻
,必须是同样的
比如图床服务:后台是三台机器A、B、C 做支撑,上传一张图片,通过网关最终可能是A处理的,随后 马上请求这张图片,通过网关轮询算法,这个请求极有可能部落在A上了,那么他说:不管落在B、C哪个机器上,该图片必须存在并返回,否则,就不是一致性
如果就有多个分区要执行写操作,如果分布式存储系统分片
同步、或集群系统的主从
同步总会有个先后顺序,在这个先后顺序中,就产生了不一致的问题,这时候你:
- 要么接受同一个数据在各个存放点上同步过程中的
暂时
不一致。 - 要么你要
强一致性
,那么同步操作就会影响你的可用性
。
Availability
- 可用性
在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求,即使集群中的某个节点宕机了,依旧不影响你的任何请求。
Partition tolerance
- 分区容错性
如果集群中的机器被分成了两部分,这两部分不能互相通信,系统是否能继续正常工作
疑问分析
-
很多人说
一致性、可用性、分区容错性
,只能任意选择其中两个。简单看是没错,但是AC满足嘛?
-
百度百科原话
- CAP原则的精髓就是
要么AP,要么CP,要么AC
,但是不存在CAP
- CAP原则的精髓就是
-
AP、CP的使用
AP(Eureka) 选择可可用性
、CP(Zookeeper、HDFS)
都选择了一致性但是AC的模型不存在?如何做到不会通信失败呢?
-
官网理论原文
作者的意思是只能CP或者AP因为由于网络问题,将系统的成员隔离成了2个区域,互相无法知道对方的状态,这在分布式环境下是非常常见的.所以说只能从A和C中选一个.所以P必选。要建一个永远不发生多相关故障的网络,对于分布式系统来说是不切实际的。所以设计者必须在一致性(C)和可用性(A)之间做选择,
总结
在分布式环境下面,P是特定存在的,也就是只要我们有多台机器,那么网络隔离分区就一定不可避免,所以在设计系统的时候我们就要选择到底设计的是 AP系统还是 CP系统,但实际上,我们只要深入理解下CAP,就会发现其实有时候系统设计上面没必要这么纠结,主要表现在:
网络分区出现的概率虽然时常有发生但是我们可以通过感知心跳强行剔除下线,将流量平均分往其他节点,毕竟谁也不能保证网络百分百稳定,不出现网络分区。自然而然的没必要刻意A、C 中选一个,而是可以都做得不错。也就是百度百科说的AC系统
CAP 里面规定A是 100% 的可用性,但实际上,我们只需要提供 high availability,也就是像网关一样,全年不宕不可能,但是满足99.99%或者99.999%等几个9就可以了。