【问题标题】:Does Consul key-value store give us any guarantees on ordering of two writes with two different keys?Consul 键值存储是否为我们提供了使用两个不同键对两次写入进行排序的任何保证?
【发布时间】:2026-01-05 01:05:02
【问题描述】:

假设我们只有两个节点 A 和 B。

当我们在节点A上发出这两个命令时,

$ curl -X PUT -d one .../v1/kv/key1
$ curl -X PUT -d two .../v1/kv/key2

(ie. PUT one key1 happens-before PUT two key2) 然后GET of /v1/kv/key2 在节点B 上返回two,是不是保证节点 B 上的 GET/v1/kv/key1 返回 one ?换句话说,Consul KVS 是否尊重节点 A 上两次写入之间的发生前关系?

Consul 使用共识协议来提供一致性(由 CAP 定义)。

是的,但我的理解是 CAP 定理不涉及多个寄存器。这两个写入可能最终传播到节点 B,但是否保证我们永远不会看到意外的中间状态?

【问题讨论】:

  • AFAIK Consul 只有一个 Raft 日志,这样可以确保无论资源如何,写入始终是相互排序的。仅仅因为共识的性质,人们就不得不竭尽全力使这些写入无序。
  • 不确定您是否需要,但 consul 0.7(刚刚发布)也有新的事务键/值 api - github.com/hashicorp/consul/blob/master/…

标签: distributed-system consistency consul eventual-consistency happens-before


【解决方案1】:

Consul 声称可线性化。 “所有服务器都参与 Raft 共识算法,以确保交易以一致、可线性化的方式发生。”

如果 put 的同步顺序与接收顺序不同,则在从另一个节点读取时,您可能会看到它们是乱序的,这违反了线性化保证。因此,应始终按顺序观察它们。

但是,由于decreasing a timeout value 已经“解决”了之前的线性化违规问题,然后在营销部门claiming Jepsen never found any bugs,我不会指望它可以完全线性化,至少在接下来的几年里是这样。

【讨论】:

最近更新 更多