当我们谈论分布式数据库的一致性时,实质上是在谈论数据一致性和事务一致性两个方面。
逻辑上的一份数据同时存储在多个物理副本上,自然带来了数据一致性问题。
状态一致性是指,数据所处的客观、实际状态所体现的一致性;
操作一致性是指,外部用户通过协议约定的操作,能够读取到的数据一致性。
最终一致性,在语义上包含了很大的不确定性,所以很多时候并不是直接使用,而是加入一些限定条件,也就衍生出了若干种一致性模型。因为它们是在副本不一致的情况下,进行操作层面的封装来对外表现数据的状态,所以都可以纳入操作视角。
一致性模型:
- 写后读一致性,自己写入成功的任何数据,下一刻一定能读取到,其内容保证与自己最后一次写入完全一致。系统可以通过某种策略由写入节点的主副本 R1 负责后续的读取操作,这样就实现了写后读一致性。
- 单调一致性,一个用户一旦读到某个值,不会读到比这个值更旧的值。可以是将用户与副本建立固定的映射关系,比如使用哈希算法将用户 ID 映射到固定副本上,这样避免了在多个副本中切换。
- 前缀一致性,要实现这种一致性,可以增加一种显式的因果关系,这样系统可以据此控制在其他进程的读取顺序。
- 线性一致性,依赖时间,将操作记录在一条时间线上,需要一个绝对时间,也就是全局时钟。
- 因果一致性,有因果关系的事件顺序是可以比较的,可以建立逻辑时钟,借助逻辑时钟仍然可以建立全序关系,当然这个全序关系是不够精确的。因为如果两个事件并不相关,那么逻辑时钟给出的大小关系是没有意义的。
此文章为6月Day4学习笔记,内容来源于极客时间《分布式数据库30讲》