etcd - 如何使用 etcd 进行原子更新

标签 etcd raft

我试图理解 etcd 上的“原子”更新是什么。

当我想到“原子”时,我认为有一个“之前”和一个“之后”(没有期间,如果更新失败,它仍然是“之前”)。

这是一个例子:

curl -s -XPUT http://localhost:2379/v2/keys/message -d value='Hidee Ho'

因此,此时任何人都可以访问该消息并获取当前值:

curl -s http://localhost:2379/v2/keys/message
{"action":"get","node":{"key":"/message","value":"Hidee Ho","modifiedIndex":4748,"createdIndex":4748}}

稍后,我可以修改这个值,如下所示:

curl -s -XPUT http://localhost:2379/v2/keys/message -d value='Mr Hanky'

并且可以像以前一样获取结果。在我的更改之前,值“Hidee Ho”返回,更改后值“Mr Hanky”返回。所以,我的问题是我能保证其中一个结果吗?也就是说,我想确认将返回其中一个(而不是结果之间的nil值)。

我并不特别关心时间。如果我执行 Mr Hanky 更新,并且随后的值 getter 在(短)一段时间内继续获取 Hidee Ho,那就可以了。

我很困惑,因为协议(protocol)中有一个原子CompareAndSwap函数。据我所知,与其说它是原子的,不如说它是“仅在值符合我所说的情况下才进行更新”。就我而言,我不太关心过去的值(value)是多少。我只是想知道它已更改,并且读者不会看到除了“之前”或“之后”值之外的任何内容。

最佳答案

您是正确的,因为纯 PUT 是原子的,因为客户端只会看到以前的值或新值。

CompareAndSwap 功能允许您进行乐观锁定,以便您可以写入依赖于先前值的新值,例如一个柜台。如果您要在不使用 CompareAndSwap 的情况下实现计数器,则会有类似 write("count", 1 + read("count")) 的内容,在这种情况下,读取和写入是分开的,如果两个调用者同时执行此操作,那么他们可能都会看到相同的起始值,并且您会丢失其中一个增量。使用 CAS,调用者可以说仅当先前的值为 11 时才将其设置为 12,现在如果这种情况同时发生,其中一个写入将失败,然后它可以重新读取并重新应用其增量,这样您就不会丢失任何增量。

关于etcd - 如何使用 etcd 进行原子更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30809058/

相关文章:

go - 使用 Kite 和 Kontrol 的分布式微服务

database - 使用 etcd 作为主要存储/数据库?

cluster-computing - 高级主选举算法与欺凌算法相比有什么好处?

angularjs - Node.js 的共识算法

raft - 关于 raft 算法的困惑

service - 当面向消息的中间件完成这项工作时,为什么还要为服务发现而烦恼?

docker - 如何从 CoreOS 上的 docker 镜像中的快照恢复 etcd 集群?

kubernetes - 从 etcdctl 获取 ETCD 指标

docker - 在Docker swarm模式下,有没有办法从worker那里获取管理者的信息?

共识算法 : what will happen if an odd cluster becomes even because of a node failure?