跳转至

第四章:客户端操作

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 客户端

安装依赖

go get go.etcd.io/etcd/client/v3

连接 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 客户端

安装依赖

pip install etcd3

连接 etcd

import etcd3

# 创建客户端
etcd = etcd3.client(host='localhost', port=2379)

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 机制。