资讯专栏INFORMATION COLUMN

冲突的处理 - 分布式数据库相关理论 Part5

番茄西红柿 / 1568人阅读

摘要:冲突的处理,也是分布式系统中一个重要的议题。假设负责整理新闻段子有个人王尼玛张全蛋纸巾。第二天,张全蛋复查列表,由于纸巾的更新操作并不是在他之后的而是和他同时的,这时候就产生了一个冲突,需要处理。

冲突的处理,也是分布式系统中一个重要的议题。今天我们继续以 Riak 为案例,看看 Riak 是怎么做冲突处理的。

Vector Clock(向量钟)

Riak 通过一种叫做 Vector Clock 的机制来处理冲突问题。简单来说,Vector Clock 是一段 token
Riak 这样的分布式系统通过这样的 token 来追踪数据更新操作的先后顺序。

在冲突处理中,能够知道冲突操作(eg. 创建操作,更改操作)的顺序,是非常重要的。
因为对于分布式系统来说,不同的客户端连接到的是不同的服务器节点,
当一个客户端更新了一个服务器节点上的数据,也许另一个客户端也同时更新了另一个服务器节点上的数据。

这时候,也许你会想到:记录每个操作的时间戳,然后依照时间戳靠后的操作来。然而要这么做的话,这里有个隐含的前提:
在这个分布式系统中的每个服务器节点,时钟都必须是完全同步的。
然而事实上,一方面这是非常困难的:需要非常大的财力物力的投入;另一方面,整个系统又是单点故障的。

所以,Riak 使用 Vector Clocks 来处理冲突。Vector Clocks 给每个写操作(创建,更改,删除) 打上一个标签,标签代表了是哪个客户端以什么样的顺序执行的操作。
这样一来,客户端或者开发者就能决定面对冲突,该怎么决定。
如果你熟悉像 Git, Subversion这样的版本控制系统,
这就和两个人同时修改了同一个文件产生的冲突解决思路是相似的。

Vector Clock 小故事 —— Vector Clock 相关理论

暴走大事件的编辑部每周都要整理下一期里要播报的新闻段子。

假设负责整理新闻段子有3个人:王尼玛(A), 张全蛋(B), 纸巾(C)。他们需要确定最终的新闻段子的列表。新闻段子的列表存储在分布式的服务器中。

每个人用自己的终端连接数据库。这些终端都有着唯一的标识,用来构建 vector clock。下面就让我们模拟一下,vector clock 是如何工作的。

首先,王尼玛用自己的终端更新了列表

vclock: A[0]
value: [news xx]

然后,张全蛋先下载了这个列表,然后更新了这个列表

vclock: A[0], B[0]
value: [news xx, news xyy]

张全蛋更新的同时(王尼玛做更新之后),纸巾同样的下载了已有的列表,做了更新。

vclock: A[0], C[0]
value: [news xx, news yyz]

第二天,张全蛋复查列表,由于纸巾的更新操作并不是在他之后的(而是和他同时的),
这时候就产生了一个冲突,需要处理。

他拿到两个值:

vclock: A[0], B[0]
value: [news xx, news xyy]
--
vclock: A[0], C[0]
value: [news xx, news yyz]

他需要解决这个冲突:于是他选择合并这两个值:

vclock: A[0], C[0], B[1]
value: [news xx, news xyy, news yyz]

这样一来,任何人之后获取到的就是这个最新的合并后的值了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/33855.html

相关文章

  • 冲突处理 - 布式据库相关理论 Part5

    摘要:冲突的处理,也是分布式系统中一个重要的议题。假设负责整理新闻段子有个人王尼玛张全蛋纸巾。第二天,张全蛋复查列表,由于纸巾的更新操作并不是在他之后的而是和他同时的,这时候就产生了一个冲突,需要处理。 冲突的处理,也是分布式系统中一个重要的议题。今天我们继续以 Riak 为案例,看看 Riak 是怎么做冲突处理的。 Vector Clock(向量钟) Riak 通过一种叫做 Vector ...

    stormgens 评论0 收藏0
  • 冲突处理 - 布式据库相关理论 Part5

    摘要:冲突的处理,也是分布式系统中一个重要的议题。假设负责整理新闻段子有个人王尼玛张全蛋纸巾。第二天,张全蛋复查列表,由于纸巾的更新操作并不是在他之后的而是和他同时的,这时候就产生了一个冲突,需要处理。 冲突的处理,也是分布式系统中一个重要的议题。今天我们继续以 Riak 为案例,看看 Riak 是怎么做冲突处理的。 Vector Clock(向量钟) Riak 通过一种叫做 Vector ...

    CoorChice 评论0 收藏0
  • VUE - MVVM - part5 - Observe

    摘要:具体代码执行方式进入到的目录下,命令行运行即可。确保为一个对象如果对象下有则不需要再次生成函数返回该对象的实例,这里判断了如果该对象下已经有实例,则直接返回,不再去生产实例。这就确保了一个对象下的实例仅被实例化一次。 看这篇之前,如果没有看过之前的文章,可拉到文章末尾查看之前的文章。 回顾 在 step4 中,我们大致实现了一个 MVVM 的框架,由3个部分组成: defineRe...

    xi4oh4o 评论0 收藏0
  • 【超越白皮书3】DAG技术解析与实测

    摘要:有向无环图,以下简称是其中的代表之一。的去中心化和可扩展性可认为是一体两面的,因为基于数据结构带来的异步记账特性,同时实现了高度的参与网络节点的去中心化和交易的可扩展性。因此,目前对于双花问题,需要综合考虑实际情况进行设计。 本报告由火币区块链研究院出品,作者:袁煜明、胡智威。原文地址 相关报告: 【超越白皮书2】EOS主网上线前夕的实测分析与技术建议 【超越白皮书1】EOSIO程序实...

    caikeal 评论0 收藏0
  • 用PHP写一个最简单解释器Part5(计算器最后一节,下节开始如何写个脚本语言)

    摘要:经过几天的努力,用已经实现了一个完整的基础计算器,如下图上代码定义整数类型描述定义操作符号类型描述加法定义操作符号类型描述减法定义操作符号类型描述乘法定义操作符号类型描述除法定义操作符号类型描述定义操作符号类型描述定义空格用来存储输入字符的 showImg(https://segmentfault.com/img/bVbdNO5?w=900&h=377); 经过几天的努力,用PHP已经...

    yanest 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<