跳至主要內容

ETCD 学习笔记

逸尘.Lycodx大约 2 分钟后端goetcddb

ETCD 学习笔记

ETCD 简单介绍

etcd 是使用 Go 语言开发的一个开源的、高可用的分布式 key-value 存储系统,可以用于配置共享和服务的注册和发现

etcd 作为一个高可用键值存储系统,天生就是为集群化而设计的

Kubernetes 的组件 kube-apiserver 就是使用了 etcd 作为存储工具

参考:https://www.bookstack.cn/read/huweihuang-kubernetes-notes/etcd-etcd-introduction.mdopen in new window

一、安装

Windows系统

1.下载

下载地址:https://github.com/etcd-io/etcd/releases/open in new window

下载完毕后直接解压,解压后如下

提示

etcd.exe 就是客户端,双击启动

2.etcdctl 基本使用

先启动etcd客户端,双击etcd.ext

在安装目录打开cmd,使用ectdctl.ext操作etcd

1、put(新增)

相关信息

etcd 默认端口是 2379

# etcdctl.exe --endpoints=http://地址:端口 put 键 值
etcdctl.exe --endpoints=http://127.0.0.1:2379 put name "张三"

# 连接本地的可以直接简写为
etcdctl.exe put nickname "法外狂徒"

2、get (查询)

# 按key查询
etcdctl.exe --endpoints=http://127.0.0.1:2379 get name
# 按前缀查询
etcdctl.exe --endpoints=http://127.0.0.1:2379 get --prefix <key>
# 按前缀查询,结果限制数量个数
etcdctl.exe --endpoints=http://127.0.0.1:2379 get --limit 2  --prefix <key>
# 查询所有的key-value
etcdctl.exe --endpoints=http://127.0.0.1:2379 get --from-key ""

3、del(删除)

etcdctl.exe --endpoints=http://127.0.0.1:2379 del <key>

4、watch(监听)

etcdctl.exe --endpoints=http://127.0.0.1:2379 watch <key>

watch需要开启2个命令行,一个用来watch,一个用来操作,当操作的那个进行put、del时,watch命令行能监听到变化

Linux 系统

下载地址:传送门open in new window

需要的私信我

二、go 操作 etcd

文档:https://pkg.go.dev/go.etcd.io/etcd/client/v3#section-readmeopen in new window

1、连接etcd

cli, err := clientv3.New(clientv3.Config{
    Endpoints:   []string{"localhost:2379"},
    DialTimeout: 5 * time.Second,
})
if err != nil {
    log.Fatal("connect etcd fail")
}

2、put

ctx, cancel := context.WithTimeout(context.Background(), time.Second)
resp, err := cli.Put(ctx, "test_key", "test_value")
cancel()
if err != nil {
    log.Fatal(err)
}

3、get

ctx, cancel := context.WithTimeout(context.Background(), time.Second)
resp, err := cli.Get(ctx, "test_key")
cancel()
if err != nil {
    log.Fatal(err)
}
for _, ev := range resp.Kvs {
    fmt.Printf("%s:%s\n", ev.Key, ev.Value)
}

4、按前缀获取

ctx, cancel := context.WithTimeout(context.TODO(), time.Second)
resp, err := client.Get(ctx, "ss-", clientv3.WithPrefix())
cancel()
if err != nil {
	log.Fatal(err)
}
for _, ev := range resp.Kvs {
    fmt.Println(ev.Value)
}

5、watch

ctx := context.TODO()
go func() {
    defer func() {
			if e := recover(); e != nil {
				logger.Error(e)
			}
		}()
    for {
        // 前缀watch加上第三个参数 clientv3.WithPrefix()
        rch := client.Watch(ctx, "key")
        for wresp := range rch {
            err := wresp.Err()
            if err != nil {
                log.Fatal(err)
            }
            for _, ev := range wresp.Events {
                fmt.Printf("%s %q %q\n", ev.Type, ev.Kv.Key, ev.Kv.Value)
            }
        }
    }
}()
上次编辑于: