Java面试笔试面经、Java技术每天学习一点

Java面试

关注不迷路

作者:pkwenda

来源:https://github.com/pkwenda/Blog/issues/28

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 满足吗?

普遍到「百度百科」原话也是这样写的:

CAP原则的精髓就是要么AP,要么CP,要么AC,但是不存在CAP。

我的疑问:保证了 AC,那么 P 就没办法保证,
试想:机器间不能通信,网络分区,如何保证数据的一致性?如何同步数据?

AP CP 我都能理解,平常工作中也都能看到影子:

比如 AP(Eureka)选择了可用性、 CP(Zookeeper、HDFS)都选择了一致性,但是 AC 的模型在哪里?如何做到不会通信失败呢?

有人说:CAP理论作者太教条!只要各地的分布式机器保持一个量级,且把无法通信的机器踢下去,那就是 CAP!

又有人说:那不行,如果网络抖动,你踢的太多,数据分片达不到要求也不行!

参考资料 ????

cloudera facebook原文(cloudera官网原文已失效)

参考上文翻译

作者的意思是,只能CP或者AP 因为由于网络问题,将系统的成员隔离成了2个区域,互相无法知道对方的状态,这在分布式环境下是非常常见的。所以说只能从C和A中选一个。所以 P 必选。要建一个永远不发生多相关故障的网络,对于分布式系统来说是不切实际的。所以设计者必须在一致性(C)和可用性(A)之间做选择。

当然以上都是教条的按照 CAP 理论进行的讨论,其实在现实中不需要如此纠结。

总结

在分布式环境下面,P 是铁定存在的,也就是只要我们有多台机器,那么网络隔离分区就一定不可避免,所以在设计系统的时候我们就要选择到底是设计的是 AP 系统还是 CP 系统,但实际上,我们只要深入理解下 CAP,就会发现其实有时候系统设计上面没必要这么纠结,主要表现在:

网络分区出现的概率虽然市场发生,但是我们可以感知心跳强行剔除下线,将流量平均分往其他节点,毕竟谁也不能保证网络百分百稳定,不出现网络分区。自然而然的没必要刻意 A、C 中选一个,而是可以都做得不错。也就是「百度百科」说的 AC 系统。

CAP 里面规定 A 是 100% 的可用性,但实际上,我们只需要提供 high availability,也就是像网关一样,全年不宕不可能,但是满足 99.99% 或者 99.999% 等几个 9 就可以了。

收获

对 CAP 的 P 又有了进一步的概念,有了一些新的理解,又看了下 Paxos,实在是比较复杂本来想也写写,但是理解的还不好怕写不好

下次再说。

参考资料

阮一峰老师:https://www.ruanyifeng.com/blog/2018/07/cap.html

cloudera cap :https://pt-br.facebook.com/notes/cloudera/cap-confusion-problems-with-partition-tolerance/385772907002/

cloudera cap 翻译:http://zzyongx.github.io/blogs/cap-confusion-problems-with-partition-tolerance.html

常见的一致性的级别:https://github.com/pkwenda/Blog/blob/master/snippets/consistency.md

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐