目的:
一致性模型本质上是进程与数据存储的约定:如果进程遵循某些规则,那么进程对数据的读写操作都是可预期的。
这里的进程指的是业务进程,数据存储指的是数据库服务(这个服务可能是个分布式服务)
强一致性模型
能够保证所有进程对数据的读写顺序都保持一致的一致性模型称为强一致性模型
线性一致性模型
在线性一致性模型中,进程对一个数据项的读操作,它期待数据存储返回的是该数据在最后一次写操作之后的结果。
从表面上看,这是一个很正常符合逻辑的现象,但在分布式系统(数据存储)中确是没办法做到的。由于缺少一个全局的物理时钟,我们根本就没办法知道哪一次写是最后一次写,因此最终在数据库中保留的数据不一定是全局物理时钟下的最后一次写的结果。
线性一致性模型的定义是:
- 任何一次读都能读取到某个数据最近的一次写的数据。
- 所有进程看到的操作顺序都跟全局时钟下的顺序一致。
顺序一致性模型
- 任何一次读写操作都是按照某种特定的顺序。
- 所有进程看到的读写操作顺序都保持一致(跟实际顺序不一定一致)。
顺序一致性模型采用了逻辑时钟的概念,当有两次冲突写时会按照某种规则生成一个顺序,这个顺序对所有业务进程是一致的,但是不一定符合全局物理时钟下的顺序
弱一致性模型
不能保证所有进程对数据的读写顺序都保持一致
因果一致性
- 所有进程必须以相同的顺序看到具有因果关系的读写操作。
- 不同进程可以以不同的顺序看到并发的读写操作。
最终一致性
最终一致性只保证所有副本的数据最终在某个时刻会保持一致
以客户端为中心的一致性
以客户端为中心的一致性为单一客户端提供一致性保证,保证该客户端对数据存储的访问的一致性,但是它不为不同客户端的并发访问提供任何一致性保证。举个例子:客户端 A 在副本 M 上读取 x 的最新值为 1,假设副本 M 挂了,客户端 A 连接到副本 N 上,此时副本 N 上面的 x 值为旧版本的 0,那么一致性模型会保证客户端 A 读取到的 x 的值为 1,而不是旧版本的 0。一种可行的方案就是给数据 x 加版本标记,同时客户端 A 会缓存 x 的值,通过比较版本来识别数据的新旧,保证客户端不会读取到旧的值。