第三章:数据模型¶
键值存储¶
扁平命名空间¶
etcd 采用扁平的键值存储模型,键是字符串,值是字节数组:
/config/database/mysql
/config/database/redis
/config/app/timeout
/services/user-service/instance-1
/services/order-service/instance-1
/locks/order-lock
键排序¶
键按字典序排序:
/config/app
/config/database/mysql
/config/database/redis
/config/timeout
/services/order-service
/services/user-service
数据操作¶
基本操作¶
# 写入数据
etcdctl put /config/app "my-app"
# 读取数据
etcdctl get /config/app
# 删除数据
etcdctl del /config/app
# 检查键是否存在
etcdctl get /config/app --print-value-only
前缀查询¶
# 查询前缀
etcdctl get /config/ --prefix
# 查询前缀(带限制)
etcdctl get /config/ --prefix --limit=10
# 查询所有键
etcdctl get "" --prefix
范围查询¶
# 范围查询
etcdctl get /config/database/mysql /config/database/redis
# 包含结束键
etcdctl get /config/database/mysql /config/database/redis --end
租约(Lease)¶
创建租约¶
# 创建租约(60秒过期)
etcdctl lease grant 60
lease 7587889366619544061 granted with TTL(60s)
# 查看租约信息
etcdctl lease timetolive 7587889366619544061
# 续租
etcdctl lease keep-alive 7587889366619544061
绑定键¶
撤销租约¶
事务¶
事务语法¶
# 事务操作
etcdctl txn <<EOF
cmp("/config/app", ">", "value1")
then:
put /config/app "value2"
else:
put /config/app "value1"
EOF
条件更新¶
# 条件更新(乐观锁)
# 使用 mod_revision 实现乐观锁
etcdctl put /config/app "new-value" --ignore-value
# 检查版本后更新
etcdctl get /config/app -w json | jq '.header.revision'
修订版本¶
版本概念¶
查看版本¶
# 查看键的版本信息
etcdctl get /config/app -w json
# 输出
{
"header": {
"cluster_id": 14841639068965178418,
"member_id": 10276657743932975437,
"revision": 10,
"raft_term": 2
},
"kvs": [
{
"key": "L2NvbmZpZy9hcHA=",
"create_revision": 5,
"mod_revision": 10,
"version": 3,
"value": "bXktYXBw"
}
]
}
历史查询¶
# 查询历史版本
etcdctl get /config/app --rev=5
# 查询修改历史
etcdctl get /config/app --write-out=json | jq '.kvs[0].mod_revision'
小结¶
数据模型要点:
- 键值存储:扁平命名空间、键排序
- 数据操作:基本操作、前缀查询、范围查询
- 租约:创建租约、绑定键、撤销租约
- 事务:条件更新、乐观锁
- 修订版本:revision、mod_revision、version
下一章我们将学习客户端操作。