前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【趣学程序·每周三面】 - 分布式系统 CAP 理论

【趣学程序·每周三面】 - 分布式系统 CAP 理论

作者头像
趣学程序-shaofeer
发布2020-05-18 15:15:25
3650
发布2020-05-18 15:15:25
举报
文章被收录于专栏:upuptop的专栏upuptop的专栏

趣学程序

关注不迷路

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

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

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 趣学程序 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • CAP 简介
    • Consistency
      • Availability
        • Partition tolerance
          • 我对「分区容忍性」的疑问
        • 总结
        • 收获
        • 参考资料
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档