CAP 理论是一个被说烂了也听烂了的话题,但是还是选择花点时间做整理,做些横向拓展,加点自己的感受,认认真真讨论一下。
之前看阮一峰老师写的文章不错,我之前觉得总有点难懂,现在我觉得是有点问题
我觉得阮老师说的 Availability 理解不对,分布式和具体「哪台」没什么关系。Partition tolerance 的解释也没让我豁然开朗。
CAP 简介
1998 年,有个哥们提出了分布式系统的三个指标:
CAP (Consistency、Availablity 、Partition-tolerance ) 其中:
Consistency
- 一致性
这哥们说,分布式系统所有数据备份,在「同一时刻」,必须是「同样的」。
比如图床服务:后台是三台机器 A、B、C 做支撑,上传一张图片,通过网关最终可能是 A 处理的,随后「马上」请求这张图片,通过网关轮询算法,这个请求极有可能不落在 A 上了,那么他说:不管落在 B、C 哪个机器上,该图片必须存在并返回,否则,就不是『一致性』
如果就有多个分区要执行写操作,如果分布式存储系统「分片」同步、或集群系统的「主从」同步总会有个先后顺序,在这个先后顺序中,就产生了不一致的问题,这时候你:
- 要么接受同一个数据在各个存放点上同步过程中的「暂时」不一致。
- 要么你要「强一致性」,那么同步操作就会影响你的「可用性」。
常见的一致性的级别整理,想看的可以看看
Availability
- 可用性
这哥们说: 在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求,即使集群中的某个结点宕机了,依旧不影响你的任何请求。
这条非常好理解,就是字面意思
Partition tolerance
- 分区容忍性
这哥们说:如果集群中的机器被分成了两部分,这两部分不能互相通信,系统是否能继续正常工作
这个 CAP 中的 P 是最误导我的,以至于今天我对 CAP 依旧无法侃侃而谈,特此整理的原因。
我对「分区容忍性」的疑问
很多人说 “一致性,可用性,分区容忍性,只能任意选择其中两个”,乍一看是没错,但是 AC 满足吗?
普遍到「百度百科」原话也是这样写的:
代码语言:javascript复制CAP原则的精髓就是要么AP,要么CP,要么AC,但是不存在CAP。
我的疑问:保证了 AC,那么 P 就没办法保证, 试想:机器间不能通信,网络分区,如何保证数据的一致性?如何同步数据?
AP CP 我都能理解,平常工作中也都能看到影子:
比如 AP(Eureka)选择了可用性、 CP(Zookeeper、HDFS)都选择了一致性,但是 AC 的模型在哪里?如何做到不会通信失败呢?
有人说:CAP理论作者太教条!只要各地的分布式机器保持一个量级,且把无法通信的机器踢下去,那就是 CAP!
又有人说:那不行,如果网络抖动,你踢的太多,数据分片达不到要求也不行!
参考资料