乐闻世界logo
搜索文章和话题

Consul 的键值存储(KV Store)有哪些应用场景?如何使用

2月21日 16:12

Consul 的键值存储(KV Store)是一个功能强大的分布式配置中心,提供了动态配置管理、服务协调、领导选举等功能。

基本概念

Consul KV Store 是一个类似 etcd 的分布式键值存储系统,具有以下特点:

  • 分布式:数据在多个 Consul Server 节点间复制
  • 强一致性:通过 Raft 协议保证数据一致性
  • 层级结构:支持类似文件系统的层级键结构
  • 原子操作:支持事务和原子操作
  • 版本控制:每个键都有版本号和修改时间

CLI 操作

基本读写操作

bash
# 设置键值 consul kv put config/app/name "myapp" # 获取键值 consul kv get config/app/name # 获取键值详细信息 consul kv get -detailed config/app/name # 删除键 consul kv delete config/app/name # 递归删除 consul kv delete -recurse config/

列出和查询

bash
# 列出所有键 consul kv get -recurse # 列出指定前缀的键 consul kv get -recurse config/ # 导出所有键值 consul kv export > backup.json # 导入键值 consul kv import < backup.json

HTTP API 操作

基本操作

bash
# 设置键值 curl -X PUT -d "value" http://localhost:8500/v1/kv/config/app/name # 获取键值 curl http://localhost:8500/v1/kv/config/app/name # 删除键 curl -X DELETE http://localhost:8500/v1/kv/config/app/name # 递归获取 curl http://localhost:8500/v1/kv/config/?recurse=true

高级操作

bash
# CAS(Compare-And-Set)操作 curl -X PUT -d "newvalue" \ http://localhost:8500/v1/kv/config/app/name?cas=10 # 获取键的元数据 curl http://localhost:8500/v1/kv/config/app/name?keys=true # 获取指定索引之后的数据 curl http://localhost:8500/v1/kv/config/?recurse=true&index=100

应用场景

1. 动态配置管理

bash
# 存储应用配置 consul kv put config/app/database/host "localhost" consul kv put config/app/database/port "5432" consul kv put config/app/database/user "admin" # 应用启动时读取配置 curl http://localhost:8500/v1/kv/config/app/database/host?raw

2. 服务协调

分布式锁

bash
# 获取锁 consul kv put -acquire lock/service1 "owner1" # 释放锁 consul kv put -release lock/service1 "owner1" # 设置锁超时 consul kv put -acquire -ttl=30s lock/service1 "owner1"

领导选举

bash
# 参与选举 consul kv put -acquire leader/election "node1" # 检查当前领导者 consul kv get leader/election

3. 特性开关

bash
# 启用新功能 consul kv put features/new_feature "true" # 读取特性开关 curl http://localhost:8500/v1/kv/features/new_feature?raw

4. 服务元数据

bash
# 存储服务元数据 consul kv put metadata/service1/version "1.0.0" consul kv put metadata/service1/deploy_time "2024-01-01"

Watch 机制

Consul KV 支持 Watch 机制,可以监听键值变化:

bash
# 监听键变化 consul watch -type=key -key=config/app/name /bin/cat # 监听前缀变化 consul watch -type=keyprefix -prefix=config/ /bin/cat

事务操作

Consul 支持原子性的事务操作:

json
{ "KV": [ { "Verb": "set", "Key": "config/app/host", "Value": "aGVsbG8=" }, { "Verb": "set", "Key": "config/app/port", "Value": "ODA4MA==" } ] }
bash
curl -X PUT -d @transaction.json http://localhost:8500/v1/txn

ACL 权限控制

Consul KV 支持 ACL(Access Control List)进行权限控制:

bash
# 创建策略 consul acl policy create -name kv-policy -rules @kv-policy.hcl # kv-policy.hcl 内容 key_prefix "config/" { policy = "read" } key_prefix "secrets/" { policy = "deny" }

最佳实践

1. 键命名规范

shell
# 使用层级结构 config/{service}/{environment}/{key} metadata/{service}/{key} locks/{resource}/{id}

2. 数据版本管理

bash
# 使用版本号 config/app/v1/database/host config/app/v2/database/host # 使用时间戳 config/app/20240101/database/host

3. 数据备份

bash
# 定期备份 consul kv export > backup_$(date +%Y%m%d).json # 恢复数据 consul kv import < backup_20240101.json

4. 监控和告警

bash
# 监控键值变化 consul watch -type=key -key=secrets/ /usr/local/bin/alert.sh

与其他工具集成

Spring Cloud Consul

java
@RefreshScope @RestController public class ConfigController { @Value("${app.name}") private String appName; @GetMapping("/config") public String getConfig() { return appName; } }

Go Consul SDK

go
kv := client.KV() pair, _, err := kv.Get("config/app/name", nil) if err != nil { log.Fatal(err) } fmt.Printf("Value: %s\n", string(pair.Value))

Consul KV Store 是一个简单而强大的分布式配置中心,适合各种微服务架构的配置管理需求。

标签:Consul