简介
分布式一致性问题包括数据一致性问题
和事务一致性问题
。在此仅关注数据一致性问题
,数据一致性问题
是因为分布式系统下数据需要复制而导致的。
而数据一致性模型
就是规定在并发的进行数据复制时,每个节点应该看到的视图是怎样的。
不同的 数据一致性模型
对于视图的规定不一样。
假设:
有两个进程 p1
和 p2
,各自发生的事件为 p1_1、p1_2
和 p2_1、p2_2
。
如果不做任何限制,那么这四个事件在全局所有节点看来有 4!
种可能(由于网络波动或者任何原因,这些事件会完全的乱序由别的节点感知到)。
而一致性模型
就是对事件的排列做出限制,让所有节点只可以感知到受限集合内的事件发生顺序。而限制集合内的事件发生顺序(视图)
符合的特性就是 一致性模型
的特性。
在此只介绍几种常见的 一致性模型
,包括:线性一致性
、顺序一致性
、因果一致性
、单调读
、单调写
、读己所写
、读后写
一、线性一致性
最强的一致性,要求分布式系统需要有一个全局时钟,在全局时钟下按顺序发生的事件,在各个节点处理时也必须按全局时钟顺序发生。即各个进程看到的操作顺序和全局时钟下的顺序一致。
简介中的例子,假设全局时钟下发生的顺序为 p1_1、p1_2 、p2_1、p2_2
,则集群内的所有节点看到的顺序都是这个顺序。
如何实现线性一致性? 可以使用 raft 协议,读写请求都由主节点处理
且需要保证写请求必须在 apply 到状态机后才能返回给客户端
,这样子可以保证在写请求从客户端发出到写请求 apply 到状态机期间发生的所有读操作,都算是并发的操作,这样子可以保证线性一致性。
即:
x = 0(初值)
P1:|----write x = 1 ----- apply x = 1--------------| |---- read x = 1 --|
P2: |----