使用 consul 锁定 KV
Locking a KV with consul
我正在尝试在更新时在 consul 上获取 KV 对的锁,因此没有其他人可以更新它。
最初我有
curl -XGET http://localhost:8500/v1/kv/hosts?raw
{"k1":"v1"}
现在我得到一个会话
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 存储。
这里是相同的命令,但有一些漂亮的打印。
创建会话
curl --request PUT http://localhost:8500/v1/session/create
{"ID":"3619d9fd-8b8f-0b89-acdf-8d752b38a754"}
写一个值
使用 Linux "here file",我将在 host
键下写入值 "Hello, World"。请记住使用您从上一个命令返回的会话 ID。 Copy/Paste 3 行为一个单元。
curl --request PUT http://localhost:8500/v1/kv/host?acquire=3619d9fd-8b8f-0b89-acdf-8d752b38a754 --data @- << EOF
Hello, World
EOF
读回值
读取只是一个 GET,我通过管道将其传输到一台漂亮的打印机。
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
删除会话
您可以为您的会话设置一个 TTL 并等待它过期,但让我们删除它。
curl --request PUT http://localhost:8500/v1/session/destroy/3619d9fd-8b8f-0b89-acdf-8d752b38a754
该值仍然存在,但不再与会话关联:
curl -s http://localhost:8500/v1/kv/host| python -m json.tool
[
{
"CreateIndex": 3832257,
"Flags": 0,
"Key": "host",
"LockIndex": 0,
"ModifyIndex": 3832331,
"Value": "SGVsbG8sIFdvcmxk"
}
]
如果要在会话过期或删除时删除密钥,请在创建会话时指定"Behavior": "delete"
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 上获取 KV 对的锁,因此没有其他人可以更新它。
最初我有
curl -XGET http://localhost:8500/v1/kv/hosts?raw
{"k1":"v1"}
现在我得到一个会话
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 存储。
这里是相同的命令,但有一些漂亮的打印。
创建会话
curl --request PUT http://localhost:8500/v1/session/create
{"ID":"3619d9fd-8b8f-0b89-acdf-8d752b38a754"}
写一个值
使用 Linux "here file",我将在 host
键下写入值 "Hello, World"。请记住使用您从上一个命令返回的会话 ID。 Copy/Paste 3 行为一个单元。
curl --request PUT http://localhost:8500/v1/kv/host?acquire=3619d9fd-8b8f-0b89-acdf-8d752b38a754 --data @- << EOF
Hello, World
EOF
读回值
读取只是一个 GET,我通过管道将其传输到一台漂亮的打印机。
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
删除会话
您可以为您的会话设置一个 TTL 并等待它过期,但让我们删除它。
curl --request PUT http://localhost:8500/v1/session/destroy/3619d9fd-8b8f-0b89-acdf-8d752b38a754
该值仍然存在,但不再与会话关联:
curl -s http://localhost:8500/v1/kv/host| python -m json.tool
[
{
"CreateIndex": 3832257,
"Flags": 0,
"Key": "host",
"LockIndex": 0,
"ModifyIndex": 3832331,
"Value": "SGVsbG8sIFdvcmxk"
}
]
如果要在会话过期或删除时删除密钥,请在创建会话时指定"Behavior": "delete"
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"}