image.png

CAP理论

  • 一致性(Consistency)一致性表示所有客户端同时看到相同的数据,无论它们连接到哪个节点。 要做到这一点,每当数据写入一个节点时,就必须立即将其转发或复制到系统中的所有其他节点,然后写操作才被视为“成功”。

如果允许至少一个节点的数据不一致,将会丧失了一致性
image.png

NoSQL常见分类 - 图3

  1. 强一致性

强一致性提供可线性化保证。 可线性化是指并发处理请求。 保证读取操作返回项的最新提交版本。 客户端永远不会看到未提交或不完整的写入。 始终保证用户读取最新确认的写入。
下图以乐谱形式演示了非常一致性。 将数据写入“美国西部 2”区域后,当你从其他区域读取这些数据时,将会获得最新的值:
NoSQL常见分类 - 图4

  1. 有限过期一致性

在有限过期一致性中,保证读取操作遵循一致性前缀保证。 读取操作可以滞后于写入操作最多“K”个项版本(即“更新”)或“T”时间间隔,以先达到者为准。 换言之,如果选择有限过期,则可以通过两种方式配置“过期”:

  • 项的版本数 (K)
  • 时间间隔 (T) 读取操作可以滞后于写入操作

有限过期在“过期窗口”之外提供全局整体顺序。 当客户端在接受写入的区域中执行读取操作时,有限过期一致性提供的保证与强一致性的保证相同。 随着过期窗口接近时间或更新(以更近者为准),服务将限制新写入,以允许复制跟上并遵守一致性保证。

下图以乐谱形式演示了有限过期一致性。 将数据写入“美国西部 2”区域后,“美国东部 2”和“澳大利亚东部”区域将会根据所配置的最大滞后时间或最大操作数目读取写入的值

NoSQL常见分类 - 图5

  1. 会话一致性

对于会话一致性,在单个客户端会话中,将保证读取操作遵循一致前缀、单调读取、单调写入、读取写入和读取后写入保证。 这采用单个“写入器”会话,或者多个写入器共享会话令牌。

下图以乐谱形式演示了会话一致性。 “美国西部 2 写入器”和“美国西部 2 读取器”正在使用同一个会话(会话 A),因此它们会同时读取相同的数据。 而“澳大利亚东部”区域正在使用“会话 B”,因此,它会稍后才会接收到数据,但接收顺序与写入顺序相同

NoSQL常见分类 - 图6

  1. 一致前缀一致性

在一致前缀选项中,返回的更新包含所有更新的一些前缀,不带间隔。 一致前缀一致性级别保证读取操作永远不会看到无序写入。
如果写入是按 A, B, C 顺序执行的,则客户端会看到 A、A,B 或 A,B,C,但永远不会看到类似于 A,C 或 B,A,C 的失序排列情况。 一致前缀的延迟、可用性和读取吞吐量与最终一致性相当,但还会提供顺序保证,以适应顺序非常重要的方案的需求。

下图以乐谱形式演示了一致前缀一致性。 在所有区域中,读取操作永远不会看到无序写入:


NoSQL常见分类 - 图7

  1. 最终一致性

对于最终一致性,不保证读取的顺序。 如果缺少任何进一步的写入,则副本最终会收敛。 最终一致性是最弱的一致性形式,因为客户端可能会读取比之前读取的值还要旧的值。 最终一致性非常适合不需要任何顺序保证的应用程序。 示例包括推文、点赞或无回复评论的计数。 下图以乐谱形式演示了最终一致性。
NoSQL常见分类 - 图8

  • 可用性(Availability)- 可用性表示发出数据请求的任何客户端都会得到响应,即使一个或多个节点宕机。 可用性的另一种状态:分布式系统中的所有工作节点都返回任何请求的有效响应,而不会发生异常。

如果为了保证所有节点数据一致性,将分区中数据不一致的节点设置为不可用,将丧失了可用性
image.png

  • 分区容错性(Partition tolerance)- 分区是分布式系统中的通信中断 - 两个节点之间的丢失连接或连接临时延迟。 分区容错意味着集群必须持续工作,无论系统中的节点之间有任何数量的通信中断。

CAP类型

  • CP 数据库:CP 数据库提供一致性和分区容错,以牺牲可用性为代价。 在任何两个节点之间发生分区时,系统必须关闭不一致的节点(即,使其不可用),直至解决该分区为止。
  • AP 数据库:AP 数据库提供可用性和分区容错,以牺牲一致性为代价。 当发生分区时,所有节点仍可用,但分区错误端的节点可能会返回较旧版本的数据。(解决分区后,AP 数据库通常会再同步节点,以修复系统中的所有不一致。)
  • CA 数据库:CA 数据库在所有节点间提供一致性和可用性。 如果系统中的任意两个节点之间存在分区,但无法提供容错,就无法实现 CA 数据库。

BASE理论

  • Basically Available(基本可用)

分布式系统在出现不可预知故障的时候,允许损失部分可用性

  • Soft state(软状态)

软状态也称为弱状态,和硬状态相对,是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性

  • Eventually consistent(最终一致性)

最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态,而不需要实时保证系统数据的强一致性

参考资料