欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Etcd 入门

程序员文章站 2022-07-13 23:09:56
...

Etcd 入门

Etcd3 是 CoreOS 于 2016年7月发布的 etcd新版本

  • 分布式 key-value 存储
  • Go语言编写,Raft一致性算法来管理高可用复制日志

Linux 单机部署

安装etcd

curl -L https://github.com/coreos/etcd/releases/download/v3.2.1/etcd-v3.2.1-linux-amd64.tar.gz -o etcd-v3.2.1-linux-amd64.tar.gz
tar xzvf etcd-v3.2.1-linux-amd64.tar.gz
mv etcd-v3.2.1-linux-amd64 etcd
cd etcd
./etcd --version
etcd Version: 3.2.1
Git SHA: 61fc123
Go Version: go1.8.3
Go OS/Arch: linux/amd64

配置环境变量 /etc/profile

# etcd
export PATH=/root/etcd:$PATH
export ETCDCTL_API=3

ETCDCTL_API API版本,记得source /etc/profile,默认版本2

etcd 目录加入到环境变量,主要是为了 etcd etcdctl 可以方便的执行这两个命令

启动程序,默认为 127.0.0.1:2379

etcd

使用客户端存/取,

因为刚刚启动的etcd 不是后台运行的,我们需要维持shell,另外开一个窗口执行

# 存
$ etcdctl put name tian
OK

# 取
$ etcdctl get name
name
tian

单机多实例集群

多实例集群 我们可以使用 github上开源的构建工具,但是需要安装Go语言环境。

Go语言环境安装

https://blog.csdn.net/sunt2018/article/details/105416526

安装完成后

go get github.com/mattn/goreman
goreman 
# 查看安装是否成功

vim Procfile

https://github.com/etcd-io/etcd/blob/master/Procfile

bin/etcd 改成 etcd , 需要注意的是,去分支中,找到对应etcd的版本,在去复制Procfile,本次实验用的3.2

etcd1: etcd --name infra1 --listen-client-urls http://127.0.0.1:12379 --advertise-client-urls http://127.0.0.1:12379 --listen-peer-urls http://127.0.0.1:12380 --initial-advertise-peer-urls http://127.0.0.1:12380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof

etcd2: etcd --name infra2 --listen-client-urls http://127.0.0.1:22379 --advertise-client-urls http://127.0.0.1:22379 --listen-peer-urls http://127.0.0.1:22380 --initial-advertise-peer-urls http://127.0.0.1:22380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof

etcd3: etcd --name infra3 --listen-client-urls http://127.0.0.1:32379 --advertise-client-urls http://127.0.0.1:32379 --listen-peer-urls http://127.0.0.1:32380 --initial-advertise-peer-urls http://127.0.0.1:32380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof

启动

goreman -f Procfile start
# 查看成员
etcdctl --write-out=table --endpoints=localhost:12379 member list

# 添加数据
etcdctl --endpoints=localhost:12379 put foo bar

# 停止 或者用kill -9 杀掉
goreman run stop etcd2

# 向etcd1中 存入和获取key
etcdctl --endpoints=localhost:12379 put key hello
etcdctl --endpoints=localhost:12379 get key

# 向etcd2 获取key,超时,因为我们关闭了
etcdctl --endpoints=localhost:22379 get key

# 重启etcd2,再次获取,发现数据已经同步了。
# 重启 向本地8555 tcp 发送消息,推测启动命令的master为 8555,子进程为etcd1/2/3
goreman run restart etcd2  
etcdctl --endpoints=localhost:22379 get key

etcd 交互

设置API版本

# 首先要设置我们的API版本
export ETCDCTL_API=3

写入key

$ etcdctl put name zhangsaner
OK

读取key

假设我们有key name1/2/3/4

(base) [[email protected] ~]# etcdctl --endpoints=localhost:12379 put name1 liuda
OK
(base) [[email protected] ~]# etcdctl --endpoints=localhost:12379 put name2 wanger
OK
(base) [[email protected] ~]# etcdctl --endpoints=localhost:12379 put name3 zhangsan
OK
(base) [[email protected] ~]# etcdctl --endpoints=localhost:12379 put name4 lisi
OK
# 获取单个
etcdctl --endpoints=localhost:22379 get name1
etcdctl --endpoints=localhost:22379 get name

# 获取区间, [name1,name4),不包含name4
etcdctl --endpoints=localhost:22379 get name name4

我们重启启动一下程序,修改Profile,将12379改为2379,这样就不需要指定–endpoints=localhost:22379了。

删除key

etcdctl del name

补充

可以使用 /a/b/c/ 来模拟目录结构
租期续约
https://www.jianshu.com/p/b788c3271846
# 读取历史版本 没有搞懂,实验不成功

读取 key 过往版本的值
应用可能想读取 key 的被替代的值。例如,应用可能想通过访问 key 的过往版本来回滚到旧的配置。或者,应用可能想通过访问 key 历史记录的多个请求来得到一个覆盖多个 key 上的统一视图。

因为 etcd 集群上键值存储的每个修改都会增加 etcd 集群的全局修订版本,应用可以通过提供旧有的 etcd 版本来读取被替代的 key。

假设 etcd 集群已经有下列 key:

$ etcdctl put foo bar         # revision = 2
$ etcdctl put foo1 bar1       # revision = 3
$ etcdctl put foo bar_new     # revision = 4
$ etcdctl put foo1 bar1_new   # revision = 5


$ etcdctl get foo foo9 # 访问 key 的最新版本
foo
bar_new
foo1
bar1_new
$ etcdctl get --rev=4 foo foo9 # 访问 key 的修订版本4
foo
bar_new
foo1
bar1
$ etcdctl get --rev=3 foo foo9 # 访问 key 的修订版本3
foo
bar
foo1
bar1
$ etcdctl get --rev=2 foo foo9 # 访问 key 的修订版本2
foo
bar
$ etcdctl get --rev=1 foo foo9 # 访问 key 的修订版本1