etcd

etcd-docker安装

docker-compose.yaml

version: "3.0"
services:
  etcd1:
    image: bitnami/etcd:latest
    container_name: etcd1
    restart: always
    ports:
      - "2379:2379"
      - "2380:2380"
    environment:
      - ALLOW_NONE_AUTHENTICATION=yes #示例中我们不设置密码
      - ETCD_NAME=etcd1 #节点自己的名字
      - ETCD_ADVERTISE_CLIENT_URLS=http://10.10.239.31:2379  #告知集群自己的客户端地址
      - ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379 #设置监听客户端通讯的URL列表
      - ETCD_INITIAL_ADVERTISE_PEER_URLS=http://10.10.239.31:2380 #告知集群自己集群通讯地址
      - ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380 #用于监听伙伴通讯的URL列表
      - ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster #etcd 集群的初始化集群记号
      - ETCD_INITIAL_CLUSTER=etcd1=http://192.168.0.214:2380 #集群成员
      - ETCD_INITIAL_CLUSTER_STATE=new #初始化集群状态
    volumes:
      - ./data:/bitnami/etcd
#./data需要777权限

etcdctl安装

etcdctl操作etcd数据库的指令工具

//下载解压
https://github.com/etcd-io/etcd/releases/tag/v3.5.6
//把etcdctl可执行文件复制到~/go/bin目录下

注意:etcdctl 在不指定`endpoints`时,默认链接127.0.0.1:2379

etcdctl 操作指令

数据库操作围绕对键值和目录的CRUD(增删改查)完整生命周期的管理。

1. put-设置或更新某个键值

etcdctl put /Jeff/key "Hello Jeff1"
etcdctl put /Jeff/key2 "Hello Jeff2"
etcdctl put /Jeff/key3 "Hello Jeff3"

etcdctl put -h //put操作的详细指令介绍

2. get-获取对应的键值

etcdctl  get /Jeff/key //获取单个键值
etcdctl  get /Jeff/key2 
etcdctl get /Jeff/key  --print-value-only //只获取单个值
etcdctl get /Jeff/key --hex //只获取单个值,并以16进制返回
etcdctl get /Jeff/key /Jeff/key3 //范围取值,顾头不顾尾。不包含尾,[key,key3)
etcdctl get --prefix /Jeff //获取指定健值前缀
etcdctl  get --prefix "" //获取所有键值
etcdctl get --prefix /Jeff --limit=2

etcdctl get -h //get操作的详细指令介绍

--limit=2 //限制数量
--prefix "" //前缀匹配
--hex //16进制返回
--print-value-only //只获取值
--rev=53 //获取指定版本的键值
--write-out json //输出为json格式,base64 编码

json格式字段解释:

etcdctl get /Jeff/key --write-out json //以json 格式获取键值对的详细信息,此时json 返回的key和value都是base64 编码后的数据,需要解码获取原始数据

{"header":{"cluster_id":2037210783374497686,"member_id":13195394291058371180,"revision":19,"raft_term":3},"kvs":[{"key":"L0plZmYva2V5","create_revision":19,"mod_revision":19,"version":1,"value":"SGVsbG8gSmVmZjE="}],"count":1}

revision: 全局的版本好,自动递增,没次数据更新操作都会使版本好自动递增
raft_term: 集群中leader 任期号,每一次的leader 节点选举,都会导致term 递增
create_revision": 该键被创建时对应的全局版本号
mod_revision: 最新修改后对应的全局版本号
version: 该键自己的版本号,每次更新操作都会自动递增,也可以理解为修改次数,如果该键被删除后再创建,version 又从1开始
key: 对应的键经过base64 编码之后的值
value: key对应value 经过base64编码后的值

3. delete-删除某个健

etcdctl del /Jeff/key //删除单个键,返回1 表示删除键成功, 0 表示键不存在

etcdctl del -h //del操作的详细指令介绍

4. watch-监听(服务发现)

watch用于监听某个键值对并阻塞等待, 一旦键值发生更新,就会输出最新值并返回, 监听可以重复使用,不是只监听一次

//第一个终端: etcdctl watch /Jeff/key  
//第二个终端: etcdctl put /Jeff/key "Hello Jeff1"
//第二个终端返回:OK
//第一个终端:监听到值发生变化,输出最新值并返回
/Jeff/key
Hello Jeff1
// 监听范围[key ~key3 )包括key 蛋不包括key3, 左闭右开
etcdctl watch /Jeff/key /Jeff/key3 
       
//监听多个键
-i 参数:是指以交互的方式,此时可以输入多个watch key 参数来实现多个键值对监听
etcdctl watch -i  
watch /Jeff/key
watch /Jeff/key2

5. lease-租约(过期时间)

lease-租约类似于redis 中的TTL(time to live),通过将键值对绑定到租约上,实现对存活周期的控制, 一旦租约到期,所有被绑定的键都将会被删除

1.创建租约

etcdctl lease grant 100 //100s租约
lease 6a6c84b6ffa35392 granted with TTL(100s)

2.将租约绑定到键上, 注意,租约必须在过期前绑定到键上,不然会报错:requested lease not found

# 将租约绑定到键上
etcdctl put --lease=6a6c84b6ffa35392 /Jeff/lease jeff 
OK

3.查询租约

# 查询指定租约的信息
etcdctl lease timetolive 6a6c84b6ffa35392
lease 6a6c84b6ffa35392 granted with TTL(100s),     remaining(50s)

# 通过加上--keys ,可以查询租约的对应绑定的key
etcdctl lease timetolive 6a6c84b6ffa35392
lease 6a6c84b6ffa35392 granted with TTL(100s),     remaining(20s),  attached keys([/test/lease])

4.撤销租约

# 撤销租约,此时对应绑定的键值对也会消除
etcdctl lease revoke 6a6c84b6ffa35392
lease 6a6c84b6ffa35392 revoked

#通过get指令找不到原先绑定的键值对
etcdctl get /Jeff/lease

5.刷新租约

通过刷新其TTL来保持租约活着,因此不会过期

 # 创建20s 的租约
etcdctl lease grant 20
lease 6a6c84b6ffa353a6 granted with TTL(20s)
# 刷新租约,确保租约不过期
etcdctl lease keep-alive     6a6c84b6ffa353a6
lease 6a6c84b6ffa353a6 keepalived with TTL(20)
lease 6a6c84b6ffa353a6 keepalived with TTL(20)

6. txn-原子性事务

etcdctl put user frank
OK

etcdctl txn -i
compares:
value("user") = "frank"

success requests (get, put, del):
put result ok

failure requests (get, put, del):
put result failed

SUCCESS

OK

etcdctl get result                                                                                                                            
result
ok
解释如下:

先使用 etcdctl put user frank 设置 user 为 frank
etcdctl txn -i 开启事务(-i表示交互模式)
第2步输入命令后回车,终端显示出 compares:
输入 value("user") = "frank",此命令是比较 user 的值与 frank 是否相等
第 4 步完成后输入回车,终端会换行显示,此时可以继续输入判断条件(前面说过事务由条件列表组成),再次输入回车表示判断条件输入完毕
第 5 步连续输入两个回车后,终端显示出 success requests (get, put, delete):,表示下面输入判断条件为真时要执行的命令
与输入判断条件相同,连续两个回车表示成功时的执行列表输入完成
终端显示 failure requests (get, put, delete):后输入条件判断失败时的执行列表
为了看起来简洁,此实例中条件列表和执行列表只写了一行命令,实际可以输入多行
总结上面的事务,要做的事情就是 user 为 frank 时设置 result 为 ok,否则设置 result 为 failed
事务执行完成后查看 result 值为 ok

7. lock-锁

lock 可以通过指定的名字加锁。注意,只有当正常退出且释放锁后,lock命令的退出码是0,否则这个锁会一直被占用

#创建一个mux1 的锁,并占用锁
etcdctl lock mux1
mux1/41467f68540a4008

#在另一个终端使用mux1 锁,会被阻塞,直到前者释放
etcdctl lock mux1

8. 权限控制-角色和用户

ETCD权限控制有两个概念,一个是用户user,另一个是角色 role。用户可以绑定多个角色,
而每个角色对应着多组权限控制,权限包括 读、写、读写

8.1 role-角色

1.创建role

# 创建test 角色
etcdctl role add test
Role test created

2.查看role

#查看test 角色
etcdctl role get test
Role test
KV Read:
KV Write:

# 列出所有的role
etcdctl role list
test

3.绑定权限
权限:read,write,readwrite
绑定权限需要指定权限的类型,和对应的键, 一个权限可以绑定到多个键上,不会被新的键覆盖

$ etcdctl put Jeff key1
#给键Jeff 绑定读写权限的test角色
$ etcdctl role grant-permission test readwrite  Jeff
Role test updated

# 查看角色
$ etcdctl role get test
Role test
KV Read:
			Jeff
      roleTest
KV Write:
			Jeff
      roleTest

4.为角色移除key的权限

为键roleTest 移除test 角色
$ etcdctl role revoke-permission test roleTest
Permission of key roleTest is revoked from role test

5.删除role

# 删除test 角色
$ etcdctl role del test
Role test deleted

8.2 user-用户

1.创建用户
创建用户名并输入密码

$ etcdctl user add u1
Password of u1: 
Type password of u1 again for confirmation: 
User u1 created

2.查看用户

# 查看用户
$ etcdctl user get u1
User: u1  
Roles:

#列出所有用户
$ etcdctl user list
u1

3.绑定role

# 创建role
$ etcdctl role add test

#将用户u1 绑定test 角色
$ etcdctl user grant-role u1  test
Role test is granted to user u1
 
# 查看u1
etcdctl user get u1
User: u1
Roles: test

4.移除role

$ etcdctl user revoke-role u1 test  
Role test is revoked from user u1

5.删除用户

# 删除用户不会删除对应绑定的角色
$ etcdctl user del u1
User u1 deleted

9. auth-权限认证

etcd 默认是关闭权限认证的, 可以通过如下指令开始和关闭权限认证,当打开权限后,所有的操作,需要加上用户认证 --user=用户名:密码

开启关闭认证

# 开启权限
etcdctl auth enable
#关闭权限
etcdctl auth disable

注意
开启权限认证需要先创建root 用户,不然会报如下错误

  etcdctl auth enable
{"level":"warn","ts":"2022-03-    08T11:21:46.782+0800","logger":"etcd-client","caller":"v3/retry_interceptor.go:62","msg":"retrying of unary invoker failed","target":"etcd-endpoints://0xc0001ce000/127.0.0.1:2379","attempt":0,"error":"rpc error: code = FailedPrecondition desc = etcdserver: root user does not exist"}
Error: etcdserver: root user does not exist

1.创建root 账号

#创建root角色
$ etcdctl role add root
Role root created
#创建root 用户
$ etcdctl user add root
Password of root: 
Type password of root again for confirmation: 
User root created
#绑定root角色到root 用户
$ etcdctl user grant-role root root
Role root is granted to user root
# 开启权限 --user=用户名:密码
etcdctl auth enable --user=root:123
Authentication Enabled

验证:
$ etcdctl  get --prefix "" # 报错,无权限,已经有auth认证
$ etcdctl  get --prefix "" --user=root:123 # 添加认证

终端远程连接etcd

etcdctl --endpoints=127.0.0.1:2379 get --prefix ""
etcdctl --endpoints=192.168.1.72:2379 get --prefix ""
posted @ 2022-11-28 10:38  Jeff的技术栈  阅读(153)  评论(0编辑  收藏  举报
回顶部