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 可以使用
descend
和ascend
- 排序字段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)