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里面可以提前拿到。