Nosql 里亚克G计数器:Don';底层vclock是否提供相同的数据?

Nosql 里亚克G计数器:Don';底层vclock是否提供相同的数据?,nosql,distributed-computing,riak,vector-clock,crdt,Nosql,Distributed Computing,Riak,Vector Clock,Crdt,我一直在阅读,我知道Riak已经开始阅读Riak 2了 我的问题是:当Riak听起来像是与每个对象相关联的底层vclock记录相同的信息时,为什么要实现?结果不是一个gcounter存储在vclock中,每个都包含相同的基本信息吗 我现在唯一的猜测是Riak可能会对vClock进行垃圾收集,整理对于gcounter而言非常重要的信息(即增量的数量) 我不能很好地阅读Erlang,所以我可能错误地认为Riak使用这些特殊的数据类型存储vclock。但是,这个问题仍然适用于在标准Riak之上编写的(

我一直在阅读,我知道Riak已经开始阅读Riak 2了

我的问题是:当Riak听起来像是与每个对象相关联的底层
vclock
记录相同的信息时,为什么要实现?结果不是一个
gcounter
存储在
vclock
中,每个都包含相同的基本信息吗

我现在唯一的猜测是Riak可能会对
vClock
进行垃圾收集,整理对于
gcounter
而言非常重要的信息(即增量的数量)

我不能很好地阅读Erlang,所以我可能错误地认为Riak使用这些特殊的数据类型存储
vclock
。但是,这个问题仍然适用于在标准Riak之上编写的(因此继承
vclock
,并保留每个对象)

编辑:

此后,我撰写了以下文章,以更实际的方式帮助解释CVRDT。本文还涉及我在上面强调的冗余:


快速回答:Riak的计数器实际上是PN计数器,即它们允许递增和递减,因此不能像vclock一样实现,因为它们需要以不同的方式跟踪递增和递减

长答案:

这个问题表明您完全误解了g计数器和向量时钟(或向量版本)之间的区别

向量时钟(vclock)是一种用于跟踪数据段并发更新的因果关系的系统。它们是{actor=>logical clock}的映射。参与者仅在与之关联的数据发生更改时增加其逻辑时钟,并尝试尽可能少地增加(因此每次更新最多一次)。两个vClock可以是并发的,也可以一个控制另一个

g计数器是一种CvRDT,其结构类似于vclock,但有重要区别。它们被实现为{actor=>counter}的映射。演员可以随意增加自己的计数器。g计数器具有“计数器值”和“合并”的概念,因此当不同参与者执行并发操作时,他们可以计算出实际的“计数器值”应该是什么

重要的是,g计数器无法跟踪因果关系,vClock也不知道它们的“计数器值”是什么

将两者合并在一个代码库中不仅会令人困惑,而且还会带来错误

再加上riak实际上实现了pn计数器这一事实。区别在于g计数器只能递增,而pn计数器可以递增和递减。Pn计数器是{actor=>(increment count,decreation count)}的映射,它的结构显然与vclock不同。您只能增加这两个计数,因此为什么有两个而不是一个

  • Riak删减了版本向量,这对因果关系(假并发、更多同级、安全性)来说没什么大不了,但对计数器来说却是一场灾难

  • Riak的CRDT支持是通用的。我们将CRDT“隐藏”在常规riak对象中

  • Riak的CRDT支持已进入第一波,我们将在进一步发布时进一步优化


  • 顺便说一句,对于这样的问题,我们有一个很好的邮件列表。Stack Overflow有它的用途,但是如果你想和开源数据库的作者谈谈,为什么不使用他们的列表呢?由于Riak是开源的,您可以提交请求,我们很乐意将您的想法纳入代码库。

    感谢您提供的内幕信息-我将把以后的问题直接发送到邮件列表。迷人的产品,继续努力吧!:)感谢您的回答:)我发现区别在于vclock修剪,这是允许的,因为您描述的设计:用户不需要推断计数。不过,下面的说法并不准确:“重要的是,g计数器无法跟踪因果关系”。g计数器生成一个单调半格,每次更新形成一个新节点,就像vclock一样。另外:“参与者仅当与之关联的数据发生变化时才增加其逻辑时钟”-当关联的数据是一个增量g计数器时,每个g计数器的vclock将被包含。图形将对齐,并将其剪除。