分布式系统原理-CAP定理,说起来一句话,实际坑不少

 分布式系统原理系列目录

网络分区时,线性一致性与可用性的矛盾

考虑一个一主一从的存储系统,主从通过网络同步数据,从节点也提供读服务

由于网络异常的可能性必然存在,一旦发生上图中的这种网络分区情况(分区不一定是指网线/网卡/交换机问题,持续丢包、连接中断、网络拥塞这些都算,因为这些问题将⽹络两端的节点孤⽴开来,这就是所谓的“⽹络分区”现象)master上的数据没法同步到slave

  1. 如果我们希望系统保证强一致性(就是读取操作可以读到最新写入成功的数据),那就不能让Slave的提供读服务,也就是要牺牲掉Slave的可用性
  2. 如果我们希望系统高可用,那些连接到slave的节点,就读不到最新写入成功的数据,就没法保证强一致性

也就是说,如果发生了网络分区,我们想要线性一致性,就没法保证可用性;想要可用性,就没法保证线性一致性。这就是CAP定理

CAP理论

如下图,C代表一致性、A代表可用性,P代表分区容忍性,这三个性最多只能保证两个。 因为在分布式系统中分区是必然发生的,所以P其实并不是一个可选项,所以P必须要,然后在AC中二选一,我们经常看到的AP架构就是选了A的,CP架构就是选了C

CAP定理说起来就是一句话的事情哦,但是里面其实有不少值得注意的点

CAP是加州⼤学伯克利分校的计算机科学家埃⾥克·布鲁尔(Eric Brewer)在2000年提出的⼀个猜想,一开始只是个猜想。后来在2002年,麻省理⼯学院有两个研究员联合发表了CAP猜想的证明,之后CAP就成为了分布式计算领域的⼀个定理

布鲁尔在提出CAP猜想的时候,并没有给出Consistency、Availability、Partition Tolerance三个单词的明确定义,所以解释CAP的文章非常多,在这些解释CAP定理的文章中,Robert Greiner(罗伯特·格雷纳)的文章比较有参考意义,他个人对CAP的理解也不是一步到位的哦,也是经历了一个过程,它先后写了两篇文章来阐述CAP理论,第一篇被他标记为过时(而很多文章参考的就是第一篇)。第二篇文章做了很多修正

CAP的讨论范围

首先是CAP定理的讨论范围,范围很重要,脱离了这个范围再谈CAP那就是耍流氓了:

  • 一个互相连接并共享数据的节点集合(分布式系统不一定会互联和共享数据,比如memcache集群,它就不是CAP讨论的对象;而mysql集群就是CAP讨论的对象)
  • CAP关注的是对数据的读写操作,而不是所有功能

C/A/P的定义

一致性Consistency:站在客户端角度看到的一致性,读操作保证能返回最新的写操作结果,对应我们前面说的一致性级别,就是不太严格的强一致性

可用性Availability:系统可以在合理的时间内返回用户合理的结果,不能超时、不能出错、结果正确。这里的描述不是定量的,我们也不用过多纠结,可以简单理解为系统可以正常提供服务

分区容忍性Partition Tolerance:它的定义是当网络分区出现后,系统能够继续履行职责。你会发现这说的不就是可用性吗?很多资料解释来解释去也都还是可用性的意思,迷惑性挺强。其实分区压根就不是一个可选项,不管咋样,它都会发生,所以这里是很有误导性的。我们就不要过多纠结他的定义了。就这样理解,一旦发生分区,强一致性和可用性只能二选一

CAP的价值?

虽然CAP的知名度很高,但如果去思考CAP的价值的话,好像跟他的知名度并不是很匹配:

一个是它有一定的误导性:上面说的分区容忍性,它并不是一个可选项

指导意义不大:CAP定理你看完之后就会感觉哎好像挺有道理哦,但实际对分布式系统的设计并没有太多实际指导意义,怎么说呢?首先他只考虑了一个强一致性模型,实际上很少有系统会需要使用强一致性;然后它只讨论了一种网络故障,既网络分区,网络延迟,宕机这些问题他都没有讨论

它并没有讨论关于权衡的事情,看起来就是要让人做选择题,要A还是要C你看着办吧,但其实我们不想做选择题,现实场景也往往比做选择题要复杂得多。他会让人认为一致性和可用性都是01的问题,但其实一致性和可用性都是0~100的问题

我们之前说过,一致性还分了很多级别,我们不一定非要强⼀致,虽然强一致用起来很爽,但代价也很高,实际上使用强⼀致的系统非常少。而且大部分系统不用线性⼀致性的原因还不一定是为了高可用而是为了更好的性能。因为可用性问题只会在网络分区的时候才有,但性能问题一直存在,强一致性始终都很慢

可用性也是,我们不一定非要百分百可用,可以先搞他个49的可用性

基于这个一致性和可用性权衡的思路呢,就引出了BASE理论,请看

分布式系统原理-BASE,可用性高于强一致性_wb_snail的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值