如何使用 Etcdctl 和 Etcd(CoreOS 的分布式键值存储库

介绍

使CoreOS成为可能的技术之一是etcd,这是一个全球分布的关键价值存储器,该服务被单个CoreOS机器用来组成一个集群,并作为一个存储全球可访问的数据的平台。

在本指南中,我们将探索etcd大门以及etcdctl实用程序和可用于控制的 HTTP/JSON API。

前提条件

为了跟随本指南,我们假设您有一个CoreOS机组,我们的指南是 在DigitalOcean上设置一个CoreOS群组的概述。

  • coreos-1
  • coreos-2
  • coreos-3

一旦你有这些机器上运行,你可以继续这个指南。

ETCD集群发现模型

etcd负责的最基本的任务之一是将单个机器组织成一个群集,这是在CoreOS启动时通过检查在创建时传递的cloud-config文件中提供的发现地址来完成的。

由 CoreOS 运营的发现服务可在 https://discovery.etcd.io 获取. 您可以通过访问 /new 页面获得新的代币。 在那里,您将获得一个代币,您的机器可以用来发现他们的伴侣节点。 它将看起来像这样的东西:

1https://discovery.etcd.io/dcadc5d4d42328488ecdcd7afae5f57c

你必须为每一个新集群提供一个新代币,包括当你需要使用可能具有相同IP地址的节点重建集群时。

在您的 Web 浏览器中访问发现地址时,您将获得描述已知机器的 JSON 对象。

1{"action":"get","node":{"key":"/_etcd/registry/dcadc5d4d42328488ecdcd7afae5f57c","dir":true,"modifiedIndex":102511104,"createdIndex":102511104}}

启动您的集群后,您将能够在这里看到更多信息:

1{"action":"get","node":{"key":"/_etcd/registry/1edee33e6b03e75d9428eacf0ff94fda","dir":true,"nodes":[{"key":"/_etcd/registry/1edee33e6b03e75d9428eacf0ff94fda/2ddbdb7c872b4bc59dd1969ac166501e","value":"http://10.132.252.38:7001","expiration":"2014-09-19T13:41:26.912303668Z","ttl":598881,"modifiedIndex":102453704,"createdIndex":102453704},{"key":"/_etcd/registry/1edee33e6b03e75d9428eacf0ff94fda/921a7241c31a499a97d43f785108b17c","value":"http://10.132.248.118:7001","expiration":"2014-09-19T13:41:29.602508981Z","ttl":598884,"modifiedIndex":102453736,"createdIndex":102453736},{"key":"/_etcd/registry/1edee33e6b03e75d9428eacf0ff94fda/27987f5eaac243f88ca6823b47012c5b","value":"http://10.132.248.121:7001","expiration":"2014-09-19T13:41:41.817958205Z","ttl":598896,"modifiedIndex":102453860,"createdIndex":102453860}],"modifiedIndex":101632353,"createdIndex":101632353}}

如果你需要找到集群的发现URL,你可以从任何一个是会员的机器中找到它。

1cat /run/systemd/system/etcd.service.d/20-cloudinit.conf
1[Service]
2Environment="ETCD_ADDR=10.132.248.118:4001"
3Environment="ETCD_DISCOVERY=https://discovery.etcd.io/dcadc5d4d42328488ecdcd7afae5f57c"
4Environment="ETCD_NAME=921a7241c31a499a97d43f785108b17c"
5Environment="ETCD_PEER_ADDR=10.132.248.118:7001"

该 URL 存储在ETCD_DISCOVERY列表中。

当运行etcd的机器启动时,它们会检查这个URL上的信息,它会提交自己的信息和关于其他成员的查询。在群集中的第一个节点显然不会找到关于其他节点的信息,因此它会指定自己为群集领导者。

接下来的机器也将与发现URL联系他们的信息,他们将收到有关已经登录的机器的信息,然后他们将选择其中一个机器,并直接连接,在那里他们将获得健康集群成员的完整列表。

关于每个机器的数据存储在一个隐藏的目录结构内etcd。你可以通过键入查看有关etcd知道的机器的信息:

1etcdctl ls /_etcd/machines --recursive
1/_etcd/machines/2ddbdb7c872b4bc59dd1969ac166501e
2/_etcd/machines/921a7241c31a499a97d43f785108b17c
3/_etcd/machines/27987f5eaac243f88ca6823b47012c5b

etcd传递给新群集成员的细节包含在这些密钥中. 您可以通过请求具有etcdctl的值来查看个别值:

1etcdctl get /_etcd/machines/2ddbdb7c872b4bc59dd1969ac166501e
1etcd=http%3A%2F%2F10.132.252.38%3A4001&raft=http%3A%2F%2F10.132.252.38%3A7001

我们将在以后更深入地讨论etcdctl命令。

ETCDCTL 使用

通过HTTP/JSON API和通过客户端,如包含的etcdctl实用程序。

查看密钥和目录

要开始,让我们看看etcdctl目前存储的内容,我们可以通过键入查看顶级键:

1etcdctl ls /
1/coreos.com

正如你可以看到的,我们有一个结果. 在此时刻,它不清楚这是一个目录或一个密钥. 我们可以尝试获取节点,以查看钥匙的值或看到它是一个目录:

1etcdctl get /coreos.com
1/coreos.com: is a directory

为了避免这种手动回归过程,我们可以告诉etcdctl通过键入列出其可见信息的整个层次结构:

1etcdctl ls / --recursive
1/coreos.com
2/coreos.com/updateengine
3/coreos.com/updateengine/rebootlock
4/coreos.com/updateengine/rebootlock/semaphore

正如你可以看到的那样,最初的/coreos.com节点下有相当多的目录,我们可以通过在最终终点询问信息来看到从节点中获取实际数据的样子:

1etcdctl get /coreos.com/updateengine/rebootlock/semaphore
1{"semaphore":1,"max":1,"holders":null}

它不包含对我们非常有用的信息,我们可以通过-o 扩展选项来获取有关该条目的一些额外元数据,这是一个全球性的选项,因此它必须在得到命令之前出现:

1etcdctl -o extended get /coreos.com/updateengine/rebootlock/semaphore
1Key: /coreos.com/updateengine/rebootlock/semaphore
2Created-Index: 6
3Modified-Index: 6
4TTL: 0
5Etcd-Index: 170387
6Raft-Index: 444099
7Raft-Term: 8
8
9{"semaphore":1,"max":1,"holders":null}

设置密钥和创建节点

要创建一个新目录,您可以使用mkdir命令如下:

1etcdctl mkdir /example

要创建一个密钥,您可以使用mk命令:

1etcdctl mk /example/key data
1data

如果我们询问我们创建的密钥的值,我们可以检索我们设置的数据:

1etcdctl get /example/key
1data

若要更新现有密钥,请使用更新命令:

1etcdctl update /example/key turtles
1turtles

对目录的updatedir命令可能只有在您在目录中设置 TTL 或 live-to-time 时,才有用。这将更新 TTL 时间,以便通过。

1etcdctl mkdir /here/you/go --ttl 120

然后您可以用更新更新 TTL:

1etcdctl updatedir /here/you/go --ttl 500

要更改现有密钥的值,或创建一个密钥,如果它不存在,请使用设置命令。

1etcdctl set /example/key new
1new

这可能包括不存在的路径,路径组件将以动态的方式创建:

1etcdctl set /a/b/c here
1here

要为目录获得相同的创建如果不存在的功能,您可以使用setdir命令:

1etcdctl setdir /x/y/z

** 注意**:setdir命令目前不按照所述的方式运作。在当前的构建中,它的使用反映了updatedir命令,如果目录已经存在,它将失败。

删除入口

要删除现有键,您可以使用rmrmdir命令。

rm命令可以用来删除一个密钥:

1etcdctl rm /a/b/c

它还可以被重复使用来删除一个目录和每个子目录:

1etcdctl rm /a --recursive

若要只删除一个空的目录 _ 或_ 键,请使用rmdir命令:

1etcdctl rmdir /x/y/z

这可以用来确保您只删除等级的终点。

观察变化

您可以观看特定密钥或整个目录的更改. 使用etcdctl观看这些将导致操作暂停,直到某些事件发生在正在观看的任何东西。

要查看一个密钥,使用它没有任何旗帜:

1etcdctl watch /example/hello

要停止观看,您可以按CTRL-C。如果在观看过程中检测到更改,则返回新的值。

要查看整个目录结构,请使用--重复性旗帜:

1etcdctl watch --recursive /example

您可以看到通过将其放置在一个简单的循环结构中,以不断监控值的状态,这将是多么有用:

1while true; do etcdctl watch --recursive /example; done

如果您想每次检测到更改时执行命令,请使用exec-watch命令:

1etcdctl exec-watch --recursive  /example -- echo "hello"

这将每当该目录中的值发生变化时,对屏幕响起你好的响应。

隐藏的价值观

一个不立刻显而易见的事情是,在etcd里面有隐藏的目录结构,这些目录或键始于标注。

这些不是传统的etcdctl工具列出的,你必须知道你在寻找什么才能找到它们。

例如,有一个名为/_coreos.com的隐藏目录,其中包含有关fleet的一些内部信息。

1etcdctl ls --recursive /_coreos.com
1/_coreos.com/fleet
2/_coreos.com/fleet/states
3/_coreos.com/fleet/states/[email protected]
4/_coreos.com/fleet/states/[email protected]/2ddbdb7c872b4bc59dd1969ac166501e
5/_coreos.com/fleet/states/[email protected]
6/_coreos.com/fleet/states/[email protected]/921a7241c31a499a97d43f785108b17c
7. . .

另一个类似的目录结构位于 /_etcd 内:

1etcdctl ls --recursive /_etcd
1/_etcd/machines
2/_etcd/machines/27987f5eaac243f88ca6823b47012c5b
3/_etcd/machines/2ddbdb7c872b4bc59dd1969ac166501e
4/_etcd/machines/921a7241c31a499a97d43f785108b17c
5/_etcd/config

这些功能就像任何其他条目一样,唯一的区别是它们不会出现在一般列表中,您可以通过简单地开始您的密钥或目录名称来创建它们。

使用 HTTP/JSON API

etcd互动的另一种方式是使用简单的 HTTP/JSON API。

要访问 API,您可以使用简单的 HTTP 程序,如curl。 您必须提供-L 标志,以跟随任何被传回的重定向。

** 注意**: 要从 Docker 容器中连接到 etcd,可以使用 http://172.17.42.1:4001 地址。

正常的密钥空间可以通过在任何主机上访问 http://127.0.0.1:4001/v2/keys/,例如,要获取顶级密钥/目录的列表,请键入:

1curl -L http://127.0.0.1:4001/v2/keys/
1{"action":"get","node":{"key":"/","dir":true,"nodes":[{"key":"/coreos.com","dir":true,"modifiedIndex":6,"createdIndex":6},{"key":"/services","dir":true,"modifiedIndex":333,"createdIndex":333}]}}

请求中的追踪切割是强制性的,没有它就无法正确解决。

您可以使用正常的 HTTP 口音设置或检索值。

若要更改这些操作的行为,您可以使用?flag=value语法在请求的末尾传输旗帜。

例如,要重复列出所有键,我们可以键入:

1curl -L http://127.0.0.1:4001/v2/keys/?recursive=true
1{"action":"get","node":{"key":"/","dir":true,"nodes":[{"key":"/coreos.com","dir":true,"nodes":[{"key":"/coreos.com/updateengine","dir":true,"nodes":[{"key":"/coreos.com/updateengine/rebootlock","dir":true,"nodes":[{"key":"/coreos.com/updateengine/rebootlock/semaphore","value":"{\"semaphore\":1,\"max\":1,\"holders\":null}","modifiedIndex":6,"createdIndex":6}],"modifiedIndex":6,"createdIndex":6}],"modifiedIndex":6,"createdIndex":6}],"modifiedIndex":6,"createdIndex":6}. . .

在正常键盘空间之外可访问的另一个有用的信息是版本信息,可以在这里访问:

1curl -L http://127.0.0.1:4001/version
1etcd 0.4.6

您可以通过访问此终端查看每个群集领导者与每个追随者的关系的统计数据:

1curl -L http://127.0.0.1:4001/v2/stats/leader
1{"leader":"921a7241c31a499a97d43f785108b17c","followers":{"27987f5eaac243f88ca6823b47012c5b":{"latency":{"current":1.607038,"average":1.3762888642395448,"standardDeviation":1.4404313533578545,"minimum":0.471432,"maximum":322.728852},"counts":{"fail":0,"success":98718}},"2ddbdb7c872b4bc59dd1969ac166501e":{"latency":{"current":1.584985,"average":1.1554367141497013,"standardDeviation":0.6872303198242179,"minimum":0.427485,"maximum":31.959235},"counts":{"fail":0,"success":98723}}}}

可以使用类似的操作来检测您目前使用的机器的统计数据:

1curl -L http://127.0.0.1:4001/v2/stats/self
1{"name":"921a7241c31a499a97d43f785108b17c","state":"leader","startTime":"2014-09-11T16:42:03.035382298Z","leaderInfo":{"leader":"921a7241c31a499a97d43f785108b17c","uptime":"1h19m11.469872568s","startTime":"2014-09-12T19:47:25.242151859Z"},"recvAppendRequestCnt":1944480,"sendAppendRequestCnt":201817,"sendPkgRate":40.403374523779064,"sendBandwidthRate":3315.096879676072}

若要查看已预先形成的操作的统计数据,请键入:

1curl -L http://127.0.0.1:4001/v2/stats/store
1{"getsSuccess":78823,"getsFail":14,"setsSuccess":121370,"setsFail":4,"deleteSuccess":28,"deleteFail":32,"updateSuccess":20468,"updateFail":4,"createSuccess":39,"createFail":102340,"compareAndSwapSuccess":51169,"compareAndSwapFail":0,"compareAndDeleteSuccess":0,"compareAndDeleteFail":0,"expireCount":3,"watchers":6}

这些只是可以用来通过API控制etcd的操作的一些。

ETCD 配置

etcd服务可以以几种不同的方式配置。

第一种方法是通过您使用的云配置文件传输参数来启动节点,在启动指南中,您看到了如何做到这一点:

1#cloud-config
2
3coreos:
4  etcd:
5    discovery: https://discovery.etcd.io/<token>
6    addr: $private_ipv4:4001
7    peer-addr: $private_ipv4:7001
8. . .

若要查看您可用的选项,请使用-h旗和etcd:

1etcd -h

若要将这些选项纳入您的云配置,只需取下主盘并将键从具有同列符号的值分开,而不是平等符号。

在阅读cloud-config文件后,CoreOS将这些转换为一个 stub 单元文件中的环境变量,用于启动服务。

另一种调整etcd设置的方法是通过API,通常使用7001端口,而不是用于关键查询的标准4001

例如,您可以通过键入某些当前配置值:

1curl -L http://127.0.0.1:7001/v2/admin/config
1{"activeSize":9,"removeDelay":1800,"syncInterval":5}

您可以通过将新 JSON 作为 PUT 操作的数据负载来更改这些值:

1curl -L http://127.0.0.1:7001/v2/admin/config -XPUT -d '{"activeSize":9,"removeDelay":1800,"syncInterval":5}'
1{"activeSize":9,"removeDelay":1800,"syncInterval":5}

要获取机器列表,您可以到 /v2/admin/machines 端点:

1curl -L http://127.0.0.1:7001/v2/admin/machines
1[{"name":"27987f5eaac243f88ca6823b47012c5b","state":"follower","clientURL":"http://10.132.248.121:4001","peerURL":"http://10.132.248.121:7001"},{"name":"2ddbdb7c872b4bc59dd1969ac166501e","state":"follower","clientURL":"http://10.132.252.38:4001","peerURL":"http://10.132.252.38:7001"},{"name":"921a7241c31a499a97d43f785108b17c","state":"leader","clientURL":"http://10.132.248.118:4001","peerURL":"http://10.132.248.118:7001"}]

这可以用DELETE方法强制地从集群中移除机器。

结论

正如您所看到的,etcd可以用来存储或从集群中的任何机器中获取信息,这使您能够同步数据,并为服务提供一个位置,以搜索配置数据和连接细节。

这在构建分布式系统时尤其有用,因为您可以提供一个简单的终端点,该终端点在集群中的任何位置都将有效。

Published At
Categories with 技术
comments powered by Disqus