2

我一直在阅读CvRDT,我知道 Riak 已经在 Riak 2 中添加了一些。

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

我现在唯一的猜测是,Riak 可能会垃圾收集对vclocksa 的目的实际上很重要的修剪信息gcounter(即增量的数量)。

我不能很好地阅读 Erlang,所以我可能错误地认为 Riakvclocks使用这些特殊数据类型进行存储。然而,这个问题仍然适用于在标准 Riak 之上编写的本土解决方案vclocks(因此继承每个持久的对象)。

编辑:

从那以后,我写了以下文章来帮助以更实用的方式解释 CvRDT。本文还涉及我上面强调的冗余:

无冲突的复制数据类型 (CRDT) - 一种易于理解的解释,数学较少。

4

2 回答 2

4
  1. Riak 修剪版本向量,对因果关系没有什么大不了的(错误并发、更多兄弟姐妹、安全),但对计数器来说是一场灾难。

  2. Riak 的 CRDT 支持是一般性的。我们将 CRDT“隐藏”在常规的 riak 对象中。

  3. Riak 的 CRDT 支持处于第一波,随着我们进一步发布,我们将进一步优化。

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

于 2014-02-11T07:54:10.227 回答
2

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

长答案:

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

矢量时钟 (vclock) 是一种用于跟踪对一条数据进行并发更新的因果关系的系统。它们是 {actor => 逻辑时钟} 的映射。Actor 仅在与它们关联的数据发生变化时增加其逻辑时钟,并尝试尽可能少地增加它(因此每次更新最多一次)。两个 vclock 可以是并发的,或者一个可以支配另一个。

g-counter 是一个 CvRDT,其结构看起来与 vclock 相同,但有重要区别。它们被实现为 {actor => counter} 的映射。Actor 可以根据需要增加自己的计数器。g-counter 具有“计数器值”的概念,以及“合并”的概念,因此当不同的参与者执行并发操作时,它们可以计算出实际的“计数器值”应该是什么。

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

在代码库中将两者混为一谈不仅会令人困惑,而且还会带来错误。

再加上 riak 实际上实现了 pn 计数器这一事实。不同之处在于 g-counter 只能递增,而 pn-counter 既可以递增也可以递减。Pn 计数器通过作为 {actor => (increment count, decrement count)} 的映射来工作,它更明显地具有与 vclock 不同的结构。您只能增加这两个计数,因此为什么有两个而不是一个。

于 2014-02-11T02:14:15.403 回答