伏地魔计划的不一致解决器何时启动?

Posted

技术标签:

【中文标题】伏地魔计划的不一致解决器何时启动?【英文标题】:When does Project Voldemort's InconsistencyResolver kick in? 【发布时间】:2013-06-15 20:37:50 【问题描述】:

我正在开发一个基本上需要存储 Map<String,Set<String>> 的应用程序(嗯,它比这要复杂得多,但这是基本思想),我打算做很多

Set<String> strings = storeClient.get("some key");
strings.add("some string");
storeClient.put("some key", strings);

所以我想了解的是,StoreClient#put 何时会创建一个将由InconsistencyResolver 解决的不一致,而StoreClient#put 何时会破坏该值?

【问题讨论】:

【参考方案1】:

免责声明:我很长时间没有使用 Voldemort,现在在 Basho on Riak 工作。也就是说,我认为这将是一个很容易通过引用来回答的问题,但是缺乏真正的文档(以及构建谷歌搜索的困难返回的东西关于哈利波特)实际上提出了一个真正的挑战——你提出了一个非常好的问题。我相信以下是正确的。

因为您谈论的是put() 的版本,您没有发送版本(矢量时钟)并且不在乎数据库中是否或当前是什么......基本上它只是要覆盖任何东西(如果有的话)在那里。

在他们的架构中,他们对任何给定(散列)密钥都有一个主(协调)节点的概念,他们总是先写,然后再复制到环上的其他节点,这允许他们覆盖/清除任何先前版本的值.我猜他们正在将此比较作为 CAS 或其他受保护的(通过锁)操作来防止任何并发问题。当使用 BerkeleyDB 后端时,他们很可能只是在使用其内置的事务/锁定机制。鉴于此,您应该很少遇到客户端需要解决它们的冲突值/版本。

但是,根据this post from Jay Kreps,他说:

...并发 当不同的客户端(或请求路由器)不同意时会出现版本 特定服务器是否可用。在一般情况下 这不会发生——每个密钥都有一个主服务器,我们总是写 首先到该服务器,这使我们可以立即进行垃圾收集 任何旧版本。然而,如果一位作家认为 主人倒了,另一个人认为它是起来的,这些都是可能的 两台服务器接受冲突的写入。有必要将 存储引擎有能力保留这两个版本,直到 客户可以解决它们。

这就是InconsistencyResolver 的用武之地。

当使用 put() 的版本时,您还从先前的 get 中发送版本,(主)服务器将返回一个指示该版本已过时的指示符,并且客户端将抛出一个 ObsoleteVersionException。尽管如此,在节点故障/恢复的情况下......可能并发版本可能在集群中,并且只有客户端可以通过InconsistencyResolver 解决它们。

【讨论】:

谢谢!很好的答案!所以听起来我想做的事情是使用project-voldemort.com/voldemort/javadoc/all/voldemort/client/…,它只会继续尝试应用更新,直到它不会失败。

以上是关于伏地魔计划的不一致解决器何时启动?的主要内容,如果未能解决你的问题,请参考以下文章

正确使用伏地魔作为键值对?

伏地魔 HTTP 服务

伏地魔运行时间错误

带有伏地魔罐子的 Maven 存储库

rontab踩坑:crontab定时任务调度机制与系统时间/时区的不一致

使用 xcode 9.2 的情节提要中的不一致错误