consul - 使用 consul 锁定 KV

标签 consul consul-kv

我试图在更新 consul 的 KV 对时获取它的锁,所以没有其他人可以更新它。

最初我有

curl -XGET http://localhost:8500/v1/kv/hosts?raw
{"k1":"v1"}

现在我得到一个 session
curl -XPUT http://localhost:8500/v1/session/create
{"ID":"9ed55585-ddda-4605-a926-d1e0b57a9919"}

然后我获得了对 KV 的锁
curl -XPUT http://localhost:8500/v1/kv/hosts?acquire=9ed55585-ddda-4605-a926-d1e0b57a9919

现在,当我发布并执行 GET 时,我的值为空
curl -XPUT http://localhost:8500/v1/kv/hosts?release=9ed55585-ddda-4605-a926-d1e0b57a9919

curl -XGET http://localhost:8500/v1/kv/hosts?raw => This returns empty

我在这里做错了什么。

最佳答案

你什么也得不到,因为你没有发送任何数据写入在您的 PUT向 kv 商店请求。

这是相同的命令,带有一些 pretty-print 。

创建 session

 curl --request PUT http://localhost:8500/v1/session/create
 {"ID":"3619d9fd-8b8f-0b89-acdf-8d752b38a754"}

写一个值

使用 Linux 的“此处文件”,我将在 host 下写入值“Hello, World”。 key 。请记住使用您从上一个命令返回的 session ID。将 3 行复制/粘贴为一个单元。
curl --request PUT http://localhost:8500/v1/kv/host?acquire=3619d9fd-8b8f-0b89-acdf-8d752b38a754 --data @- << EOF
Hello, World
EOF

读回值

阅读只是一个 GET,我通过管道传输到一台 pretty-print 。
curl -s http://localhost:8500/v1/kv/host| python -m json.tool
[
    {
        "CreateIndex": 3832257,
        "Flags": 0,
        "Key": "host",
        "LockIndex": 1,
        "ModifyIndex": 3832260,
        "Session": "3619d9fd-8b8f-0b89-acdf-8d752b38a754",
        "Value": "SGVsbG8sIFdvcmxk"
    }
]

那个base64 blob是我们第一次写的数据
echo "SGVsbG8sIFdvcmxk" | openssl base64 -d -A
Hello, World

尝试在没有锁的情况下写入值

这不像你想的那样工作。 K/V documentation说这个

an update that does not include the acquire parameter will proceed normally even if another session has locked the key



删除 session

您可以为 session 设置 TTL 并等待它过期,但让我们删除它。
curl --request PUT http://localhost:8500/v1/session/destroy/3619d9fd-8b8f-0b89-acdf-8d752b38a754

该值仍然存在,但不再与 session 相关联:
curl -s http://localhost:8500/v1/kv/host| python -m json.tool
[
    {
        "CreateIndex": 3832257,
        "Flags": 0,
        "Key": "host",
        "LockIndex": 0,
        "ModifyIndex": 3832331,
        "Value": "SGVsbG8sIFdvcmxk"
    }
]

如果您希望在 session 过期或被删除时删除 key ,请指定 "Behavior": "delete"创建 session 时
curl --request PUT http://localhost:8500/v1/session/create --data @- << EOF
{
    "Name": "Helps with debugging",
    "Behavior": "delete",
    "TTL": "2m"
}
EOF
{"ID":"45c17b06-b632-d17f-b0af-b2bee8f82511"}

关于consul - 使用 consul 锁定 KV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46330209/

相关文章:

领事基础知识 : What is a service and how to I make one?

kubernetes - 使用Consul存储kubernetes容器的环境变量

spring-boot - Spring Boot 应用程序的 Consul 服务发现问题

consul - 使 Consul UI 只读

ssl - Hashicorp Consul - 如何从 Kubernetes 集群中的 Pod 中执行经过验证的 TLS

spring-boot - consul first bootstrap with spring cloud 配置

consul - Traefik Consul 集成中的多个前端规则

consul - 如何使用 consul http api 获得 consul kv get -recurse 的相同结果?

docker - 可以在启动时初始化Consul键值存储吗?

java - 使用 spring-cloud-consul 从 consul 读取空字符串