etcd笔记

etcd笔记

起男 7 2025-05-25

etcd笔记

常用命令

命令 说明
put key value 设置或更新某个键的值
get key 获取指定键的值
get key --hex 以16进制格式返回
get key1 key2 获取区间的值,开半区间:左闭右开
get --prefix key 获取指定前缀的值
get --prefix key --limit n 限制返回的熟练为n
get --from-key key 按key的字典顺序获取,读取字典顺序大于等于key的值
get key -w=json 以json格式返回key的详细信息
get key --rev=n 查看key的第n个版本的值
del key 删除一个key
del key1 key2 删除一个范围的key
dev key --prev-kv 返回被删除的键值
watch key 监听一个key,可以连续监听

lease(租约)

类似redis的TTL,etcd中的键值对可以绑定到租约上,实现存活周期控制。
应用客户端可以为etcd里的键授予租约,一旦租约到期,租约就会过期并且所有附带的键都会被删除

#授予租约 TTL为30s
etcdctl lease grant 30
#键租约赋予key
etcdctl put --lease=694d96fdc4880b07 k1 v1
#撤销租约
etcdctl lease revoke 694d96fdc4880b07
#刷新租期
etcdctl lease keep-alive 694d96fdc4880b07
#查询租约信息
etcdctl lease timtolive 694d96fdc4880b07
#查看租约绑定的key
etcdctl lease timtolive --keys 694d96fdc4880b07

权限管理

命令 说明
auth status 查看当前权限状态
auth enable 开启权限,需要root用户
user add u1 创建用户
user del u1 删除用户
user passwd u1 修改密码
user list 查看用户列表
user get u1 查看指定用户绑定角色
role add r1 添加角色
role grant-permission r1 readwrite key 赋予角色对一个目录的读写权限。权限包括read、write、readwrite
role revoke-permission r1 key 回收角色
role del r1 删除角色
role list 角色列表
user grant-role u1 r1 赋予用户角色

可以通过命令后添加--user=xxx的方式指定使用的用户,使用--password=xxx指定密码

ReadIndex

ReadIndex机制就是实现线性读功能的重要机制,当server收到一个线性读请求时,

如果自己是leader节点,则会立即返回,如果自己是follower节点的话,则会向server节点发送一个readIndex请求来获取最新的已提交日志索引(committed index);

sever收到readIndex请求,还要向其他follower节点发送心跳来防止脑裂异常场景,一半以上节点确认leader节点身份后,leader才会把committed index返回给follower请求节点;

follower节点收到committed index后会和自己的applied index比较,如果applied index值大于committed index时,才表示自己的状态机数据是最新的,这时才会去通知读请求去状态机读取数据。

串行读和线性读

虽然etcd能保证一致性,但是保证强一致性是需要消耗性能的,会牺牲部分吞吐量。因此当出现数据一致性问题时,这时就有串行读与线性读的区别了。数据一致性问题又是由于etcd只有leader节点能处理写请求写数据导致。

(1)当收到写请求时,leader节点先将请求内容持久化到WAL日志中,并且广播给所有follower节点;

(2)如果leader节点有收到一半以上节点的持久化成功消息,那么该请求对应的日志会被标识为已提交;

(3)各个节点的server会异步从raft模块获取已提交的日志条目,应用到状态机(boltdb)。

串行读

直接读取对应server状态机(boltdb)的数据,不会经过Raft协议与集群交互,具有低延迟、高吞吐量的特点,但是可能存在读取结果不一致的情况。

线性读

etcd默认的是线性读,在读取数据时会经过raft协议与集群交互保证数据一致,所以在延迟和吞吐量方面会比串行读有所降低。但是能保证数据的一致性。

线性读保证数据一致性的原理,离不开ReadIndex机制。

MVCC

ETCD的键值存储以及版本信息涉及到一个B树treeIndex和一个B+树boltdb。

treeIndex的作用是作为辅助内存索引,加速对键的范围查询。treeIndex里面会存储key和对应的版本号。

boltdb里面保存了key的值以及历史版本信息。

读取数据时,先从treeIndex中获取key的版本号,再以版本号作为boltdb的key,从boltdb中得到具体的value的信息。

实际读取数据时,还涉及到一个buffer缓冲区,在读取数据时,并非所有请求都要经过boltdb。在访问boltdb前,ETCD会先从buffer中查找是否有key对应的值。如果有就可以直接返回而不用经过boltdb。ETCD通过buffer可以实现一部分的性能提高和数据一致性问题解决。因为buffer是将数据暂存在内存中,可以减少boltdb处理中对磁盘的读写操作;另外buffer会暂未提交的数据,此时可能boltdb里面没有,但是在buffer里面可以提前拿到。