version stamp(版本戳)

版本戳产生的动机:

在分布式环境下,一份数据会存在多份拷贝。在对数据进行更新时,就可能会存在多个副本中的数据不一致的现象,这包含以下两种情形:

1. 某些节点中的数据已经更新,有些节点中的数据没有被更新。

2. 两个节点都已经更新,但是他们更新的内容出现了不一致。

这样就会产生一个问题,如果一个用户同时读取这两个节点中的数据,就会发现所读取出来的数据是不相同的。所以,用户需要决定所读出来的数据哪个是新的哪个是旧的,由此取出新的数据。为此,引入版本戳来标识数据的新旧版本。

版本戳的产生方法:

  1. 计数器,由一个主节点来产生计数器的值,分发给所有的从节点。如果在从节点中对数据进行了更新,就把计数器的值加1. 由主节点来产生计数器的值的主要原因在于,保证所有的从节点拥有相同的版本升级方法(计数器值大的版本一定要比计数值小的版本新)。
  2. timestamp,这种方法的主要困难在于,所有的节点需要保持一致的时间。如果一个节点的时间不同步,就会导致全局的错误。同时,时间戳的精度问题也是需要考虑的,如果在一个更新非常频繁(一毫秒内可能进行多次更新)的场合中,就必须控制时间戳的精度更大。
  3. GUID,产生一个全局唯一的ID,比如说根据日期,硬件信息等产生一个全局唯一的ID。这种方法的主要问题在于,GUID 比较大,同时,无法通过直接比较来判断版本的新旧。
  4. 根据内容产生一个hashcode。这种方法的问题与GUID的问题是类似的。

如何使用版本戳:

引入一个条件更新的概念,一般的操作是先读取一个数据,再对数据进行写入操作。如果这两个操作不是事务性的原子操作的话,那么就可能存在时间窗口,在写入数据之前这个数据已经发生了变化,而不是之前所读取的数据了。

所以,可能使用条件更新的方法,在写入之前判断当前的数据是否已经发生修改,而这个判断的依据就是版本戳。

主要困难:产生一个所有节点都共享的版本顺序变化规则。

在主从模式下,可以通过主节点产生版本戳进行分发。

  1. 但是,在对等模型中,就不存在主节点的概念了。所以引入的是“版本戳数组 ”,为每个节点都产生一个数组中的元素。比如,如果有三个节点,blue, green, red,那么每个节点在局部进行数据修改的时候,就相应地改变这个节点上的版本。接着把这个数据修改的信息通知到其他所有的节点,方法是,两个节点之间交换“版本戳数组”。比如:一个节点A的数组是:[blue:1 , green:2, red:3], 另一个节点B的数组是:[blue:2, green:2, red:3],就可以知道节点B中的数据是更新的。
  2. 使用版本戳数组,还可以发现写入冲突。比如:一个节点A的数组是:[blue :1 , green:2, red:3], 另一个节点B的数组是:[blue :2, green:1, red:3]. 也就是说,这个新的数据已经在green 节点中进行了更新,同时又在blue中进行了更新,因此就产生了冲突。但是版本戳数组无法对这种冲突进行解决。
时间: 2024-08-25 21:14:03

version stamp(版本戳)的相关文章

NOSQL(五)版本戳

<NoSQL精粹>读书笔记,转载请注明出处<jiq?钦's technical Blog> "事务"是一个有用的工具,可以保证数据的强一致性,对于NoSQL不支持事务这一点,很多NoSQL支持者并不担心,因为面向聚合的NoSQL数据库中以聚合为单位的数据更新操作是原子的. 1"事务"的局限性 "事务"也有其局限性,有些更新操作无法封装到一个事务中,因为那会导致事务的打开时间过长.考虑这样一个例子,用户浏览商品时,看中了一个

nginx的Mainline version、Stable version、Legacy version的版本区别

nginx的Mainline version.Stable version.Legacy version的版本区别 创建时间:2014-01-16 10:30:37最后修改:2014-09-23 20:13:44 Nginx官网提供了三个类型的版本Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版Stable version:最新稳定版,生产环境上建议使用的版本Legacy versions:遗留的老版本的稳定版 nginx下载地址:http:

Unsupported major.minor version (jdk版本错误)解决方案 办法

如果你遇到了 Unsupported major.minor version ,请认真看一下,说不定会有帮助. 我花两个小时总结的经验,你可能10分钟就得到了. ^**^ 一.错误现象: 当改变了jdk版本时,在编译java时,会遇到Unsupported major.minor version错误.错误信息如下 : Unsupported major.minor version 50.0Unsupported major.minor version 49.0 (我在jdk1.4 和1.5切换时

[LeetCode] Compare Version Numbers 版本比较

Compare two version numbers version1 and version1.If version1 > version2 return 1, if version1 < version2 return -1, otherwise return 0. You may assume that the version strings are non-empty and contain only digits and the . character.The . characte

Vue packages version mismatch: 版本始终不对的解决方案

error  in ./src/pages/home.vue Module build failed: Error: Vue packages version mismatch: - [email protected] - vue-template-compiler@2.5.13 This may cause things to work incorrectly. Make sure to use the same version for both. If you are using [emai

java -version显示版本和JAvA_HOME配置不一样

当你需要安装多个版本的jdk时,可能会遇到更改了JAVA_HOME后java -version不变的情况. 一般情况下,将你的JAVA_HOME改为你要用的jdk的安装路径,然后你使用的就是这个版本的JDK.但是有时候你会发现更改了JAVA_HOME后java -version不变. 可能原因: path的路径中,有的路径目录下也包含java.exe,然后该路径在%JAVA_HOME%\bin的前面,故运行时优先选择前面路径下的java.exe,所以无论如何改JAVA_HOME,java -ve

C# winform webbrowser如何指定内核为IE11? 输出 this.webbrowser.Version 显示版本是IE11的,但实际版本不是啊! 网上打的修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULA

最佳答案 1)假设你应用程序的名字为MyApplication.exe 2)运行Regedit,打开注册表,找到 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION 3)添加以下项 IE各版本的值如下: 11001 (0x2EDF) Internet Explorer 11. Webpages are displayed

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

1.背景 在多个项目中,当我方接口给其他部门人员使用时出现了插入数据失败或者插入的数据在WMTS请求中无法显示出来的问题.针对这些问题,我在这篇文章中,将详细描述造成以上问题的原因.在此WebGIS产品的前台和后台接口中,此插入数据核心部分均是FeatureServer请求.所以我们首先对FeatureSever服务做一个大致的了解. 2.FeatureServer服务的大致了解 2.1 FeatureServer服务提供的功能 FeatureServer服务可以提供如下几种服务: 我们可以得出

lsb_release -a 查询Linux系统版本

LSB是Linux Standard Base的缩写,lsb_release命令用来显示LSB和特定版本的相关信息.如果使用该命令时不带参数,则默认加上-v参数.-v, --version显示版本信息-i, --id显示发行版的ID-d, --description显示该发行版的描述信息-r, --release显示当前系统是发行版的具体版本号-c, --codename发行版代号-a, --all显示上面的所有信息-h, --help显示帮助信息如果当前发行版是LSB兼容的,那么"/etc/l