首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ETCD的基本使用 转

ETCD的基本使用 转

作者头像
domain0
发布2018-08-02 11:59:28
1.5K0
发布2018-08-02 11:59:28
举报
文章被收录于专栏:运维一切运维一切运维一切

原文地址: http://www.csdn.net/article/2015-01-22/2823659

Etcd本身提供了基于HTTP的Restful API,但是为了方便运维人员的日常使用,etcdctl实现了这套API中的许多功能,熟练的使用它能够简化不少运维的工作量。

  • 查看目录或键的内容

在上一节中已经用到了的etcdctl ls 和 etcdctl get 命令是最经常使用到的两个基本命令。Etcd的键值可以进行分层和嵌套,Etcd中的目录可以存放多个键以及其他的目录,同时每个具体的目录和键都有自己的“访问路径”,这种做法与文件管理中的普通文件和目录颇为相似。.而etcdctl ls 的作用是查看特定路径下的键或目录列表。例如列出根目录下面的内容:

core@core-01 ~ $ etcdctl ls / /coreos.com

可以通过 –recursive 参数一次性列出指定目录及子目录下所有的内容。

core@core-01 ~ $ etcdctl ls / –recursive /coreos.com /coreos.com/updateengine /coreos.com/updateengine/rebootlock /coreos.com/updateengine/rebootlock/semaphore

而 etcdctl get 命令用于获得指定的键所存储的值,例如:

core@core-01 ~ $ etcdctl get /coreos.com/updateengine/rebootlock/semaphore {“semaphore”:1,”max”:1,”holders”:[]}

对一个目录使用 etcdctl get 命令会得到一个提示信息,告诉使用者这是一个目录。

core@core-01 ~ $ etcdctl get /coreos.com /coreos.com: is a directory

可以通过etcdctl的 -o 参数指定输出内容的格式,例如 -o extended 参数会打印这个键的更详细信息。

core@core-01 ~ $ etcdctl -o extended get /coreos.com/updateengine/rebootlock/semaphore Key: /coreos.com/updateengine/rebootlock/semaphore Created-Index: 6 Modified-Index: 76156 TTL: 0 Etcd-Index: 104439 Raft-Index: 413950 Raft-Term: 12 {“semaphore”:1,”max”:1,”holders”:[]}

  • 创建、修改目录和键的内容

创建一个新的目录和键分别使用 etcdctl mkdir 和 etcdctl mk 命令。

core@core-01 ~ $ etcdctl mkdir /demo core@core-02 ~ $ etcdctl get /demo /demo: is a directory core@core-01 ~ $ etcdctl mk /demo/hello “Hello Etcd”  # 实际情况中这里会回显输出“Hello Etcd”,省略 core@core-02 ~ $ etcdctl get /demo/hello Hello Etcd

实际情况中每次使用 mk 以后,屏幕会回显写入值的内容。由于之后我们都会再次用 get 取出这个值,以验证内容确实写入了Etcd记录中,所以统一省略回显的输出,后面的update和set的例子也是。注意在上面的例子中,我们在core-01节点创建了新的键和目录,然后在core-02节点检查Etcd记录的内容。这样做是为了说明在Etcd服务组成的集群里,每一个节点上获取的数据都是实时同步的。当然,要是在core-01上检查记录内容也会得到相同的结果。

使用 etcdctl mk命令时,如果创建键的路径不存在,会自动创建相应的目录结构,例如:

core@core-01 ~ $ etcdctl mk /path/to/the/new/key “Text Message” core@core-02 ~ $ etcdctl get /path/to/the/new/key Text Message

尝试重复创建一个已经存在的键会产生一个错误。

core@core-01 ~ $ etcdctl mk /demo/hello “Something Else” Error:  105: Key already exists (/demo/hello) [130187]

更新键的记录内容可以通过etcdctl update(或 etcdctl set)命令完成。

core@core-01 ~ $ etcdctl update /demo/hello “Hello CoreOS” core@core-02 ~ $ etcdctl get /demo/hello Hello CoreOS

使用etcdctl update与etcdctl set的区别在于尝试update不存在的键时,会产生一个错误。

core@core-01 ~ $ etcdctl update /demo/xx “Message” Error:  100: Key not found (/demo/xx) [129853]

下面这个表格比较了etcdctl mk、etcdctl update和etcdctl set的异同。从结果可以看出etcdctl set相当于前两者的功能的合并。在实际情况中应该根据实际的应用场景选择相应的命令。

命令/操作

etcdctl mk

etcdctl update

etcdctl set

目标键不存在

创建此键并赋值

出错:Key not found

创建此键并赋值

目标键已经存在

出错:Key already exists

更新键的内容

更新键的内容

  • 删除键和目录

删除键和目录的命令分别为etcdctl rm和etcdctl rmdir:

core@core-01 ~ $ etcdctl rm /demo/hello core@core-01 ~ $ etcdctl get /demo/hello Error:  100: Key not found (/demo/hello) [131166] core@core-01 ~ $ etcdctl rmdir /demo core@core-01 ~ $ etcdctl get /demo Error:  100: Key not found (/demo) [131189]

注意,etcdctl rmdir只能删除空的目录,这一点和Linux的rmdir命令很相似。试图删除还有其他键或子目录的目录会产生一个错误。这种情况可以使用etcdctl rm配合–recursive参数递归删除目录下的所有子目录和键。

core@core-01 ~ $ etcdctl rmdir /path Error:  108: Directory not empty (/path) [131209] core@core-01 ~ $ etcdctl rm /path –recursive

  • TTL:存活时间

Etcd的键值系统有一个对应用配置很有帮助的特性,可以给每一个键或目录指定一个存活时限(TTL,即Time To Life)。TTL的单位是秒,当指定的秒数过去以后,如果相应的键或目录没有得到更新,就会被自动从Etcd记录中移除。

用于给键或目录添加TTL的参数是–ttl,这个命令对几个创建和更新的命令都适用。

core@core-01 ~ $ etcdctl mkdir /path/to/demo –ttl 120  # 给目录添加TTL时间 core@core-01 ~ $ etcdctl mk /path/to/demo/title “Message Title” –ttl 120  # 给键添加TTL时间

通过 update 和 updatedir 的 –ttl 参数能够将键和目录的剩余存活周期重置为指定的新值。这个功能有点像用于确保仪器正确运行的“看门狗”程序,一旦发现程序一定时间内都没有更新相应的Etcd记录,这条记录就会被认为是过期的而直接被移除。在设定了TTL之后,可以使用带 -o extended 参数的ectdctl get命令来检查数据键或目录剩余的存活时间。

core@core-01 ~ $ etcdctl updatedir /path/to/demo –ttl 500  # 更新目录的TTL时间 core@core-01 ~ $ etcdctl update /path/to/demo/titl “Message Title” e–ttl 400  # 更新键的TTL时间

这个功能使得局部的系统出现节点或服务失效时,系统的其余部分能够及时发现这一情况,并作出调整。具体的应用场景我们在以后的进阶篇内容中会举例说明。

监控变化

如果Etcd的功能仅仅局限于数据的存储和分发,它与普通的NoSQL数据库就没有特别的差别了。事实上Etcd所做的远不止这些,作为一个用于集群配置共享的服务,除了TTL这种典型特性外,另一个重要的功能便是数据变更的订阅/通知(Subscript/Public)。

集群中的应用程序为了保持正确的行为,需要时刻依据所需的配置信息进行相应的调整,通常有两种方式可以实现。一种是定期去检查集群配置的内容,即定时轮询(Polling)。另一种是订阅特定的事件,由集群配置服务(Etcd)在相应事件发生的时候直接通知应用程序做出处理。显然从响应的及时性和对应用程序效率的影响来说,后者要更加适用一些。

其实Etcd本身并没有提供一套直接的订阅/通知服务机制,但通过它提供的监控变化API以及HTTP long-polling的办法,是可以实现相同的功能的。与此相关的命令是etcdctl watch和etcdctl exec-watch,前者用于等待指定的键发生变化,后者在前者的基础上提供了变化发生后,自动触发另一段用户指定的命令的能力。

core@core-01 ~ $ etcdctl watch /path/to/demo core@core-02 ~ $ etcdctl update /path/to/demo “new-value”

上面这段例子使用了在core-01节点监听路径/path/to/demo,当etcdctl watch执行后,程序就开始进入等待状态。然后在core-02节点对这个路径上的键进行了更新,此时等待在core-01节点上的etcdctl进程收到了这个变化随即退出。

这个命令可以接收一个参数 –recursive 用于递归监听指定路径下所有子路径的变化。

core@core-01 ~ $ etcdctl watch –recursive /path

单独使用etcdctl watch命令没有太大的意义,因为它每次监听到指定的变化就退出了,什么也做不了。一般会将监听到记录变化以后需要执行的命令写在这行命令的后面,这样当事件发生以后,就会马上执行特定的操作了。在一些后台的脚本中,这种监听功能十分有用。下面的这段脚本实现了自动监听/path/to/demo路径的变化,一旦有变化发生,就将这个键的值前面加上一个“Hello”。

KEY=/path/to/demo while true; do etcdctl watch ${KEY} sleep 1s etcdctl update ${KEY} “Hello $(etcdctl get ${KEY})” done

需要注意这段脚本中的“sleep 1s”这一行,如果去掉这一行,在后面立即使用etcdctl get得到依然是变化发生之前这个键的内容。即etcdctl在接收到变化信号时候,如果想获取变化后的内容,需要等待一点点时间。已经将这个问题提交到了GitHub,有兴趣的同学可以跟一下后续的回复。

除了将需要执行的命令放到etcdctl watch命令之后,etcdctl也提供了一条能够一步到位的命令:exec-watch。但是在实际使用中发现这个命令还存在很多问题,在监视同一个键时,修改了键的内容后,使用watch命令总是能立即返回,但是exec-watch命令经常无缘无故的接收不到;此外exec-watch在执行了指定的命令后会存在命令无法正确退出的问题。鉴于它所完成的工作使用etcdctl watch已经能够做到,这里暂时略去对这个命令的介绍。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016/05/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 监控变化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档