转自:http://blog.chinaunix.net/uid-27105712-id-5612512.html

一、使用背景

先说一下需要用到向量时钟的场景。我们在写数据时候,经常希望数据不要存储在单点。如db1,db2都可以同时提供写服务,并且都存有全量数据。而client不管是写哪一个db都不用担心数据写乱问题。但是现实场景中往往会碰到并行同时修改。导致db1和db2数据不一致。于是乎就有人想出一些解决策略。向量时钟算是其中一种。简单易懂。但是并没有彻底解决冲突问题,现实分布式存储补充了很多额外技巧。

这里反向叙述方式, 介绍向量时钟。先举实际例子让读者有个感性认识,然后再说算法规则。

二、举个例子

向量时钟实际是一组版本号(版本号=逻辑时钟),假设数据需要存放3份,需要3台db存储(用A,B,C表示),那么向量维度就是3,每个db有一个版本号,从0开始,这样就形成了一个向量版本 [A:0, B:0, C:0];
Step 1: 初始状态下,所有机器都是 [A:0, B:0, C:0]

DB_A——> [A:0, B:0, C:0]

DB_B——> [A:0, B:0, C:0]

DB_C——> [A:0, B:0, C:0]

Step 2:  假设现在应用是一个商场,现在录入一个肾6的价格 iphone6 price 5888; 客户端随机选择一个db机器写入。现假设选择了A,数据大概是这样 :
{key=iphone_price; value=5888; vclk=[A:1,B:0,C:0]}

Step 3:  接下来A会把数据同步给BC;于是最终同步结果如下

DB_A——> {key=iphone_price; value=5888; vclk=[ A:1,B:0,C:0]}

DB_B——> {key=iphone_price; value=6888; vclk=[ A:1, B:0,C:0]}

DB_C——> {key=iphone_price; value=5888; vclk=[ A:1,B:0,C:0]}

Step 4:过了分钟,价格出现波动,升值到6888;于是某个业务员更新价格。这时候系统随机选择了B做为写入存储,于是结果看起来是这样:

DB_A——> {key=iphone_price; value=5888; vclk=[A:1,B:0,C:0]}

DB_B——> {key=iphone_price; value=6888; vclk=[A:1,B:1,C:0]}

DB_C——> {key=iphone_price; value=5888; vclk=[A:1,B:0,C:0]}

Step 5:于是B就把更新同步给其他几个存储

DB_A——> {key=iphone_price; value=6888; vclk=[A:1, B:1,C:0]}

DB_B——> {key=iphone_price; value=6888; vclk=[A:1,B:1,C:0]}

DB_C——> {key=iphone_price; value=6888; vclk=[A:1, B:1,C:0]}

到目前为止都是正常同步,下面开始演示一下不正常的情况。

Step 6:价格再次发生波动,变成4000,这次选择C写入:

DB_A——> {key=iphone_price; value=6888; vclk=[A:1, B:1,C:0]}

DB_B——> {key=iphone_price; value=6888; vclk=[A:1,B:1,C:0]}

DB_C——> {key=iphone_price; value=4000; vclk=[A:1, B:1,C:1]}

Step 7:  C把更新同步给AB,因为某些问题,只同步到A,结果如下:

DB_A——> {key=iphone_price; value=4000; vclk=[A:1, B:1, C:1]}

DB_B——> {key=iphone_price; value=6888; vclk=[A:1,B:1,C:0]}

DB_C——> {key=iphone_price; value=4000; vclk=[A:1, B:1,C:1]}

Step 8:价格再次波动,变成6000元,系统选择B写入

DB_A——> {key=iphone_price; value=6888; vclk=[A:1, B:1, C:1]}

DB_B——> {key=iphone_price; value=6000; vclk=[A:1,B:2, C:0]}

DB_C——> {key=iphone_price; value=4000; vclk=[A:1, B:1,C:1]}

Step 9: 当B同步更新给A和C时候就出现问题了,A自己的向量时钟是 [A:1, B:1, C:1], 而收到更新消息携带过来的向量时钟是 [A:1,B:2, C:0], B:2 比 B:1新,但是C:0却比C1旧。这时候发生不一致冲突。不一致问题如何解决?向量时钟策略并没有给出解决版本,留给用户自己去解决,只是告诉你目前数据存在冲突

三、规则介绍

版本号变更规则其实就2条,比较简单

1、   每次修改数据,本节点的版本号 加1,例如上述 step 8中 向B写入,于是从B:1 变成 B:2, 其他节点的版本号不发生变更。

2、   每次同步数据(这里需要注意,同步和修改是不一样的写操作哦), 会有三种情况:

a: 本节点的向量版本都要比消息携带过来的向量版本低(小于或等于) 如本节点为 [A:1, B:2,C:3]}, 消息携带过来为  [A:1, B:2,C:4] 或  [A:2, B:3,C:4]等。 这时候合并规则取每个分量的最大值。

b:   本节点的向量版本都要比比消息携带过来的向量版本高,这时候可以认为本地数据比同步过来的数据要新,直接丢弃要同步的版本。

c:   出现冲突,如上述step 9中,有的分量版本大,有的分量版本小,无法判断出来到底谁是最新版本。就要进行冲突仲裁。

四、冲突解决

其实没有一个比较好的解决冲突的版本:就笔者目前所了解,加上时间戳算是一个策略。具体方法是再加一个维度信息:数据更新的时间戳(timestamp)。[A:1, B:2,C:4,ts:123434354] ,如果发生冲突,再比较一下两个数据的ts,大的数值说明比较后更新,选择它作为最终数据。并对向量时钟进行订正。

转载于:https://www.cnblogs.com/bonelee/p/6248102.html

向量时钟算法简介——本质类似MVCC相关推荐

  1. Dynamo涉及的算法和协议——p2p架构,一致性hash容错+gossip协议获取集群状态+向量时钟同步数据...

    转自:http://www.letiantian.me/2014-06-16-dynamo-algorithm-protocol/ Dynamo是Amazon的一个分布式的键值系统,P2P架构,没有主 ...

  2. 推荐系统算法_机器学习和推荐系统(二)推荐算法简介

    推荐算法简介 一. 基于人口统计学的推荐算法 二.基于内容的推荐算法 三. 基于协同过滤的推荐算法 协同过滤(Collaborative Filtering , CF) 基于近邻的系统过滤 基于用户( ...

  3. 推荐系统概述推荐系统算法简介

    文章目录 一. 推荐系统概述 1. 推荐系统目的 2. 推荐系统的应用 3. 推荐系统的基本思想 数据分析(数据源) 4. 推荐系统的分类 二. 推荐系统算法简介 1. 基于人口统计学的推荐算法 2. ...

  4. SPH算法简介: 对我的启蒙

    转自: https://thecodeway.com/blog/?p=83 https://thecodeway.com/blog/?p=139 https://thecodeway.com/blog ...

  5. 算法笔记:Kmeans聚类算法简介

    算法笔记:Kmeans聚类算法简介 1. Kmeans算法简介 2. Kmeans算法细节 3. Kmeans算法收敛性证明 4. Kmeans算法的变体 1. cosine距离变体 2. 点积距离版 ...

  6. 机器学习与数据挖掘,机器学习算法简介

    ​什么是数据挖掘 数据挖掘就是从大量的数据中去发现有用的信息,然后根据这些信息来辅助决策.听起来是不是跟传统的数据分析很像呢?实际上,数据挖掘就是智能化的数据分析,它们的目标都是一样的.但是,又有很大 ...

  7. Minimax 和 Alpha-beta 剪枝算法简介,及以此实现的井字棋游戏(Tic-tac-toe)

    前段时间用 React 写了个2048 游戏来练练手,准备用来回顾下 React 相关的各种技术,以及试验一下新技术.在写这个2048的过程中,我考虑是否可以在其中加入一个 AI 算法来自动进行游戏, ...

  8. NoSQL生态系统——一致性RWN协议,向量时钟,gossip协议监测故障

    13.5 一致性 在NoSQL中,通常有两个层次的一致性:第一种是强一致性,既集群中的所有机器状态同步保持一致.第二种是最终一致性,既可以允许短暂的数据不一致,但数据最终会保持一致.我们先来讲一下,在 ...

  9. Dynamo分布式系统——「RWN」协议解决多备份数据如何读写来保证数据一致性,而「向量时钟」来保证当读取到多个备份数据的时候,如何判断哪些数据是最新的这种情况...

    转自:http://blog.jqian.net/post/dynamo.html Dynamo是Amazon开发的一款高可用的分布式KV系统,已经在Amazon商店的后端存储有很成熟的应用.它的特点 ...

最新文章

  1. 卷积神经网络学习笔记与心得(4)池化
  2. left join 一对多_MYSQL 连接查询算法:JOIN语句在 MYSQL 内部到底是怎么执行的
  3. php run js,PHP switch 语句
  4. Java Web安全编码
  5. python在线投票系统 统计票数_python投票统计程序,统计序列中各个数值的份数,字典的应用。...
  6. 【VMware虚拟化解决方案】双网隔离虚拟化桌面解决方案
  7. 使用Maven Jenkins和JMeter自动化测试
  8. 三调 图斑地类面积_三调对于最小上图图斑面积的要求是:
  9. socket 编程篇六之IPO多路复用-select poll epoll
  10. wifi 信道_说了这么久的信道和频宽,这回总算能弄明白啦
  11. 实现Windows直接远程访问Ubuntu桌面和解决VNC连接Ubuntu桌面灰色的问题解决
  12. python file read和write的速度_python file.truncate() 然后 file.write() file.read() 出现乱码...
  13. 收到计算机系统公司退款会计分录,企业账户收到退款,怎么做账务处理?
  14. 如何删除Smartphone手机与Office同步后的重复项,如联系人、日程等。Keyword:office,Outlook,删除,重复项目...
  15. 拓端tecdat|Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析
  16. 计算机操作系统第四版课后题答案汤小丹
  17. python 爬虫3 新浪微博 爬虫 实战
  18. PHP 的 SAPI 是个什么东西(转)
  19. 大数据实时处理第一周课
  20. project 2016软件

热门文章

  1. php解析QQmv直链,网易云音乐直链解析API源代码^-^
  2. linux字符设备led驱动源码,字符设备驱动控制LED灯
  3. webpack创建html项目,从零开始其于webpack搭建bootstrap 4项目
  4. 计算机与十进制 教案,二进制与十进制间的转换教案
  5. html语言表格背景颜色,HTML_HTML表格标记教程(36):表头的背景色属性BGCOLOR,TH标记用于设定表格中某 - phpStudy...
  6. 从入门到精通的Java进阶学习笔记整理,不愧是大佬
  7. 【408预推免复习】操作系统之进程的描述与控制
  8. %fplot('Untitled1',[-1,2])画图
  9. micropython stm32f030_STM32F0单片机快速入门六 用库操作串口(UART)原来如此简单
  10. mybatis plus 事务管理器_Mybatis中的事务