安装etcd:
操作如下
$ export GOPATH=$HOME/go$ mkdir -p $GOPATH/src/go.etcd.io$ git clone https://gitee.com/who7708/etcd 或 git clone https://github.com/etcd-io/etcd$ cd etcd$ ./build$ ./bin/etcd验证:$ ./bin/etcdctl put mykey "this is awesome"$ ./bin/etcdctl get mykeymykeythis is awesome
- 启动成功
- 更新 message,没有则增加
curl http://127.0.0.1:2379/v2/keys/message -XPUT -d value="Hello etcd" | jq .新增时:{ "node": { "createdIndex": 4, "modifiedIndex": 4, "value": "Hello world", "key": "/message" }, "action": "set"}更新时:{ "prevNode": { "createdIndex": 4, "modifiedIndex": 4, "value": "Hello world", "key": "/message" }, "node": { "createdIndex": 5, "modifiedIndex": 5, "value": "Hello etcd", "key": "/message" }, "action": "set"}
- action 请求的动作,因为是新建一个 key 并设置它的值,所以是 set
- node.key key 的 HTTP 路径
- node.value key 的值
- node.createdIndex 每次有 key 被创建的时候增加
- node.modifiedIndex 每次有 key 被修改的时候增加
- prevNode 更新之前该 key 的信息
- 查询 message
curl http://127.0.0.1:2379/v2/keys/message | jq .{ "node": { "createdIndex": 5, "modifiedIndex": 5, "value": "Hello etcd", "key": "/message" }, "action": "get"}
- 删除 message
curl http://127.0.0.1:2379/v2/keys/message -XDELETE | jq .{ "prevNode": { "createdIndex": 5, "modifiedIndex": 5, "value": "Hello etcd", "key": "/message" }, "node": { "createdIndex": 5, "modifiedIndex": 7, "key": "/message" }, "action": "delete"}
其中: modifiedIndex 增加了,但是 createdIndex 没有变化,因为这是一个修改操作,不是新建操作
- 设置 key 存活时间(TTL, time to live)
curl http://127.0.0.1:2379/v2/keys/message-ttl -XPUT -d value="Hello etcd" -d ttl=5 | jq .{ "prevNode": { "createdIndex": 11, "modifiedIndex": 11, "value": "Hello etcd", "key": "/message-ttl" }, "node": { "createdIndex": 12, "modifiedIndex": 12, "ttl": 5, "expiration": "2019-04-28T06:28:38.477817864Z", "value": "Hello etcd", "key": "/message-ttl" }, "action": "set"}
多出的两个字段含义:
- expiration:代表 key 过期被删除的时间
- ttl:表示 key 剩余存活时间 如果需要取消 key 的过期,则重新更新下此 key 并将 ttl 参数设置为空,即
ttl=
- 更新存活时间
refresh=true
curl http://127.0.0.1:2379/v2/keys/message-ttl -XPUT -d ttl=10 -d refresh=true | jq .{ "prevNode": { "createdIndex": 42, "modifiedIndex": 42, "ttl": 2, "expiration": "2019-04-28T06:37:02.466721738Z", "value": "Hello etcd", "key": "/message-ttl" }, "node": { "createdIndex": 43, "modifiedIndex": 43, "ttl": 10, "expiration": "2019-04-28T06:37:11.045243954Z", "value": "Hello etcd", "key": "/message-ttl" }, "action": "set"}
- 监听某个 key 或某个目录下的 key 变化
wait=true [recursive=true]
curl 无法进行堵塞.可以使用 wgetwget http://127.0.0.1:2379/v2/keys/message-ttl?wait=true# curl -XGET http://127.0.0.1:2379/v2/keys/message-ttl -d wait=true | jq .{ "prevNode": { "createdIndex": 45, "modifiedIndex": 45, "value": "hahaha", "key": "/message-ttl" }, "node": { "createdIndex": 46, "modifiedIndex": 46, "value": "Hello etcdsssssssssssssssss", "key": "/message-ttl" }, "action": "set"}
当 key 被修改时,则会获取到修改后的信息了. 除了监听 key 的变化, 还可以提供基于 index 的监听。如果通过 waitIndex 指定了 index,那么会返回从 index 开始出现的第一个事件,这包含了两种情况:
- 给出的 index 小于等于当前 index ,即事件已经发生,那么监听会立即返回该事件
- 给出的 index 大于当前 index,等待 index 之后的事件发生并返回
- 获取 etcd 服务的版本信息
curl http http://127.0.0.1:2379/version | jq .{ "etcdcluster": "3.3.0", "etcdserver": "3.3.0+git"}
- 获取所有key信息
curl http://127.0.0.1:2379/v2/keys | jq .{ "node": { "nodes": [ { "createdIndex": 10, "modifiedIndex": 10, "value": "Hello etcd", "key": "/message" }, ... ], "dir": true }, "action": "get"}
- 响应头
HTTP/1.1 200 OKAccess-Control-Allow-Headers: accept, content-type, authorizationAccess-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETEAccess-Control-Allow-Origin: *Content-Type: application/jsonX-Etcd-Cluster-Id: cdf818194e3a8c32X-Etcd-Index: 10X-Raft-Index: 11X-Raft-Term: 2Date: Sun, 28 Apr 2019 06:20:43 GMTContent-Length: 354
- X-Etcd-Index 当前 etcd 集群的 index
- X-Raft-Index raft 集群的 index
- X-Raft-Term raft 集群的任期,每次有 leader 选举的时候,这个值就会增加
- 获取集群数据信息 etcd 还保存了集群的数据信息,包括节点之间的网络信息,操作的统计信息。
- /v2/stats/leader会返回集群中 leader 的信息,以及 followers 的基本信息
- /v2/stats/self 会返回当前节点的信息
- /v2/state/store:会返回各种命令的统计信息
常用配置的参数和它们的解释
./etcd --name=node1 \ --listen-client-urls "http://127.0.0.1:2379" \ --advertise-client-urls "http://127.0.0.1:2379" \ --listen-peer-urls "http://127.0.0.1:2380"
- --name 方便理解的节点名称,默认为 default,在集群中应该保持唯一,可以使用 hostname
- --data-dir 服务运行数据保存的路径,默认为 ${name}.etcd
- --snapshot-count 指定有多少事务(transaction)被提交时,触发截取快照保存到磁盘
- --heartbeat-interval leader 多久发送一次心跳到 followers。默认值是 100ms
- --eletion-timeout 重新投票的超时时间,如果 follow 在该时间间隔没有收到心跳包,会触发重新投票,默认为 1000 ms
- --listen-peer-urls 和同伴通信的地址,比如 localhost!
- --listen-client-urls 对外提供服务的地址 比如 etcd 交互
- --advertise-client-urls 对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点
- --initial-advertise-peer-urls 该节点同伴监听地址,这个值会告诉集群中其他节点
- --initial-cluster 集群中所有节点的信息,格式为 node1= 这里的 node1 是节点的 --name 指定的名字;后面的 ip1:2380 是 --initial-advertise-peer-urls 指定的值
- --initial-cluster-state 新建集群的时候,这个值为 new;假如已经存在的集群,这个值为 existing
- --initial-cluster-token 创建集群的 token,这个值每个集群保持唯一。这样的话,如果你要重新创建集群,即使配置和之前一样,也会再次生成新的集群和节点 uuid;否则会导致多个集群之间的冲突,造成未知的错误
其他
- 更多启动参数,请使用
./etcd --help
查看 - 其他 API 使用请