golang源码分析:etcd(3)

2023-08-09 15:14:50 浏览数 (3)

搭完集群后,我开始体验下etcd如何使用

1,设置key,进行前缀查询操作

代码语言:javascript复制
ENDPOINTS=http://127.0.0.1:22379
etcdctl --endpoints=$ENDPOINTS put web1 value1
etcdctl --endpoints=$ENDPOINTS put web2 value2
OK
etcdctl --endpoints=$ENDPOINTS put web3 value3

查询

代码语言:javascript复制
etcdctl --endpoints=$ENDPOINTS get web --prefix
web1
value1
web2
value2
web3
value3

2,前缀删除

代码语言:javascript复制
etcdctl --endpoints=$ENDPOINTS put key myvalue
etcdctl --endpoints=$ENDPOINTS del key

etcdctl --endpoints=$ENDPOINTS put k1 value1
etcdctl --endpoints=$ENDPOINTS put k2 value2
etcdctl --endpoints=$ENDPOINTS del k --prefix
2

3,事务操作txn

代码语言:javascript复制
etcdctl --endpoints=$ENDPOINTS put user1 bad
etcdctl --endpoints=$ENDPOINTS txn --interactive
OK
compares:
value("user1") = "bad"

success requests (get, put, del):
del user1

failure requests (get, put, del):
put user1 good

SUCCESS

1

4,watch操作

在一个console进行watch,另一个console进行key的操作

代码语言:javascript复制
etcdctl --endpoints=$ENDPOINTS watch stock1
代码语言:javascript复制
etcdctl --endpoints=$ENDPOINTS put stock1 1000

当然也可以watch前缀

代码语言:javascript复制
etcdctl --endpoints=$ENDPOINTS watch stock --prefix
etcdctl --endpoints=$ENDPOINTS put stock1 10
etcdctl --endpoints=$ENDPOINTS put stock2 20

5,租期

代码语言:javascript复制
% etcdctl --endpoints=$ENDPOINTS lease grant 300
lease 414688a849143a15 granted with TTL(300s)
代码语言:javascript复制
 % etcdctl --endpoints=$ENDPOINTS put sample value --lease=414688a849143a15
etcdctl --endpoints=$ENDPOINTS get sample

OK
sample
value

操作的时候需要指定返回的租期id

代码语言:javascript复制
% etcdctl --endpoints=$ENDPOINTS get sample                               
sample
value

6,分布式锁

代码语言:javascript复制
 % etcdctl --endpoints=$ENDPOINTS lock mutex1
mutex1/414688a849143a1d

在另一个console尝试加锁,会一直阻塞,直到前者释放锁

代码语言:javascript复制
% ENDPOINTS=http://127.0.0.1:22379
% etcdctl --endpoints=$ENDPOINTS lock mutex1
mutex1/414688a849143a21

7,选举

代码语言:javascript复制
% etcdctl --endpoints=$ENDPOINTS elect one p1
one/414688a849143a2a
p1
代码语言:javascript复制
% etcdctl --endpoints=$ENDPOINTS elect one p2
p2

8,查看数据状态

代码语言:javascript复制

% etcdctl --write-out=table --endpoints=$ENDPOINTS endpoint status

 ------------------------ ------------------ --------------- ----------------- --------- ---------------- ----------- ------------ ----------- ------------ -------------------- -------- 
|        ENDPOINT        |        ID        |    VERSION    | STORAGE VERSION | DB SIZE | DB SIZE IN USE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
 ------------------------ ------------------ --------------- ----------------- --------- ---------------- ----------- ------------ ----------- ------------ -------------------- -------- 
| http://127.0.0.1:22379 | 91bc3c398fb3c146 | 3.6.0-alpha.0 |           3.6.0 |   33 kB |          33 kB |     false |      false |         2 |         37 |                 37 |        |
 ------------------------ ------------------ --------------- ----------------- --------- ---------------- ----------- ------------ ----------- ------------ -------------------- -------- 
代码语言:javascript复制
% etcdctl --endpoints=$ENDPOINTS endpoint health
http://127.0.0.1:22379 is healthy: successfully committed proposal: took = 15.993027ms

9,数据持久化备份

代码语言:javascript复制
% etcdctl --endpoints=$ENDPOINTS snapshot save my.db

{"level":"info","ts":"2023-06-11T16:48:51.176005 0800","caller":"snapshot/v3_snapshot.go:67","msg":"created temporary db file","path":"my.db.part"}
{"level":"info","ts":"2023-06-11T16:48:51.178707 0800","logger":"client","caller":"v3@v3.6.0-alpha.0/maintenance.go:237","msg":"opened snapshot stream; downloading"}
{"level":"info","ts":"2023-06-11T16:48:51.214419 0800","caller":"snapshot/v3_snapshot.go:75","msg":"fetching snapshot","endpoint":"http://127.0.0.1:22379"}
{"level":"info","ts":"2023-06-11T16:48:51.230865 0800","logger":"client","caller":"v3@v3.6.0-alpha.0/maintenance.go:302","msg":"completed snapshot read; closing"}
{"level":"info","ts":"2023-06-11T16:48:51.245575 0800","caller":"snapshot/v3_snapshot.go:90","msg":"fetched snapshot","endpoint":"http://127.0.0.1:22379","size":"33 kB","took":"68.257765ms","etcd-version":"3.6.0"}
{"level":"info","ts":"2023-06-11T16:48:51.247532 0800","caller":"snapshot/v3_snapshot.go:100","msg":"saved","path":"my.db"}
Snapshot saved at my.db
Server version 3.6.0
代码语言:javascript复制
% etcdctl --write-out=table --endpoints=$ENDPOINTS snapshot status my.db

10,版本v2和v3之间迁移

代码语言:javascript复制

# write key in etcd version 2 store
export ETCDCTL_API=2
etcdctl --endpoints=http://$ENDPOINT set foo bar

# read key in etcd v2
etcdctl --endpoints=$ENDPOINTS --output="json" get foo

# stop etcd node to migrate, one by one

# migrate v2 data
export ETCDCTL_API=3
etcdctl --endpoints=$ENDPOINT migrate --data-dir="default.etcd" --wal-dir="default.etcd/member/wal"

# restart etcd node after migrate, one by one

# confirm that the key got migrated
etcdctl --endpoints=$ENDPOINTS get /foo

1 人点赞