etcd

etcd是一个用于存储关键元数据的分布式key-value存储系统。etcd 以一致和容错的方式存储元数据,设计用于可靠存储不频繁更新的数据,并提供可靠的观察查询。 所以etcd通常被用于配置管理,服务发现和协调分布式工作,而不是像redis或memcached一样的数据存储。

Hello etcd

让我先搭建一个搭建本地集群,来简单了解一下etcd。 首先需要下载etcd发行版本,进行安装。我这里使用的是3.5.0,github上提供了安装的脚本,我这里使用的是Mac。安装好后进入/tmp/etcd-download-test文件夹,检查是否安装成功::

ETCD_VER=v3.5.0

# choose either URL
GOOGLE_URL=https://storage.googleapis.com/etcd
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
DOWNLOAD_URL=${GOOGLE_URL}

rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test

curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64

# 进入目录,检查是否安装成功
cd /tmp/etcd-download-test
./etcd --version

然后我们通过goreman来启动多成员集群: Procfile文件可以通过 etcd 的 gitub 项目的根目录下找到,但是我们需要做一些修改:

然后通过goreman启动

查看启动信息:

让我们通过删除一个节点来体验一下etcd的容错性和一致性:

API

接下来让我们通过etcdctl提供的API来与etcd进行更深入的交互。

首先我们需要通过环境变量的方式设置使用的API版本:

写入键

etcd会将每个存储的键通过 Raft 协议复制到 etcd 集群的所有成员来实现一致性和可靠性。 所有我们不用像之前的例子那样指定--endpoints来向集群中的某个成员写入键。但是需要注意的是,etcd默认使用2379接口,如果修改了接口仍然需要指定成员才能进行交互:

读取键

通过get指定key可以获取到key对应的值,这个命令将同时返回key和value:

etcdctl还提供了更多功能的读取:

版本

etcd集群内部维护了一个全局的修订版本,每次对键的修改操作都会增加版本号。可以通过指定版本号来获取对应版本key-value的信息。 我们可以通过添加-w=json查看到当前的全局修订版本:

可以从header里面看到,当前的reversion是3,让我们再进行一些操作:

etcd的key-value版本应该如下:

让我们先看一下当前所有的key:

再看看版本为3时所有的key

删除键

通过del可以删除键,并且将返回删除个数:

添加--prev-kv选项可以返回删除的key-value:

更多的删除:

监听键

etcdctl还可以时时监听某些值的变化:

新开一个终端,放入键值:

监听到key-value:

当然,监听也可以使用--prefix指定前缀以同时监听多个key,或者通过etcdctl watch foo foo3来监听多个key。 如果想监听多个不同的key,可以使用以下方式:

我们也可以从某个版本开始监听某个或某些key的变动,这将先输出从指定版本到当前版本的所有变动,然后再继续监听:

压缩版本

从上面的监听可以看到,如果key频繁的修改,将会累积历史版本的数据。etcd可以对历史版本进行压缩,删除之前的历史版本,以释放资源。

租约

etcd可以通过租约来设置key的存活时间。租约需要提前申请,然后附加到某个或某些键上。一旦租约过期,这些键也将会被删除。

60秒后,租约对应的key将会被删除。可以通过续租来延长租约时间:

当然也可以主动停止租约:

可以通过以下命令获取到租约的信息:

认证

etcd可以通过以下命令开启认证,设置角色权限:

但是开启之前必须设置root角色和用户,否则将会报错。我们先创建三种角色:

再分别赋予admin读写权限,usr只读权限。需要注意的是,必须要制定允许访问的key,这里通过--prefix指定了可以访问所有的/为前缀的key:

接下来需要创建用户并设置角色:

开启认证:

之后的操作需要添加--user选项来登录用户,才能操作。并且只能操作以/前缀开头的key。否则会报错:

如果用usr来写入数据,依旧会报错:

RESTful

etcd通过gRPC-gateway提供了RESTful接口来进行操作,具体可以参考 rpc.swagger.json

最后更新于

这有帮助吗?