分布式BASE理论:数据一致性模型有哪些?

前言

在上一篇的《分布式CAP理论:为什么CAP理论中的三个指标不能同时满足呢?》中,提到了CAP中只能三者择其二,有CP(一致性+分区容错性)和AP(可用性+分区容错性)两种选择。

一般来说,放弃强一致性,追求分区容错性和可用性,是很多分布式系统设计的选择。在工程实践中,基于CAP定义逐步演化出了Base理论。本文主要对以下两个问题进行介绍:

  • Base理论有哪些内容?
  • Base理论下的一致性模型又有哪些?

(若文章有不正之处,或难以理解的地方,请多多谅解,欢迎指正)

Base理论

Base理论是三要素的缩写:基本可用(Basically Available)、软状态(Soft-state)、最终一致性(Eventually Consistency)。
在这里插入图片描述
可能这三个要素比较抽象,举个栗子吧。

基本可用

相对于CAP理论中可用性的要求:【任何时候,读写都是成功的】,“基本可用”要求系统能够基本运行,一直提供服务,强调的是分布式系统在出现不可预知故障的时候,允许损失部分可用性。

相比于正常的系统,可能是响应时间延长,或者是服务被降级。

举个栗子,在秒杀活动中,如果抢购人数太多,超过了系统的QPS峰值,可能会排队或者提示限流。
在这里插入图片描述

软状态

相对于ACID事务中原子性要求【要么做,要么不做】,强调的是强制一致性,要求多个节点的数据副本是一致的,强调数据的一致性。这种原子性可以理解为”硬状态“。

软状态则允许系统中的数据存在中间状态,并认为该状态不影响系统的整体可用性,即允许系统在不同节点的数据副本上存在数据延时。

举个栗子,CSDN个人主页的粉丝数,如果有用户关注了某个博主,该博主的粉丝数需要过一段时间才会显示正确的数据。
在这里插入图片描述

最终一致性

数据不可能一直处于软状态,必须在一个时间期限后达到各个节点的一致性。在期限过后,应当保证所有副本中的数据保持一致性,也就是达到了数据的最终一致性。

在系统设计中,最终一致性实现的时间取决于网络延时、系统负载、不同的存储选型,不同数据复制方案设计等因素。也就是说,谁都不保证用户什么时候能看到更新好的数据,但是总会看到的
在这里插入图片描述
最终一致性要求的多个节点数据副本保持一致性,也是说,在不同机器上是物理时钟保持一致,这就是全局时钟。没有全局时钟,绝对的内部一致性是没有意义的。不同机器上的物理时钟难以同步,导致无法区分在分布式系统中多个节点的事件时序。

既然如此,那么我们只需要所有机器有相同的时间就行了,如果两个节点之间不需要交互,它们的时间甚至都不需要同步。所以我们只要抓住一个重点:达成一致的是节点之间交互的事件发生顺序,而非时间

所以有很多数据一致性的不同模型。

数据一致性模型

在这里插入图片描述
强一致性当更新操作完成后,任何多个后续进行访问时都会返回最新的值,就是用户刚提交就能看到更新了的数据,这对用户是最友好的。但根据CAP理论,这势必也要牺牲可用性。

弱一致性系统在写入数据成功后,不承诺立即能读到最新的值,也不承诺什么时候能读到,但是过一段时间之后用户可以看到更新后的值。那么用户读不到最新数据的这段时间被称为“不一致窗口时间”。

在上一篇文章中:《分布式CAP理论:为什么CAP理论中的三个指标不能同时满足呢?》提到ZooKeeper框架采用的是CAP理论中的CP架构,即追求强一致性和分区容错性。

但其实这并不严谨,因为ZooKeeper在写入值之后,会交给Leader处理,Zab协议只需保证半数从节点成功即可,那么这就会有节点数据是老的数据,如此,有可能客户端读出的数据不是最新的数据。而且,因为节点通过zxid顺序地接受Leader的广播,所以ZooKeeper不能保证所有的信息能被马上看到,不过最终都会看到哒。

读到这里,有的读者们可能会想:小编,你是不是在玩我?
在这里插入图片描述
且慢!凡事都有但是。想实现ZooKeeper读写的强一致性也是可以的。在ZooKeeper中有一个sync()命令,只要我们每次读的时候调用sync()强制同步数据,就可以保证读出的数据都是最新的。

呼,所以ZooKeeper虽然默认实现数据的弱一致性,但是也可以通过调整代码,实现数据的强一致性。所以将ZooKeeper作为CP架构的例子也是可以滴~

最终一致性作为弱一致性中的特例,强调的是所有数据副本,在经过一段时间的同步后,最终能够到达一致的状态,不需要实时保证系统数据的强一致性。而到达最终一致性的时间,其实就是上文提到的不一致窗口时间。

根据业务需求的不同,最终一致性中又有很多种情况:

  • 因果一致性:要求有因果关系的操作顺序得到保证,非因果关系的操作顺序则无所谓。例如微信朋友圈的评论以及对评论的答复所构成的因果关系,有兴趣可以了解一下。
    • 会话一致性:在操作顺序得到保证的前提下,保证用户在同一个会话里读取数据时保证数据是最新的,如分布式系统Session一致性解决方案。
  • 单调读一致性:用户读取某个数据值后,其后续操作不会读取到该数据更早版本的值。
  • 单调写一致性:要求数据的所有副本,以相同的顺序执行所有的更新操作,也称为时间轴一致性。

当然,这里只是简单列出来了一些比较常见的一致性模型,按不完全统计,应该是有15种一致性模型的,有兴趣的朋友可以了解一下。

结语

本文主要是对基于CAP理论的BASE理论进行了介绍,从BASE理论中的最终一致性展开了对不同数据一致性模型的介绍。以下参考资料对于理解这块有较大的帮助,有些可能看不懂,那就收藏起来,等什么时候翻一翻说不一定就看懂了呢~

如果本文对你的学习有帮助,请给一个赞吧,这会是我最大的动力~

参考资料:

谈谈数据一致性

从微信朋友圈的评论可见性,谈因果一致性在分布式系统中的应用

通俗易懂 强一致性、弱一致性、最终一致性、读写一致性、单调读、因果一致性 的区别与联系

不同数据一致性模型有哪些应用?

posted @ 2020-04-05 17:31  NYfor2018  阅读(273)  评论(0编辑  收藏  举报