分布式系统基础--CAP理论

CAP理论(一个分布式系统至多只能满足三项中的两项)

一致性(Consistency)    所有节点在同一时间访问到的数据完全一致

可用性(Availability)   非故障节点对每一个请求能做出响应

分区容错性(Partition Tolerance)   分布式系统中某节点或分区故障时,仍然能对外提供满足一致性或可用性的服务

说说一致性

一致性是因为多个数据拷贝下并发读写才有的问题

若从客户端和服务端两个不同的视角来看

  • 客户端:一致性主要指的是数据更新后,在多并发访问时如何获取
  • 服务端:指更新如何分布到整个系统,以保证数据最终一致

一致性,可以分为强/弱/最终一致性三类

从客户端角度,多进程并发访问时,更新过的数据在不同进程如何获取的不同策略,决定了不同的一致性。

  • 强一致性:关系型数据库,要求更新过的数据能被后续的访问都能看到
  • 弱一致性:能容忍后续的部分或者全部访问不到
  • 最终一致性:经过一段时间后要求能访问到更新后的数据

CAP的证明

上图是证明CAP的基本场景,网络中有两个节点N1和N2,他们之间网络可以连通,N1、N2中均有一个应用程序A/B,和一个数据库V。两个V0是分布式系统的数据存储的两个子数据库

在满足一致性的时候,N1和N2中的数据是一样的,V0=V0

在满足可用性的时候,用户不管是请求N1或者N2,都会得到立即响应

在满足分区容错性的情况下,N1和N2有任何一方宕机,或者网络不通的时候,都不会影响N1和N2彼此之间的正常运作

preview

如上图,分布式系统正常运转下,用户向N1机器请求数据更新,程序A更新数据库V0为V1,分布式系统将数据进行同步操作M,将V1同步到N2中的V0,使得N2中的数据V0也更新为V1,N2此时响应读数据请求则与N1中一致。

现在假设一种极端情况,N1和N2之间的网络断开了,分布式系统要支持这种网络异常,相当于要满足分区容错性,能不能同时满足一致性和响应性呢?

假设在N1和N2之间网络断开的时候,有用户向N1发送写数据请求,那N1中的数据V0将被更新为V1,由于网络断开,分布式系统无法同步操作M,故N2中的数据依旧是V0

此时,有用户向N2发送读数据请求,由于数据还没有进行同步,应用程序没办法立即给用户返回最新的数据V1,怎么办呢?有二种选择:

第一,牺牲一致性,响应旧的数据V0给用户

第二,牺牲可用性,阻塞等待,直到网络连接恢复,数据更新操作M完成之后,再给用户响应最新的数据V1

这个过程,证明了要满足分区容错性的分布式系统,只能在一致性和可用性两者中,选择其中一个

CAP权衡

CA without P:舍弃P(不允许分区容错),则C(强一致性)和A(可用性)是可以保证的。但其实分区不是想不想的问题,而是始终会存在,因此CA的系统更多的是允许分区后各子系统依然保持CA

CP without A:舍弃A(可用性),相当于每个请求都需要在Server之间强一致,而P(分区)会导致同步时间无限延长。很多传统的数据库分布式事务都属于这种模式
AP wihtout C:舍弃C(一致性),要高可用并允许分区。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。现在众多的NoSQL都属于此类

Teorema-CAP-2

高可用性:指系统无中断地执行其功能的能力,代表系统的可用性程度

其度量方式,是根据系统损害、无法使用的时间,以及由无法运作恢复到可运作状况的时间,与系统总运作时间的比较。计算公式为: {\displaystyle A={\rm {\frac {MTBF}{MTBF+MTTR}}}}

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

在线系统和执行关键任务的系统通常要求其可用性要达到5个9标准(99.999%)---年故障时间为5分15秒

猜你喜欢

转载自blog.csdn.net/yaya_12345678/article/details/89157267