ETCD的基本使用 转

原文地址: 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已经能够做到,这里暂时略去对这个命令的介绍。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张尧博客

su和sudo之间的区别以及如何在Linux中配置sudo

54060
来自专栏北京马哥教育

Varnish 4.0 实战

简介 Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 squid 相比,v...

42240
来自专栏HansBug's Lab

【前端】Ubuntu16下nodejs+npm+vue环境配置

笔者最近在学习vue.js,不过一直都是在runoob上面各种尝试。今天笔者在本机(Ubuntu16.04)尝试部署了nodejs+npm+vue开发环境,接下...

38050
来自专栏编程

小白爬虫之爬虫快跑

使用多线程时好像在目录切换的问题上存在问题,可以给线程加个锁试试 Hello 大家好!我又来了。 你是不是发现下载图片速度特别慢、难以忍受啊!对于这种问题一般解...

20280
来自专栏技术之路

Http概述(一)

Http使用的是可靠的数据传输协议,因此即使数据来自地球的另一端,也能够确保数据在传输过程中不会被损坏或产生混乱。 这样用户在访问信息时就不用担心其完整性了。 ...

21550
来自专栏日常工作总结

Redis运维总结

【持久化设置】 对于redis,有两种持久化方式:rdb和aof rdb:后台定期生成一个dump文件,保存当前redis内存中所有的数据 aof:类似日志,记...

24140
来自专栏大内老A

WCF如何克服HTTP传输协议的局限提供对不同消息传输模式的实现

WCF采用消息作为通信的唯一手段,它支持不同的消息交换模式(MEP:Message Exchange Pattern),比较典型的有以下三种MEP:One-Wa...

19360
来自专栏AndroidTv

记录 FTPClient 超时处理的相关问题问题源码跟进结论常见异常

apache 有个开源库:commons-net,这个开源库中包括了各种基础的网络工具类,我使用了这个开源库中的 FTP 工具。

29320
来自专栏醒者呆

程序员必备课程——网络编程入门

关键字:互联网协议,网络分层,socket,TCP/IP协议,jdk源码,多线程,线程池,ExecutorService 本文的主要目的是面向程序员,所以...

58260
来自专栏Web项目聚集地

Linux养成计划(三)

既然在虚拟机上面安装了CentOS操作系统,直接在虚拟机操作不就可以,为什么还需要远程登陆呢?在公司中每个程序员都有一个电脑,但是我们需要操作的Linux服务器...

10820

扫码关注云+社区

领取腾讯云代金券