微信搜索superit|邀请体验:大数据, 数据管理、OLAP分析与可视化平台 | 赞助作者:赞助作者

Etcd3常用操作-python版本

dubbo aide_941 9℃

Etcd 官方API文档
Etcd 中文文档
Etcd python文档
python 例子
Etcd 浏览器
重点
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())
1
2
3
4
5
6
7
8
9
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())
1
2
3
4
5
6
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())
1
2
3
4
5
6
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())
1
2
3
4
5
6
7
8
9
事务控制
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())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
消息监听
如下例子启动一个事件迭代器用于接受事件,如果值发生改变则会直接打印出来值
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()

1
2
3
4
5
6
7
8
9
修改消息
etcd.put(‘/test’, ‘我要吧你改成2’)
1
租期->过期时间
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)
————————————————
版权声明:本文为CSDN博主「Ghost_zhipeng」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011238098/article/details/103411489

转载请注明:SuperIT » Etcd3常用操作-python版本

喜欢 (2)or分享 (0)