第四章:客户端操作¶
etcdctl 命令行¶
连接配置¶
# 连接单节点
etcdctl --endpoints=http://localhost:2379
# 连接集群
etcdctl --endpoints=http://node1:2379,http://node2:2379,http://node3:2379
# 使用环境变量
export ETCDCTL_API=3
export ETCDCTL_ENDPOINTS=http://localhost:2379
基本操作¶
# 写入数据
etcdctl put /config/app "my-app"
OK
# 读取数据
etcdctl get /config/app
/config/app
my-app
# 只读取值
etcdctl get /config/app --print-value-only
my-app
# 删除数据
etcdctl del /config/app
1
# 批量删除
etcdctl del /config/ --prefix
查询操作¶
# 查询所有键
etcdctl get "" --prefix --keys-only
# 查询前缀
etcdctl get /config/ --prefix
# 查询数量
etcdctl get /config/ --prefix --write-out=json | jq '.count'
# 分页查询
etcdctl get /config/ --prefix --limit=10
租约操作¶
# 创建租约
etcdctl lease grant 60
lease 7587889366619544061 granted with TTL(60s)
# 绑定键
etcdctl put --lease=7587889366619544061 /services/user "192.168.1.1:8080"
# 查看租约
etcdctl lease timetolive 7587889366619544061
# 续租
etcdctl lease keep-alive 7587889366619544061
# 撤销租约
etcdctl lease revoke 7587889366619544061
集群管理¶
# 查看成员
etcdctl member list
# 添加成员
etcdctl member add etcd-node4 --peer-urls=http://192.168.1.104:2380
# 移除成员
etcdctl member remove <member-id>
# 查看状态
etcdctl endpoint status
# 查看健康状态
etcdctl endpoint health
Go 客户端¶
安装依赖¶
连接 etcd¶
import (
"context"
"time"
clientv3 "go.etcd.io/etcd/client/v3"
)
func main() {
// 创建客户端
cli, err := clientv3.New(clientv3.Config{
Endpoints: []string{"localhost:2379"},
DialTimeout: 5 * time.Second,
})
if err != nil {
panic(err)
}
defer cli.Close()
// 使用客户端
// ...
}
CRUD 操作¶
import "context"
// 写入数据
ctx := context.Background()
putResp, err := cli.Put(ctx, "/config/app", "my-app")
if err != nil {
panic(err)
}
fmt.Printf("Revision: %d\n", putResp.Header.Revision)
// 读取数据
getResp, err := cli.Get(ctx, "/config/app")
if err != nil {
panic(err)
}
for _, kv := range getResp.Kvs {
fmt.Printf("Key: %s, Value: %s\n", kv.Key, kv.Value)
}
// 删除数据
delResp, err := cli.Delete(ctx, "/config/app")
if err != nil {
panic(err)
}
fmt.Printf("Deleted: %d\n", delResp.Deleted)
// 前缀查询
getResp, err = cli.Get(ctx, "/config/", clientv3.WithPrefix())
if err != nil {
panic(err)
}
for _, kv := range getResp.Kvs {
fmt.Printf("Key: %s, Value: %s\n", kv.Key, kv.Value)
}
租约操作¶
// 创建租约
leaseResp, err := cli.Grant(ctx, 60)
if err != nil {
panic(err)
}
leaseID := leaseResp.ID
// 绑定键到租约
_, err = cli.Put(ctx, "/services/user", "192.168.1.1:8080", clientv3.WithLease(leaseID))
if err != nil {
panic(err)
}
// 续租
keepAliveChan, err := cli.KeepAlive(ctx, leaseID)
if err != nil {
panic(err)
}
go func() {
for resp := range keepAliveChan {
fmt.Printf("KeepAlive: %d\n", resp.TTL)
}
}()
// 撤销租约
_, err = cli.Revoke(ctx, leaseID)
if err != nil {
panic(err)
}
事务操作¶
// 事务
txnResp, err := cli.Txn(ctx).
If(clientv3.Compare(clientv3.Value("/config/app"), "=", "old-value")).
Then(clientv3.OpPut("/config/app", "new-value")).
Else(clientv3.OpPut("/config/app", "default-value")).
Commit()
if err != nil {
panic(err)
}
fmt.Printf("Succeeded: %v\n", txnResp.Succeeded)
Python 客户端¶
安装依赖¶
连接 etcd¶
CRUD 操作¶
# 写入数据
etcd.put('/config/app', 'my-app')
# 读取数据
value, metadata = etcd.get('/config/app')
print(f"Value: {value.decode()}")
# 删除数据
etcd.delete('/config/app')
# 前缀查询
for value, metadata in etcd.get_prefix('/config/'):
print(f"Key: {metadata.key.decode()}, Value: {value.decode()}")
租约操作¶
# 创建租约
lease = etcd.lease(60)
# 绑定键到租约
etcd.put('/services/user', '192.168.1.1:8080', lease=lease)
# 续租
lease.refresh()
# 撤销租约
lease.revoke()
小结¶
客户端操作要点:
- etcdctl:命令行工具、基本操作、集群管理
- Go 客户端:连接、CRUD、租约、事务
- Python 客户端:etcd3 库
下一章我们将学习 Watch 机制。