Etcd作为一个分布式一致性的KV存储组件,现在的功能远不止于KV存储了。详细了解下其功能特点,有利用在使用它时做出最合适的选择。
通过etcdctl -h命令可以看到有如下的特性。
- 基本的KV操作 get put txn del watch
- 数据操作 分片defrag 压缩事件 compaction
- 端点管理 endpoint
- 租期管理 lease
- 锁 lock
- 选举 elec
- 成员管理 member
- 转移leader move-leader
- 角色管理 role
- 快照管理 snapshot
- 运维相关 告警 alarm,状态检测 check,镜像 make-mirror
- 认证管理 auth
- 用户管理 user
居然已经有这么多的特性,不得不感叹开源社区力量的强大。之前也觉得ZooKeeper有许多不错的特性,但因为社区不活跃了,与Etcd对比,已经落后太多了。
0x02 基本的KV操作基本的KV包含查询get、写入put、删除del、监听watch和事务txn。
2.1 get仅仅一个get就支持了许多选项。先不管全局的选项。
- --consistency 2个取值"l"或者"s",这涉及到了分布式中两种一致性模型,见参考1。简单理解l为linearizability,表示所有客户端任意一时间看到的数据都是一致的。而s代表sequential,只保证一个客户端自己的操作是有序的,自己写的,后面读能读到新的。
- --count-only 默认为false,为true时,需要和全局的–write-out="fields"联合使用,只返回查询的数量。这可以适用于某些只需要数量的场景,避免传输大量数据。
- --from-key 查询从某个key开始的所有key,与--limit联合使用,可以实现分页机制,同样可以减小网络传输的数据量。
- --keys-only 默认为false,查询默认会返回key和value,同样某些场景下只需要key,也可以减轻网络压力。
- --limit 限制获取的key数量。
- --order 支持排序方式,升序、降序。
- --prefix 按照前缀方式获取。类似mysql中的前缀匹配。
- --print-value-only 默认为false,只返回值。意义同前述。
- --rev 获取特定revsion的值。Etcd是支持子版本的,k8s就是利用这个机制实现pod回滚的。
- --sort-by 指定排序的键。支持创建时间、key、修改时间、值和版本。
同时注意到get也支持一次获取多个,也支持一个范围。通过查看源码可以知道,这在Etcd协议中是通过range来实现的。
2.2 putput的选项就少了许多。
- --ignore-lease 也就是不更新lease。
- --ignore-value 不更新value。
- --lease 指定lease的ID。
- --prev-kv 返回修改前的key/value。
lease是Etcd支持临时节点的一种实现方式,ZooKeeper中的“临时节点”。相当于租约,过期了数据就被清除了。
2.3 del删除,选项也比较少。
- --from-key 与get类似,支持批量删除。
- --prefix 默认为false,打开时代表通过前缀删除。
- --prev-kv 返回删除前的key和value。
watch用来监听一个key或者一系列key的变化,比如被PUT、DEL。可以基于这个来实现事件通知,一次watch是一直有效的(至少从etcdctl看来是这样的),与ZooKeeper不同。
选项也不多。
- --interactive 默认为false,打开是为交互模式。可以一次运行watch多个节点。测试起来非常方便。
- --prefix 同前面。watch指定前缀的key。
- --prev-kv 同前,变化时,返回变化前的。
- --progress-notify 默认为false,打开时代表server端周期性发送响应,即使数据没有变化。推送的间隔是服务端根据自己的负载情况确定的,对客户端来说不是很明确。
- --rev 代表watch特定子版本起始值。
txn是事务操作。可以一次请求中进行多个put、del操作。
一般是开启--interactive模式。注意的是前置判断完成后,要按两个回车结束当前的操作。
$ etcdctl txn --interactive
compares:
value("user1") = "ok1" // 输入后按两次enter
success requests (get, put, del):
put user1 "ok" // 输入后按两次enter
failure requests (get, put, del):
put user2 "ok2" // 输入后按两次enter
FAILURE
OK
0x03 小结
Etcd基本的KV操作提供了非常丰富的特性,可以灵活应用于各种场景。对相关服务设计提供了不错的参考。下一步会继续学习后面的内容。
0x04 参考- https://cse.buffalo.edu/~stevko/courses/cse486/spring13/lectures/26-consistency2.pdf



