如何达到线性一致(1)
线性一致性背后基本思想:使系统看起来好像只有一个数据副本。但还有更多操心地方。再看个例子。
图-2显示三个客户端在线性化DB中同时读写相同K= x
。在分布式语义下,x
是寄存器(register),如它能是KV存储中的一个K,关系数据库中的一行或文档DB的一个文档。
图-2是用户请求视角,而非DB内部视角。每条线代表客户端发出的一个请求,虚线开端是请求发送时刻,尾端是客户端收到响应时刻。因为网络延迟不确定,客户端不知道DB处理请求精确时间,只知道它发生在发送请求和接收响应之间某刻。i
该案例中,寄存器有两类操作:
-
read(x)⇒v:客户端读取
x
的值,数据库返回值v
-
write(x,v)⇒r :客户端请求将
x
设为值v
,DB返回响应r
(可能表示处理正确或失败)
在图-2,x
最初为0
,客户端 C 执行写请求将其设为 1
。发生这种情况时,客户端 A 和 B 反复轮询数据库以读取最新值。 A 和 B 的请求可能会收到怎样的响应?
-
客户端 A 的第一个读操作,完成于写操作开始之前,因此必须返回旧值
0
。 -
客户端 A 的最后一个读操作,开始于写操作完成之后。如果数据库是线性一致性的,它必然返回新值
1
:因为读操作和写操作一定是在其各自的起止区间内的某个时刻被处理。如果在写入结束后开始读取,则读取处理一定发生在写入完成之后,因此它必须看到写入的新值。 -
与写操作在时间上重叠的任何读操作,可能会返回
0
或1
,因为我们不知道读取时,写是否已生效。这些操作是并发的。
但是,这还不足以完全描述线性一致性:若与写并发的读可能返回旧值或新值,则过程中,不同客户端可能会在写期间看到数值在旧值和新值之间来回跳变。这不是期望的模拟 “单一数据副本”。ii
- 点赞
- 收藏
- 关注作者
评论(0)