分布式之什么是CAP定理

[版权申明] 非商业目的注明出处可自由转载
出自:shusheng007

概述

前段时间看到微服务注册中心的如何选择问题,在比较 Netflix eurekaApache zookeeper的时候,总是有人提到CAP定理。很久以前就听说过这个定理,但是当时没有去认真去理解它,这次认真研究了一下,作为笔记简单记录一下。

历史

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

定义

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

  • 一致性(Consistency)

所有节点访问同一份最新的数据副本

  • 可用性(Availability)

每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据

  • 分区容错性(Partition tolerance)

分布式系统出现网络分区的时候,仍然能够对外提供服务。

如何理解

首先要明白这个理论是针对分布式系统的,如果你就一个服务且部署在一台机器上就根本涉及不到上面那三条,因为你的数据一定是一致的,如果应用不挂且网络不挂你的服务就一直可用的,任何一个挂了就直接不可用了,还有根本不可能涉及分区的概念。

就是因为分布式的存在才需要讨论上面那三个概念。假如我们有两服务,S1部署在北京机房,S2部署在天津机房。

一致性

S1的数据改变了,它就需要通过网络同步给S2,使两边的数据保持一直。S2数据改变同理

可用性

S1突然挂了,那么S2还可以继续提供服务,所以整个服务仍然是可用的(部分可用),S2同理。

分区容错

假设廊坊突然要修地铁,蓝翔一小伙一铲子下去把连接两个机房的光缆挖断了,这下有好戏看了。S1完全联系不到S2了,这就发生了分区,因为以前大家互相之间可以通信,可以看做是一个整体,现在互相之间无法通信,就都各自成了孤岛。此时系统设计者就面临一个抉择:是保一致性(PC),还是保可用性(PA)。为什么会这样呢?

如果你要保一致性,那么可用性就得被舍弃,反之亦然。

因为只是连接北京和天津这两个机房的光缆被挖断了,其他地方的用户仍然可以正常访问这两个机房的服务。假设S1是一个负责取钱的服务,而S2是一个负责结算的服务。如果王二狗能访问S1取出200万来,就要出事,因为S2根本不知道这回事,不进行扣款,二狗儿子学区房首付有了!也有可能S2无故扣了二狗200万,二狗瞬间加入了丐帮。这就是保可用性的代价,数据一致性被丢弃了,对于这种要求数据强一致性的场景,就要放弃可用性了,就是说一旦发生了分区,整个服务就不对外提供服务了。此时最好提示:“对不起,俺们服务正在升级,请24小时候再试。”其实就是不能用了,这也是银行的系统为什么总升级。但是有些场景对数据一致性要求较低,但对服务的可用性要求较高时保可用性,牺牲一致性。

总结

理论这玩意比较玄乎,还需要我们在实践中不断体会。一般认为当发生分区时,Eureka保A弃C,而ZooKeeper保C弃A。那么哪个更好呢?没有什么东西是最好的,需要看具体的使用场景了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShuSheng007

亲爱的猿猿,难道你又要白嫖?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值