【分布式系统】CAP定理是什么?

目录

分布式系统CAP理论概述

分布式系统

分布式系统CAP中的"C"

一致性 (Consistency)

分布式系统CAP中的"A"

可用性 (Availability)

分布式系统CAP中的"P"

分区容错性 (Partition tolerance)

CAP定理证明

总结

CA without P

CP without A

AP wihtout C


分布式系统的CAP定理与分布式事务的ACID,不是同一个概念,切勿混为一谈。本文的重心是在分布式系统的CAP定理上。

 

分布式系统CAP理论概述

 

CAP定理是分布系统中的一个基本定理,它指出任何分布系统最多可以具有以下三个属性中的两个。

  • 一致性 (Consistency)
  • 可用性 (Availability)
  • 分区容错性 (Partition tolerance)

 

CAP定理指出分布式系统不能同时满足 一致性、可用性、分区容错性这是为什么,一致性(Consistency),可用性 (Availability),分区容错性 (Partition tolerance)又到底是什么含义呢,进一步说什么是分布式系统呢。

 

分布式系统

 

我们假设有一个非常简单的分布式系统,它由两台服务器S1和S2组成;这两台服务器都存储了同一个变量v,v的初始值为v0;S1和S2互相之间能够通信,并且也能与外部的客户端通信;我们的分布式系统的架构图如下图所示:

 

客户端可以向任何服务器发出读写请求。服务器当接收到请求之后,将根据请求执行一些业务计算,然后把请求结果返回给客户端。

 

发起写请求的过程如下图所示:

 

发起读请求的过程如下图所示:

 

简单的分布式系统模型已经搭建完毕,接下来我们通过这个模型来分析下CAP定理中关于一致性、可用性、和分区容错性的具体含义。

 

分布式系统CAP中的"C"

 

一致性 (Consistency)

 

Gilbert 和 Lynch 在论文中的描述是:

any read operation that begins after a write operation completes must return that value, or the result of a later write operation.

一致性要求在一个写操作完成之后的任何读操作都必须返回该值或者以后进行写操作的结果。在满足一致性的分布式系统中,客户端发起一个写请求到分布式系统的任何一台服务器中,然后再向该分布式系统中其他服务器发起读请求查询该变量对应的值,都会返回上次更新的最新结果。

下图以一个不一致的分布式系统为例:

 

当客户端向分布式系统中S1服务器发送写请求(write V1),得到成功返回响应后,再向分布式系统中S2服务器 发送读请求读取该变量的值,分布式系统中S2服务器还是返回旧值 V0。可以看到返回的数据和期望的数据不同,此时分布式系统存在一致性问题。

下图以一个一致的分布式系统为例:

 

当客户端向分布式系统中S1服务器发送写请求(write V1),S1服务器正常写入后,同时把V的数据同步发送给S2服务器,S2服务器保证数据成功写入后,返回状态给S1服务器,S1服务器收到S2服务器发送的写入成功后,返回给客户端写入成功,客户端从S2服务器上面读取V值,S2服务器返回V1,与预期结果相同,此时分布式系统保证了数据一致性问题。

  

分布式系统CAP中的"A"

 

可用性 (Availability)

 

Gilbert 和 Lynch 在论文中的描述是:

every request received by a non-failing node in the system must result in a response.

 

在一个可用的分布式系统中,客户端向其中一个服务器发起一个请求且该服务器未崩溃,那么这个服务器最终必须响应客户端的请求。

对于一个可用性的分布式系统,每一个非故障的节点必须对每一个请求作出响应。所以,一般我们在衡量一个系统的可用性的时候,都是通过停机时间来计算的。

 

可用性分类可用水平(%)年可容忍停机时间
容错可用性99.999932秒
极高可用性99.9995分15秒
具有故障自动恢复能力的可用性99.9952分34秒
高可用性99.98小时46分
商品可用性993天15小时36分

 

通常我们描述一个系统的可用性时,其度量方式,是根据系统损害、无法使用的时间,以及由无法运作恢复到可运作状况的时间,与系统总运作时间的比较。计算公式为:

 

A(可用性),MTBF(平均故障间隔),MDT(平均修复时间)

在线系统和执行关键任务的系统通常要求其可用性要达到5个9标准(99.999%)。

 

分布式系统CAP中的"P"

 

分区容错性 (Partition tolerance)

 

Gilbert 和 Lynch 在论文中的描述是:

the network will be allowed to lose arbitrarily many messages sent from one node to another.

 

即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。

 

如下图表示:

 

S1服务器与S2服务器网络断开连接,但是分布式系统要满足分区容错性,正常的对外部提供服务。

 

CAP定理证明

 

上文我们已经了解了一致性、可用性和分区容错性的概念,现在我们来证明一个分布式系统不能同时满足这三种属性。

假如要同时满足三个属性,我们先产生一个网络分区问题,如下图所示:

 

我们让S1 与 S2 之间的网络断开,产生网络分区问题,这时客户端给S1服务器发送更新请求,把V值从V0更新到V1,S1服务器接收到请求进行更新操作,更新完毕后把数据同步到S2服务器,但是S1,S2服务器网络断开,无法进行数据传递,因为分布式系统要满足可用性,必须返回给客户端请求。这时S2的服务器数据就是旧的。

 

 

这时客户端发送读取请求发送给S2,这时因为S2的数据是旧的,还要满足可用性,则把旧数据返回。则分布式系统不满足一致性条件。S1服务器和S2服务器数据不一致。所以一致性、可用性、分区容错性无法同时满足。

 

总结

 

通过CAP理论,我们知道无法同时满足一致性、可用性和分区容错性这三个特性,那要舍弃哪个呢?

CA without P:如果不要求P(不允许分区),则C(强一致性)和A(可用性)是可以保证的。但其实分区不是你想不想的问题,而是始终会存在,因此CA的系统更多的是允许分区后各子系统依然保持CA。CP without A:如果不要求A(可用),相当于每个请求都需要在Server之间强一致,而P(分区)会导致同步时间无限延长,如此CP也是可以保证的。很多传统的数据库分布式事务都属于这种模式。AP wihtout C:要高可用并允许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。

 

CA without P

 

这种情况在分布式系统中几乎是不存在的。首先在分布式环境下,网络分区是一个正常的事实。因为网络分区是必然的,所以如果舍弃P,意味着要舍弃分布式系统。那也就没有必要再讨论CAP理论了。这也是为什么在前面的CAP证明中,我们以系统满足P为前提论述了无法同时满足C和A。

 

CP without A

 

如果一个分布式系统不要求强的可用性,即容许系统停机或者长时间无响应的话,就可以在CAP三者中保障CP而舍弃A。

一个保证了CP而一个舍弃了A的分布式系统,一旦发生网络故障或者消息丢失等情况,就要牺牲用户的体验,等待所有数据全部一致了之后再让用户访问系统。

 

AP wihtout C

 

要高可用并允许分区,则需放弃一致性。一旦网络问题发生,节点之间可能会失去联系。为了保证高可用,需要在用户访问时可以马上得到返回,则每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。

这种舍弃强一致性而保证系统的分区容错性和可用性的场景和案例非常多。前面我们介绍可用性的时候说到过,很多系统在可用性方面会做很多事情来保证系统的全年可用性可以达到N个9,所以,对于很多业务系统来说,比如淘宝的购物,12306的买票。都是在可用性和一致性之间舍弃了一致性而选择可用性。


总的来说,适合的才是最好的,具体的业务场景选择具体的策略来处理。

 

分享大数据行业的一些前沿技术和手撕一些开源库的源代码
微信公众号名称:技术茶馆
微信公众号ID    :    Night_ZW
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值