Etcd 入门

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) [root@10-9-127-85 ~]# etcdctl --endpoints=localhost:12379 put name1 liuda
OK
(base) [root@10-9-127-85 ~]# etcdctl --endpoints=localhost:12379 put name2 wanger
OK
(base) [root@10-9-127-85 ~]# etcdctl --endpoints=localhost:12379 put name3 zhangsan
OK
(base) [root@10-9-127-85 ~]# 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章