一致性详解

发布时间 2023-10-15 06:39:49作者: 3DG

何谓一致性

分布式系统中,一致性(Consiitency)是指多副本(Replications)中的数据一致性。

一致性可分为数据一致性和事务一致性

事务的一致性,和原子性类似,都是从一个状态变到另一个状态,但不同的是,原子性追求这个过程不能出错,不论结果对不对,不能出错。但一致性更追求结果一致。

:此处讨论数据一致性

强/弱一致性

1.强一致性:

数据更新同步,简单说,系统执行一次更新操作时必须阻塞,所有副本在该操作完成之前必须被锁定。

要求:

  任何读操作都能读到任一数据最近一次写操作。

  系统中所有进程,看到的操作顺序与全局时钟一致。

  故,强一致性亦称线性一致性

  任意时刻,所有节点数据一致

2.弱一致性:

数据更新异步,允许更新完成和读取到最新操作存在时间差,该时间差为“不一致性窗口”(inconsistency window)。

  最终一致性,顺序一致性都属于弱一致性。

顺序一致性

Sequential Consistency

  任何一次读都能读到某个数据的最近一次写的数据。

  系统的所有进程的顺序一致,而且是合理的。即不需要和全局时钟下的顺序一致,错的话一起错,对的话一起对。(强一致性的要求比顺序一致性更严格)

  单个节点的事件历史在全局历史上符合程序的先后顺序

  全局事件历史在各个节点上一致

最终一致性

  系统保证对某个后续不再更新的数据在一次更新后能在有限的时间内最终读取到该数据的最新值。大多数NoSQL数据库都基于最终一致性模型构建,如Redis、MongoDB等。

分类(根据更新数据后各进程访问到数据的时间和方式)

因果一致性(Casual Consistency)

即如果一系列写入按某个逻辑顺序发生,那么任何人读取这些写入时,会看见它们以正确的逻辑顺序出现。

通常见于分布式数据库。分区后,每个节点并不包含全部数据。

“读己之所写(read-your-writes)”一致性

访问自己最近一次写/更新操作

以客户为中心划分一致性

从用户角度出发,将系统看做黑盒。该模型为单一用户对数据访问的一致性!!!

单调读一致性(Monotonic Read Consistency)
一个进程从系统中读取出一个数据项的某个值后,那么系统对于该进程后续的任何数据访问都不应该返回更旧的值。

单调写一致性(Monotonic Writes Consistency)
一个系统需要能够保证来自同一个进程的写操作被顺序地执行。

读已之所写一致性(Read Your Writes Consistency)参上

读后写一致性(Write Follows Read Consistency)
如果用户需要对已执行读操作的数据再执行写操作,那么必须保证写操作发生在与已读数据的值相同或更新的值上。

实现读写一致性

会话(Session)一致性

        会话一致性将对系统数据的访问过程框定在了一个会话当中:系统能保证在同一个有效的会话中实现“读己之所写”的一致性,也就是说,执行更新操作之后,客户端能够在同一个会话中始终读取到该数据项的最新值。

单调读一致性(Monotonic Read Consistency)

单调写一致性(Monotonic Writes Consistency)