Vector Clocks, 时间向量

Why Vector Clock are Easy or Hard?

Amazon's Dynamo, 4.4版本化的数据

 

常用的版本化技术

Timestamps seem to be an obvious solution for developing a chronological order. However, timestamps “rely on synchronized clocks and don’t capture causality” as Lipcon points out

Optimistic Locking implies that a unique counter or clock value is saved for each piece of data. When a client tries to update a dataset it has to provide the counter/clock-value of the revision it likes to update (cf. [K+10b]). As a downside of this procedure, the Project Voldemort development team notes that it does not work well in a distributed and dynamic scenario where servers show up and go away often and without prior notice.

悲观锁和乐观锁
http://www.cnblogs.com/guyufei/archive/2011/01/10/1931632.html
悲观锁:假定会发生并发冲突(悲观), 屏蔽一切可能违反数据完整性的操作
虽然简单安全, 但是当一个用户锁定记录的时候,会block所有其它用户

乐观锁: 假设不会发生并发冲突(乐观), 只在提交操作时检查是否违反数据完整性 
          可以随意的并发读取和修改, 只在数据提交的时候通过数据版本判断是否存在冲突

两种锁并没有好坏之说, 在于使用的场景更符合哪种假设, 如果符合悲观假设, 那么使用乐观锁可能效率更低 
当然两者都必须依赖master来保证锁机制, 本质上都是主从结构, 所以都会有单点问题 
当然好处是两者都能保证全序

Vector Clocks are an alternative approach to capture order and allow reasoning between updates in a distributed system. 
向量时钟也是一种乐观锁, 只是更通用, 因为不依赖于master, 基于因果关系的狭义相对论 
所以他只能保证偏序 
发生冲突时, 必须依靠client去做resolve以达成全序

Multiversion Storage means to store a timestamp for each table cell. 
These timestamps “don’t necessarily need to correspond to real life”, but can also be some artificial values that can be brought into a definite order. For a given row multiple versions can exist concurrently. Besides the most recent version a reader may also request the “most recent before T” version. This provides “optimistic concurrency control with compare-and-swap on timestamps” and also allows to take snapshots of datasets (cf. [Lip09, slide 20]) 
其实多版本存储和乐观锁的区别在于, 提交的时候它允许冲突, 并不会试图解决冲突. 
而是采用另外一种方法, 把所有版本都保存下来, 即保存版本之间的偏序关系 
但实际上这并不真正解决问题, 只是把冲突解决的时机延迟, 当用户使用时, 自己选择使用什么版本, 即做冲突解决

 

Vector Clocks

Vector clocks is an algorithm for generating a partial ordering of events in a distributed system and detecting causalityviolations.

其实vector clocks就是Lamport的偏序理论的一个实际应用 
具体的使用方法, 参考, 
Why Vector Clock are Easy or Hard?

A vector clock is defined as a tuple V [0], V [1], ..., V [n] of clock values from each node (cf. [Lip09, slide18]).

In a distributed scenario node i maintains such a tuple of clock values, which represent the state of itself and the other (replica) nodes’ state as it is aware about at a given time (Vi[0] for the clock value of the first node, Vi[1] for the clock value of the second node, . . . Vi[i] for itself, . . . Vi[n] for the clock value of the last node).

时钟向量, 表示的含义由下面这个图很好的表示出来.

通过一个向量, 不但记录了当前节点上该数据的version, 还记录了其他节点该数据的版本情况(不一定是最新的)

 

本文章摘自博客园,原文发布日期: 2013-04-13

时间: 2024-09-16 17:56:58

Vector Clocks, 时间向量的相关文章

NoSQL Databases技术资料整理汇总

0 Reference NoSQL论文 在 Stuttgart Media 大学的 Christof Strauch 历时8个月(2010年6月-2011年2月)完成了一篇150页长的NoSQL相关的论文, 对NoSQL的各个方面做了探讨 http://www.christof-strauch.de/nosqldbs.pdf 分布式系统领域经典论文翻译集 http://duanple.blog.163.com/blog/static/709717672011330101333271/ 2010

详解Java编程中向量(Vector)的应用_java

Vector(向量)是 java.util 包中的一个类,该类实现了类似动态数组的功能. 向量和数组相似,都可以保存一组数据(数据列表).但是数组的大小是固定的,一旦指定,就不能改变,而向量却提供了一种类似于"动态数组"的功能,向量与数组的重要区别之一就是向量的容量是可变的. 可以在向量的任意位置插入不同类型的对象,无需考虑对象的类型,也无需考虑向量的容量. 向量和数组分别适用于不同的场合,一般来说,下列场合更适合于使用向量: 如果需要频繁进行对象的插入和删除工作,或者因为需要处理的对

Why Vector Clock are Easy or Hard?

通过实际例子来阐述vector clock其实是容易理解的, easy  同样通过实际例子来描述在使用vector clock时会遇到哪些难以解决的问题, hard Why Vector Clocks are Easy http://basho.com/blog/technical/2010/01/29/why-vector-clocks-are-easy/ Vector Clocks by Example 通过如下日常的例子来帮助理解vector clock, 你会发现其实这个算法并不复杂. 

学习笔记DL004:标量、向量、矩阵、张量,矩阵、向量相乘,单位矩阵、逆矩阵

线性代数,面向连续数学,非离散数学.<The Matrix Cookbook>,Petersen and Pedersen,2006.Shilov(1977). 标量.向量.矩阵.张量. 标量(scalar).一个标量,一个单独的数.其他大部分对象是多个数的数组.斜体表示标量.小写变量名称.明确标量数类型.实数标量,令s∊ℝ表示一条线斜率.自然数标量,令n∊ℕ表示元素数目. 向量(vector).一个向量,一列数.有序排列.次序索引,确定每个单独的数.粗体小写变量名称.向量元素带脚标斜体表示.

STL之二:vector容器用法详解

    vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组.像数组一样,vector类也用从0开始的下标表示元素的位置:但和数组不同的是,当vector对象创建后,数组的元素个数会随着vector对象元素个数的增大和缩小而自动变化.     vector类常用的函数如下所示:     1.构造函数 vector():创建一个空vector vector(int nSize):创建一个vector,元素个数为nSize vector(int nSize,const t& t):

Java中vector理解1——vector的用法

Vector可实现自动增长的对象数组. java.util.vector提供了向量类(vector)以实现类似动态数组的功能.在Java语言中没有指针的概念,但如果正确灵活地使用指针又确实可以大大提高程序的质量.比如在c,c++中所谓的"动态数组"一般都由指针来实现.为了弥补这个缺点,Java提供了丰富的类库来方便编程者使用,vector类便是其中之一.事实上,灵活使用数组也可以完成向量类的功能,但向量类中提供大量的方法大大方便了用户的使用. 创建了一个向量类的对象后,可以往其中随意插

Java编程中的vector类用法学习笔记_java

java.util.vector提供了向量类(vector)以实现类似动态数组的功能.在Java语言中没有指针的概念,但如果正确灵活地使用指针又确实可以大大提高程序的质量.比如在c,c++中所谓的"动态数组"一般都由指针来实现.为了弥补这个缺点,Java提供了丰富的类库来方便编程者使用,vector类便是其中之一.事实上,灵活使用数组也可以完成向量类的功能,但向量类中提供大量的方法大大方便了用户的使用. 创建了一个向量类的对象后,可以往其中随意插入不同类的对象,即不需顾及类型也不需预先

STL——vector

vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组.像数组一样,vector类也用从0开始的下标表示元素的位置:但和数组不同的是,当vector对象创建后,数组的元素个数会随着vector对象元素个数的增大和缩小而自动变化.     vector类常用的函数如下所示:     1.构造函数 vector():创建一个空vector vector(int nSize):创建一个vector,元素个数为nSize vector(int nSize,const t& t):创建一个

Dynamo: Amazon’s Highly Available Key-value Store

www.allthingsdistributed.com/2007/10/amazons_dynamo.html , 英文版 http://blog.163.com/woshitony111@126/blog/static/71379539201231492557944/ , 中文版   1 Overview Amazon服务平台中的许多服务只需要主键访问数据存储. 对于许多服务, 如提供最畅销书排行榜, 购物车, 客户的偏好, 会话管理, 销售等级, 产品目录, 常见的使用关系数据库的模式会导