如何达到线性一致(1)

举报
JavaEdge 发表于 2022/08/31 23:57:08 2022/08/31
【摘要】 线性一致性背后基本思想:使系统看起来好像只有一个数据副本。但还有更多操心地方。再看个例子。图-2显示三个客户端在线性化DB中同时读写相同K= x。在分布式语义下,x是寄存器(register),如它能是KV存储中的一个K,关系数据库中的一行或文档DB的一个文档。图-2是用户请求视角,而非DB内部视角。每条线代表客户端发出的一个请求,虚线开端是请求发送时刻,尾端是客户端收到响应时刻。因为网络延...

线性一致性背后基本思想:使系统看起来好像只有一个数据副本。但还有更多操心地方。再看个例子。

图-2显示三个客户端在线性化DB中同时读写相同K= x。在分布式语义下,x是寄存器(register),如它能是KV存储中的一个K,关系数据库中的一行或文档DB的一个文档。

图-2:若读、写请求并发,则可能返回旧值或新值

图-2是用户请求视角,而非DB内部视角。每条线代表客户端发出的一个请求,虚线开端是请求发送时刻,尾端是客户端收到响应时刻。因为网络延迟不确定,客户端不知道DB处理请求精确时间,只知道它发生在发送请求和接收响应之间某刻。i

[i]  该图微妙细节是它假定存在一个全局时钟,即水平轴。即使真实系统通常没有准确时钟,但这种假设是允许的:为分析分布式算法,可以假设一个精确的全局时钟存在,不过算法无法访问它。算法只能看到由石英振荡器和 NTP 产生的实时逼近。

该案例中,寄存器有两类操作:

  • 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:因为读操作和写操作一定是在其各自的起止区间内的某个时刻被处理。如果在写入结束后开始读取,则读取处理一定发生在写入完成之后,因此它必须看到写入的新值。

  • 与写操作在时间上重叠的任何读操作,可能会返回 01 ,因为我们不知道读取时,写是否已生效。这些操作是并发的。

但是,这还不足以完全描述线性一致性:若与写并发的读可能返回旧值或新值,则过程中,不同客户端可能会在写期间看到数值在旧值和新值之间来回跳变。这不是期望的模拟 “单一数据副本”。ii

[ii]  若读(与写同时发生时)可能返回旧值或新值,则称该寄存器为常规寄存器
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。