分布式系统CAP定理中的P原理解析

作者:啵啵肠 时间:2022-09-04 11:16:15 

引言

之前在看 CAP 定理时抱有很大的疑惑,CAP 定理的定义是指在分布式系统中三者只能满足其二,也就是存在分布式 CA 系统的。

在网络上查阅了很多关于 CAP 文章,虽然这些文章对于 P 的解释五花八门,但总结下来这些观点大多都是指 P 是不可缺少的,也就是说在分布式系统只能是 AP 或者 CP,这种理论与我之前所认识的理论(存在分布式 CA 系统)是冲突的,所以才有了疑惑。

这个定理起源于加州大学柏克莱分校(University of California, Berkeley)的计算机科学家埃里克·布鲁尔在 2000 年的分布式计算原理研讨会(PODC)上提出的一个猜想。 在 2002 年,麻省理工学院(MIT)的赛斯·吉尔伯特和南希·林奇发表了布鲁尔猜想的证明,使之成为一个定理。

什么是 CAP 定理(CAP theorem)

在理论计算机科学中,CAP 定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

  • 一致性(Consistency) (等同于所有节点访问同一份最新的数据副本)

  • 可用性(Availability)(每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据)

  • 分区容错性(Partition tolerance)(以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在 C 和 A 之间做出选择。)

分区容错性(Partition tolerance)

理解 CAP 理论的最简单方式是想象两个节点分处分区两侧。允许至少一个节点更新状态会导致数据不一致,即丧失了 C 性质。如果为了保证数据一致性,将分区一侧的节点设置为不可用,那么又丧失了 A 性质。除非两个节点可以互相通信,才能既保证 C 又保证 A,这又会导致丧失 P 性质。

  • P 指的是分区容错性,分区现象产生后需要容错,容错是指在 A 与 C 之间选择。如果分布式系统没有分区现象(没有出现不一致不可用情况) 本身就没有分区 ,既然没有分区则就更没有分区容错性 P。

  • 无论我设计的系统是 AP 还是 CP 系统如果没有出现不一致不可用。 则该系统就处于 CA 状态

  • P 的体现前提是得有分区情况存在

文章来源: * CAP 定理

几个常用的 CAP 框架对比

框架所属
EurekaAP
ZookeeperCP
ConsulCP

Eureka

Eureka 保证了可用性,实现最终一致性。

Eureka 所有节点都是平等的所有数据都是相同的,且 Eureka 可以相互交叉注册。 Eureka client 使用内置轮询负载均衡器去注册,有一个检测间隔时间,如果在一定时间内没有收到心跳,才会移除该节点注册信息;如果客户端发现当前 Eureka 不可用,会切换到其他的节点,如果所有的 Eureka 都跪了,Eureka client 会使用最后一次数据作为本地缓存;所以以上的每种设计都是他不具备一致性的特性。

注意:因为 EurekaAP 的特性和请求间隔同步机制,在服务更新时候一般会手动通过 Eureka 的 api 把当前服务状态设置为offline,并等待 2 个同步间隔后重新启动,这样就能保证服务更新节点对整体系统的影响

Zookeeper

强一致性

Zookeeper 在选举 leader 时会停止服务,只有成功选举 leader 成功后才能提供服务,选举时间较长;内部使用 paxos 选举投票机制,只有获取半数以上的投票才能成为 leader,否则重新投票,所以部署的时候最好集群节点不小于 3 的奇数个(但是谁能保证跪掉后节点也是奇数个呢);Zookeeper 健康检查一般是使用 tcp 长链接,在内部网络抖动时或者对应节点阻塞时候都会变成不可用,这里还是比较危险的;

Consul

和 Zookeeper 一样数据 CP

Consul 注册时候只有过半的节点都写入成功才认为注册成功;leader 挂掉时,重新选举期间整个 Consul 不可用,保证了强一致性但牺牲了可用性 有很多 blog 说 Consul 属于 ap,官方已经确认他为 CP 机制。

来源:https://juejin.cn/post/7195540736908443708

标签:分布式,CAP,P
0
投稿

猜你喜欢

  • Mysql5.6修改root密码教程

    2024-01-20 01:10:23
  • SQL 联合查询与XML解析实例详解

    2024-01-26 18:26:58
  • 详谈python3中用for循环删除列表中元素的坑

    2023-08-01 06:04:31
  • python实现神经网络感知器算法

    2021-03-06 11:23:39
  • JS使用百度地图API自动获取地址和经纬度操作示例

    2024-04-23 09:31:24
  • Python完成哈夫曼树编码过程及原理详解

    2023-10-16 03:09:39
  • 利用python实现平稳时间序列的建模方式

    2022-08-31 03:35:30
  • python实现在多维数组中挑选符合条件的全部元素

    2022-06-02 03:43:12
  • 文字的减法

    2007-11-06 12:58:00
  • 细化解析:SQL Server 2005 数据库镜像

    2009-01-23 13:41:00
  • SQL Server 日期相关资料详细介绍

    2012-07-11 16:14:07
  • Pytorch dataloader在加载最后一个batch时卡死的解决

    2022-09-15 06:50:34
  • Python中文字符串截取问题

    2021-08-15 23:55:20
  • Python中关于 *args与**args的用法及说明

    2022-04-01 08:24:38
  • PyTorch 中的 torch.utils.data 解析(推荐)

    2021-09-14 01:58:16
  • Python为何不能用可变对象作为默认参数的值

    2022-11-30 13:42:04
  • 在Python中执行cmd

    2022-05-20 07:24:50
  • python编程使用PyQt创建UE蓝图

    2023-11-20 14:24:58
  • PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)

    2022-04-27 23:51:16
  • python 实现一个简单的线性回归案例

    2023-05-08 23:40:25
  • asp之家 网络编程 m.aspxhome.com