写在前面
任何存在的事物都有其内在的特性,分布式也不例外,那么分布式都有什么特性呢?国外有大牛就帮我们总结了如下的三点:
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,此时系统就是CA的,即当出现节点故障时,会返回错误给客户端。如果你的系统允许在一定程度上读取到旧数据,但要求服务正常,那就选择A,此时系统就是AP的,即当有节点故障时,返回老数据给客户端。
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在具体业务实践中落地的例子。希望本文能够帮助到你!