分布式数据一致性模型有哪些?

前言

上一篇《如何证明分布式系统的CAP理论》 提到了CAP中只能三者择其二,有CP(一致性+分区容错性)和AP(可用性+分区容错性)两种选择。

一般来说,放弃强一致性,追求分区容错性和可用性,是很多分布式系统设计的选择。在工程实践中,基于CAP定义逐步演化出了Base理论。

本文主要对以下两个问题进行介绍:

  • Base理论有哪些内容?

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

Base理论

Base 是三个短语的简写,即基本可用(Basically Available)、软状态(Soft State)和最终一致性(Eventually Consistent)

分布式数据一致性模型有哪些? Base理论的核心思想是最终一致性,即使无法做到强一致性(StrongConsistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual Consistency)。

Base三要素

基本可用

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

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

举个栗子,在秒杀活动中,如果抢购人数太多,超过了系统的QPS峰值,可能会排队或者提示限流。 分布式数据一致性模型有哪些?

软状态

软状态可以对应ACID事务中的原子性,在ACID的事务中,实现的是强制一致性,要么全做要么不做,所有用户看到的数据一致。其中的原子性(Atomicity)要求多个节点的数据副本都是一致的,强调数据的一致性。

原子性可以理解为一种“硬状态”,软状态则是允许系统中的数据存在中间状态,并认为该状态不影响系统的整体可用性,即允许系统在多个不同节点的数据副本存在数据延时。

最终一致性

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

在系统设计中,最终一致性实现的时间取决于网络延时、系统负载、不同的存储选型,不同数据复制方案设计等因素。也就是说,谁都不保证用户什么时候能看到更新好的数据,但是总会看到的。

全局时钟和逻辑时钟

分布式系统解决了传统单体架构的单点问题和性能容量问题,另一方面也带来了很多新的问题,其中一个问题就是多节点的时间同步问题:不同机器上的物理时钟难以同步,导致无法区分在分布式系统中多个节点的事件时序。

没有全局时钟,绝对的内部一致性是没有意义的,一般来说,我们讨论的一致性都是外部一致性,而外部一致性主要指的是多并发访问时更新过的数据如何获取的问题。

和全局时钟相对的,是逻辑时钟,逻辑时钟描绘了分布式系统中事件发生的时序,是为了区分现实中的物理时钟提出来的概念。

一般情况下我们提到的时间都是指物理时间,但实际上很多应用中,只要所有机器有相同的时间就够了,这个时间不一定要跟实际时间相同。更进一步解释:那么它们的时间甚至都不需要同步。因此问题的关键点在于节点间的交互要在事件的发生顺序上达成一致,而不是对于时间达成一致。逻辑时钟的概念也被用来解决分布式一致性问题,这里我们不展开,感兴趣的可以去查阅相关资料。

不同数据一致性模型

一般来说,数据一致性模型可以分为强一致性和弱一致性,强一致性也叫做线性一致性,除此以外,所有其他的一致性都是弱一致性的特殊情况。弱一致性根据不同的业务场景,又可以分解为更细分的模型,不同一致性模型又有不同的应用场景。

在互联网领域的绝大多数场景中,都需要牺牲强一致性来换取系统的高可用性,系统往往只需要保证“最终一致性”,只要这个最终时间是在用户可以接受的范围内即可。 分布式数据一致性模型有哪些?「强一致性:」 当更新操作完成后,任何多个后续进行访问时都会返回最新的值,就是用户刚提交就能看到更新了的数据,这对用户是最友好的。但根据CAP理论,这势必也要牺牲可用性。

「弱一致性:」 系统在写入数据成功后,不承诺立即能读到最新的值,也不承诺什么时候能读到,但是过一段时间之后用户可以看到更新后的值。那么用户读不到最新数据的这段时间被称为“不一致窗口时间”。 「最终一致性」 最终一致性作为弱一致性中的特例,强调的是所有数据副本,在经过一段时间的同步后,最终能够到达一致的状态,不需要实时保证系统数据的强一致性。而到达最终一致性的时间,其实就是上文提到的不一致窗口时间。

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

「因果一致性:」 要求有因果关系的操作顺序得到保证,非因果关系的操作顺序则无所谓。例如微信朋友圈的评论以及对评论的答复所构成的因果关系,有兴趣可以了解一下。

「会话一致性:」 在操作顺序得到保证的前提下,保证用户在同一个会话里读取数据时保证数据是最新的,如分布式系统Session一致性解决方案。

「单调读一致性:」 用户读取某个数据值后,其后续操作不会读取到该数据更早版本的值。

「单调写一致性:」 要求数据的所有副本,以相同的顺序执行所有的更新操作,也称为时间轴一致性。

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

CAP 及 Base 的关系

Base理论是在CAP上发展的,CAP理论描述了分布式系统中数据一致性、可用性、分区容错性之间的制约关系,当你选择了其中的两个时,就不得不对剩下的一个做一定程度的牺牲。

Base理论则是对CAP理论的实际应用,也就是在分区和副本存在的前提下,通过一定的系统设计方案,放弃强一致性,实现基本可用,这是大部分分布式系统的选择,比如NoSQL系统、微服务架构。在这个前提下,如何把基本可用做到最好,就是分布式工程师们追求的。

除了CAP和Base,上面还提到了ACID原理,,ACID是一种强一致性模型,强调原子性、一致性、隔离性和持久性,主要用于在数据库实现中。Base理论面向的是高可用、可扩展的分布式系统,ACID适合传统金融等业务,在实际场景中,不同业务对数据的一致性要求不一样,ACID 和 Base 理论往往会结合使用。

总结

本文主要是对基于CAP理论的BASE理论进行了介绍,从BASE理论中的最终一致性展开了对不同数据一致性模型的介绍。其内容比较抽象,特别是逻辑时钟和一致性部分,如果你有充裕的时间,建议找一些扩展资料来学习。