Consul KV 键值存储

Consul 自带一个轻量键值存储,常用来放动态配置与功能开关,配合 Consul Template(第 11 章)还能把 KV 变化自动渲染成配置文件,实现配置热更新。

命令行基本操作

put/get/delete 三条命令覆盖读写删:

consul kv put app/port 8080
# 输出:Success! Data written to: app/port
consul kv get app/port
# 输出:8080
consul kv put app/port 9090           # 覆盖写
consul kv delete app/port
# 输出:Success! Deleted key: app/port
consul kv get -recurse app            # 递归读取某前缀下全部键

Key 的层级结构

key 用斜杠组织成类似目录的层级,但并没有真正的目录,/ 只是名字的一部分:

用途示例
app/port应用监听端口
app/debug功能开关,true/false
redis/host下游依赖的地址
consul kv put app/port 8080
consul kv put app/debug true
consul kv get -recurse app
# 输出:app/debug:true
# 输出:app/port:8080

HTTP API 与原子操作

KV 也走 HTTP 接口:GET/PUT/DELETE /v1/kv/<key>,加 ?recurse 递归。consul kv put 的 -cas 参数做原子比较写:仅当当前版本等于指定 index 才写入,避免并发覆盖。

锁的语义由会话(session)提供:先创建会话,再用 acquire/release 抢放锁,多个 worker 抢同一任务时只有一个能成功:

# 创建会话(记住返回的会话 ID)
curl -X PUT http://127.0.0.1:8500/v1/session/create -d '{"Name":"job-lock"}'
# 输出:{"ID":"8f8c9c3e-..."}   ← 记下这个 ID
# 抢锁:acquire 参数带上会话 ID,写成功返回 true
curl -X PUT "http://127.0.0.1:8500/v1/kv/job/lock?acquire=8f8c9c3e-..." -d owner1
# 输出:true
# 释放锁;持有会话的节点若挂掉,锁也会被自动释放
curl -X PUT "http://127.0.0.1:8500/v1/kv/job/lock?release=8f8c9c3e-..."

典型场景

  • 功能开关:改一个 KV 值全局即时生效,无需发版;
  • 动态配置:数据库地址、限流阈值放 KV,服务启动读取或监听变化;
  • 简易选主:结合会话锁在多个 worker 中选出唯一执行者。

大小限制提醒

单条 KV 值上限 512KB,别当数据库用。超大、高吞吐的数据应放 Redis/数据库,KV 只放小而关键的信息;整体迁移可用 consul kv export/import 导出导入。

小结

KV 适合放"小而变"的配置与开关,斜杠组织路径,CAS 与会话锁支撑简单协调。超过 512KB 或写频繁的场景交给专用存储,各归其位才能发挥 Consul 的价值。

笔记加载中…