向量时钟算法简介——本质类似MVCC
一、使用背景
先说一下需要用到向量时钟的场景。我们在写数据时候,经常希望数据不要存储在单点。如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会把数据同步给B和C;于是最终同步结果如下
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把更新同步给A和B,因为某些问题,只同步到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相关推荐
- Dynamo涉及的算法和协议——p2p架构,一致性hash容错+gossip协议获取集群状态+向量时钟同步数据...
转自:http://www.letiantian.me/2014-06-16-dynamo-algorithm-protocol/ Dynamo是Amazon的一个分布式的键值系统,P2P架构,没有主 ...
- 推荐系统算法_机器学习和推荐系统(二)推荐算法简介
推荐算法简介 一. 基于人口统计学的推荐算法 二.基于内容的推荐算法 三. 基于协同过滤的推荐算法 协同过滤(Collaborative Filtering , CF) 基于近邻的系统过滤 基于用户( ...
- 推荐系统概述推荐系统算法简介
文章目录 一. 推荐系统概述 1. 推荐系统目的 2. 推荐系统的应用 3. 推荐系统的基本思想 数据分析(数据源) 4. 推荐系统的分类 二. 推荐系统算法简介 1. 基于人口统计学的推荐算法 2. ...
- SPH算法简介: 对我的启蒙
转自: https://thecodeway.com/blog/?p=83 https://thecodeway.com/blog/?p=139 https://thecodeway.com/blog ...
- 算法笔记:Kmeans聚类算法简介
算法笔记:Kmeans聚类算法简介 1. Kmeans算法简介 2. Kmeans算法细节 3. Kmeans算法收敛性证明 4. Kmeans算法的变体 1. cosine距离变体 2. 点积距离版 ...
- 机器学习与数据挖掘,机器学习算法简介
什么是数据挖掘 数据挖掘就是从大量的数据中去发现有用的信息,然后根据这些信息来辅助决策.听起来是不是跟传统的数据分析很像呢?实际上,数据挖掘就是智能化的数据分析,它们的目标都是一样的.但是,又有很大 ...
- Minimax 和 Alpha-beta 剪枝算法简介,及以此实现的井字棋游戏(Tic-tac-toe)
前段时间用 React 写了个2048 游戏来练练手,准备用来回顾下 React 相关的各种技术,以及试验一下新技术.在写这个2048的过程中,我考虑是否可以在其中加入一个 AI 算法来自动进行游戏, ...
- NoSQL生态系统——一致性RWN协议,向量时钟,gossip协议监测故障
13.5 一致性 在NoSQL中,通常有两个层次的一致性:第一种是强一致性,既集群中的所有机器状态同步保持一致.第二种是最终一致性,既可以允许短暂的数据不一致,但数据最终会保持一致.我们先来讲一下,在 ...
- Dynamo分布式系统——「RWN」协议解决多备份数据如何读写来保证数据一致性,而「向量时钟」来保证当读取到多个备份数据的时候,如何判断哪些数据是最新的这种情况...
转自:http://blog.jqian.net/post/dynamo.html Dynamo是Amazon开发的一款高可用的分布式KV系统,已经在Amazon商店的后端存储有很成熟的应用.它的特点 ...
最新文章
- 卷积神经网络学习笔记与心得(4)池化
- left join 一对多_MYSQL 连接查询算法:JOIN语句在 MYSQL 内部到底是怎么执行的
- php run js,PHP switch 语句
- Java Web安全编码
- python在线投票系统 统计票数_python投票统计程序,统计序列中各个数值的份数,字典的应用。...
- 【VMware虚拟化解决方案】双网隔离虚拟化桌面解决方案
- 使用Maven Jenkins和JMeter自动化测试
- 三调 图斑地类面积_三调对于最小上图图斑面积的要求是:
- socket 编程篇六之IPO多路复用-select poll epoll
- wifi 信道_说了这么久的信道和频宽,这回总算能弄明白啦
- 实现Windows直接远程访问Ubuntu桌面和解决VNC连接Ubuntu桌面灰色的问题解决
- python file read和write的速度_python file.truncate() 然后 file.write() file.read() 出现乱码...
- 收到计算机系统公司退款会计分录,企业账户收到退款,怎么做账务处理?
- 如何删除Smartphone手机与Office同步后的重复项,如联系人、日程等。Keyword:office,Outlook,删除,重复项目...
- 拓端tecdat|Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析
- 计算机操作系统第四版课后题答案汤小丹
- python 爬虫3 新浪微博 爬虫 实战
- PHP 的 SAPI 是个什么东西(转)
- 大数据实时处理第一周课
- project 2016软件
热门文章
- php解析QQmv直链,网易云音乐直链解析API源代码^-^
- linux字符设备led驱动源码,字符设备驱动控制LED灯
- webpack创建html项目,从零开始其于webpack搭建bootstrap 4项目
- 计算机与十进制 教案,二进制与十进制间的转换教案
- html语言表格背景颜色,HTML_HTML表格标记教程(36):表头的背景色属性BGCOLOR,TH标记用于设定表格中某 - phpStudy...
- 从入门到精通的Java进阶学习笔记整理,不愧是大佬
- 【408预推免复习】操作系统之进程的描述与控制
- %fplot('Untitled1',[-1,2])画图
- micropython stm32f030_STM32F0单片机快速入门六 用库操作串口(UART)原来如此简单
- mybatis plus 事务管理器_Mybatis中的事务