ETCD 学习笔记
大约 2 分钟
ETCD 学习笔记
ETCD 简单介绍
etcd 是使用 Go 语言开发的一个开源的、高可用的分布式 key-value 存储系统,可以用于配置共享和服务的注册和发现
etcd 作为一个高可用键值存储系统,天生就是为集群化而设计的
Kubernetes 的组件 kube-apiserver 就是使用了 etcd 作为存储工具
参考:https://www.bookstack.cn/read/huweihuang-kubernetes-notes/etcd-etcd-introduction.md
一、安装
Windows系统
1.下载
下载地址:https://github.com/etcd-io/etcd/releases/

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

提示
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 系统
下载地址:传送门
注
需要的私信我
二、go 操作 etcd
文档:https://pkg.go.dev/go.etcd.io/etcd/client/v3#section-readme
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)
}
}
}
}()