跳转至

第三章:数据模型

键值存储

扁平命名空间

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 put --lease=7587889366619544061 /services/user "192.168.1.1:8080"

# 租约过期后,键自动删除

撤销租约

# 撤销租约
etcdctl lease revoke 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'

修订版本

版本概念

revision: 集群级别的版本号,每次修改递增
mod_revision: 键的最后修改版本
version: 键的版本号,每次修改递增
create_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

下一章我们将学习客户端操作。