分布式之CAP理论分析

写在前面

任何存在的事物都有其内在的特性,分布式也不例外,那么分布式都有什么特性呢?国外有大牛就帮我们总结了如下的三点:

C:Consitency,一致性
A:Available,可用性
P:Partition tolerance,分区容错

CA和都很清晰,这里的P分区容错中的分区指的是网络分区,即正常同一个局域网的环境,因为某些网络问题变为不同的局域网的情况(简单理解就是网络互通变为网络不通)。接下来我们就分别看下吧!

1:CAP指的是什么

分别来看下CAP指的是什么。

1.1:C

首先看下C,C的全称是Consistency,其所表达的含义是,承诺对于客户端的请求,要么返回最新的数据,要么是返回错误(不会没有响应,也不会响应老数据)。比如数据X的初始值是1,如下图:

在这里插入图片描述

然后客户端1访问节点1更新X为2,在节点1更新完毕后直接返回更新成功消息给客户端1(后续异步更新X=2到到节点2),如下图:

在这里插入图片描述

在X=2还没有同步到节点2时,客户端2获取X的值,此时其获取到的就是1,如下图:

在这里插入图片描述

可以看到此时获取到的X=1并不是最新的X的值2,因此不满足承诺对于客户端的请求,要么返回最新的数据,要么是返回错误的描述,所以此时是不满足一致性的,那么如何满足一致性呢?只需要客户端1更新X=2时的值同步更新到节点2,这样,在返回写入成功消息给客户端1之前所有节点都拥有最新的X值了,自然客户端2再来通过节点2读取X值时,肯定能够读取到最新值了,这个同步更新过程如下图:

在这里插入图片描述

其实,C一致性强调的是读取到的数据的正确性,在一些对数据正确性要求记为严格的场景中,是必须要满足C的,比如银行等金融业务,毕竟钱是不能开玩笑的!

1.2:A

A是可用性,其描述的是,系统给客户端这样的保证,无论分布式集群出现什么样的内部故障,如部分节点宕机,部分节点网络不可达(效果等同于宕机),都保证能够正常的对外提供服务,注意这的正常对外提供服务是正常服务,而非返回错误。对应到实际的场景中就是,在有客户端读取数据时直接返回自己所能获取的最新数据版本(一般就是本地的数据了)

注意A强调的是正常服务,即不能返回错误给客户端,而P强调的集群正常工作,即还具备响应请求的能力,但响应的到底是正常的数据还是错误信息就不一定了。

1.3:P

P,分区容错,在分布式系统发生网络分区(如节点无法访问)时,保证分布式系统本身还是能够正常工作的,即能够正常处理客户端的请求(这里的处理,可能是正常返回数据也可能是返回错误)

注意P强调的集群正常工作,即还具备响应请求的能力,但响应的到底是正常的数据还是错误信息就不一定了,而A强调的是正常服务,即不能返回错误给客户端。

2:CAP不能三角

CAP不能三角,即CAP不可能同步满足,如下图:

在这里插入图片描述

这个是业界大佬在自己实践基础上已经验证过了,我们可以当做准则来看,即记住即可。首先分布式系统工作在网络环境中,而网络环境本身是不可靠的,所以肯定会出现分区容错的情况,而如果因为出现分区容错就导致分布式系统无法正常工作,这显然是不行的,所以当我们在设计一个分布式系统的时候,P一定是要满足的,而剩下的C和A到底该如何选择就需要根据具体的业务来决定了,如果是你的系统要求必须读取到正确数据,那就选择C,此时系统就是CP的,即当出现节点故障时,会返回错误给客户端。如果你的系统允许在一定程度上读取到旧数据,但要求服务正常,那就选择A,此时系统就是AP的,即当有节点故障时,返回老数据给客户端。

这里需要注意,CAP不能三角指的是指集群发生了异常的情况下,如有节点宕机(此时为了实现C则不能A,为了实现A则不能C),而非一切正常时。

3:具体实践

InfluxDB是一个存储时间序列数据的开源数据库,官方开源了其单机版本,但并未开源其分布式版本,并且分布式版本还是收费的,且价格不菲,老板为了节省这笔开支,让你来负责实现一个InfluxDB的分布式版本,你该怎么做呢?要做的第一件事就是为其确定分区容错模型,即使用CAP中的AP还是CP。

InfluxDB的架构如下图:

在这里插入图片描述

分别是DATA组件和META组件,二者的作用如下:

DATA组件:负责数据存储
META组件:负责元数据信息存储,如库,表信息等

因为DATA组件和META组件存储内容不同,即业务场景不同,所以我们需要分开来分析其适合的分区容错模型,首先一个分布式系统一定要满足P,这个在前面已经分析过了,接下来分别看下二者对于AC的选择吧!

DATA组件:其负责数据存储,且访问量大,要具备横向扩展能力,我们可以允许访问到旧数据,但是不允许出现服务不可用的情况,因此选择A,即最终是AP模型
META组件:其存储元数据,数据非常关键,不能出现访问到旧数据的情况,如用户新建了DB,用户要在该DB新建表的话,必须能够读取到该DB的信息,因此要求强一致性,且因为仅仅存储元数据,访问压力不会特别大,因此不要求具备特别强的横向扩展能力,所以选择C,即最终是CP模型

写在后面

小结

本文一起看了对于分布式系统特性总结的CAP理论,即一致性,可用性,分区容错。然后给出了一个CAP在具体业务实践中落地的例子。希望本文能够帮助到你!

参考文章列表

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值