Etcd3概念理解与常用操作

Etcd3常用操作-python版本

重点

etcd 获取单个key的返回值会包涵data 和 meta元数据两个值,如果获取的是范围值则需要先循环
取到的数据均为bytes类型,所以在最后使用时请decode()

存取值

Set
import etcd3

etcd = etcd3.client('127.0.0.1', 2379, user=root, password=123123)
etcd.put('/test', '这是一条测试数据')

# 返回历史数据
pre_value = etcd.put('/test', '这是一条测试数据', prev_kv=True)
# 参考 https://etcd.io/docs/v3.4.0/learning/api/#put
print(pre_value.prev_kv.value.decode())
Get
import etcd3

etcd = etcd3.client('127.0.0.1', 2379, user=root, password=123123)
data, path = etcd.get('/test')
print(data.decode())
print(path.key.decode())
RangeGet
  • 获取到的range可以进行排序,sort_order 可以使用 descendascend
  • 排序字段sort_target默认为key,即按照key的ascii来排序,如果需要按照修改时间,则使用mod,更多请查看源码
  • 范围取值为ascii范围,比如下面test-01 到test-09 可以包涵8个值(不含09),但是不会包涵test-1,因为ascii 中test-1 已经不等于test-0
  • 范围取值后面还可以跟limit=5参数,用于限制返回个数或者分页
import etcd3
etcd = etcd3.client('127.0.0.1', 2379, user=root, password=123123)

for data, meta in etcd.get_range('/test-01', '/test-09', sort_order='ascend', sort_target='mod'):
    print(data.decode())
    print(meta.key.decode())
  • get_prefix 与范围取值使用的是同一个底层方法, 只是在end_range 时使用ascii加了一位
import etcd3
etcd = etcd3.client('127.0.0.1', 2379, user=root, password=123123)

for data, meta in etcd.get_prefix('/devops/projects/ecs/host'):
    print(meta.key.decode())
    
# 返回值与上面一样
for data, meta in etcd.get_range('/devops/projects/ecs/host', '/devops/projects/ecs/hosu'):
    print(meta.key.decode())

事务控制

  • etcd 事务控制非常简单,在compare中比较如果全部返回为true,则进入success方法,否则进入failure 方法
import etcd3
etcd = etcd3.client('127.0.0.1', 2379, user=root, password=123123)

etcd.put('/test', '我是a')
data, meta = etcd.get('/test')
print(data.decode())

# 同样的,第一个返回状态,第二个返回元数据
status, meta = etcd.transaction(
                compare=[
                	# 这里比较出原值不是b,则进入failure方法还原值
                    etcd.transactions.value('/test') == '我是b',
                    etcd.transactions.version('/test') > 0,
                ],
                success=[
                    etcd.transactions.put('/test', '修改成功了,我是b'),
                ],
                failure=[
                    etcd.transactions.put('/test', '我是a'),
                ]
            )
print(status)

data, meta = etcd.get('/test')
print(data.decode())

消息监听

  • 如下例子启动一个事件迭代器用于接受事件,如果值发生改变则会直接打印出来值
import etcd3
etcd = etcd3.client('127.0.0.1', 2379, user=root, password=123123)

# 返回一个事件迭代器和一个取消触发器
iterators, cancel = etcd.watch('/test')
for event in iterators:
    print(event.value.decode())

# cancel()
  • 修改消息
etcd.put('/test', '我要吧你改成2')

租期->过期时间

  • etcd的租期就类似redis中的过期时间,还是两者还是有一些区别
  • etcd的租期是定义一个租期id,然后时间就开始流失,你可以将这个租期关联到任何一个key上,租期id的时间到了,关联的所有的key就会被删除
  • 刷新租期需要注意,由于etcd刷新租期的方法是返回生成器,所以在调用的时候要使用list()将生成器运行
import etcd3
import time
etcd = etcd3.client('127.0.0.1', 2379, user=root, password=123123)
# id只能用数字表示
mylease = etcd.lease(30, 303030)

etcd.put('/test','我0只能存活30秒', lease=mylease)
# 打印租期id的相关信息
lease_info = etcd.get_lease_info(303030)
print(lease_info)

time.sleep(5)
# 当然你也可以调用mylease.refresh()刷新,但是通常刷新都是后续的线程处理了,所以使用下面的方式刷新
list(etcd.refresh_lease(303030))
lease_info = etcd.get_lease_info(303030)
print(lease_info)
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值