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 。
最后更新于
这有帮助吗?