如何使用etcdctl获取key最新revision ID及最近n个历史版本
etcd单key历史版本查询操作说明
如何获取key最新值对应的revID,查询上一版本内容
- 给get命令追加
-w json参数输出结构化结果,即可拿到版本相关字段,命令格式如下:etcdctl get <目标key名称> -w json - 返回结果中三个核心版本字段含义:
header.revision:etcd集群当前的全局最新版本号,集群内任意写操作都会让该值全局递增kvs[0].mod_revision:目标key最后一次修改对应的版本号,也就是最新值匹配的revIDkvs[0].create_revision:目标key首次创建时对应的版本号
- 注意:不要直接用
mod_revision - 1作为上一版本的revID传入查询,因为全局rev是所有key共享递增的,减1后的版本可能对应其他key的写操作,不一定是当前key的上一个修改版本。
为什么排序分页命令无法返回多历史版本?如何获取最近n个历史版本
你执行的get --order=DESCEND --sort-by=MODIFY --limit=3 <key name>仅返回单值是符合etcd设计逻辑的:
etcd的get接口默认读取指定revision时间点的key-value快照,不指定
--rev参数时默认读取最新快照,单个key在同一个快照点只会存在一个有效条目。排序、limit参数仅对前缀匹配返回的多个不同key生效,无法直接拉取单key的多个历史版本。
要获取单key的最近n个历史版本,可按以下方法操作:
- 提前确认集群历史版本保留规则:etcd会按照配置的压缩策略自动清理过期历史版本,保留周期由启动参数
--auto-compaction-retention控制,超过保留期的版本无法查询。 - 逐次遍历查询法:先通过前面提到的json格式get命令,拿到目标key的最新
mod_revision作为遍历起点,create_revision作为遍历下边界。从mod_revision - 1开始逐次递减rev值,执行etcdctl get <目标key名称> --rev=<当前遍历的rev值> -w json,每次判断返回结果中kvs[0].mod_revision是否等于当前遍历的rev值:- 相等则说明该rev点是目标key的一次有效修改,记录对应版本值,直到凑够n个版本即可停止遍历
- 不相等则说明该rev点对应其他key的操作,目标key在这个版本没有变化,继续递减rev即可
- watch批量拉取法:如果不想手动循环遍历,可以执行
etcdctl watch <目标key名称> --rev=<key的create_revision值> --prev-kv,命令会优先输出从key创建到当前时刻的所有修改事件,每个事件会携带修改前、修改后的值以及对应版本号,直接从输出结果中提取最近n次变更的内容即可,取完直接终止命令,不需要等待后续实时监听的输出。
内容的提问来源于stack exchange,提问作者Paul Chambre
相关产品推荐
相关产品推荐

