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
上一篇: Extjs 继承的使用
下一篇: extjs的使用