2019独角兽企业重金招聘Python工程师标准>>>
安装golang
安装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 mykey
mykey
this is awesome
- 启动成功
API 文档
- 更新 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 无法进行堵塞.可以使用 wget
wget 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 OK
Access-Control-Allow-Headers: accept, content-type, authorization
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE
Access-Control-Allow-Origin: *
Content-Type: application/json
X-Etcd-Cluster-Id: cdf818194e3a8c32
X-Etcd-Index: 10
X-Raft-Index: 11
X-Raft-Term: 2
Date: Sun, 28 Apr 2019 06:20:43 GMT
Content-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 和同伴通信的地址,比如 http://ip:2380,如果有多个,使用逗号分隔。需要所有节点都能够访问,所以不要使用 localhost!
- --listen-client-urls 对外提供服务的地址 比如 http://ip:2379,http://127.0.0.1:2379,客户端会连接到这里和 etcd 交互
- --advertise-client-urls 对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点
- --initial-advertise-peer-urls 该节点同伴监听地址,这个值会告诉集群中其他节点
- --initial-cluster 集群中所有节点的信息,格式为 node1=http://ip1:2380,node2=http://ip2:2380,…。注意 这里的 node1 是节点的 --name 指定的名字;后面的 ip1:2380 是 --initial-advertise-peer-urls 指定的值
- --initial-cluster-state 新建集群的时候,这个值为 new;假如已经存在的集群,这个值为 existing
- --initial-cluster-token 创建集群的 token,这个值每个集群保持唯一。这样的话,如果你要重新创建集群,即使配置和之前一样,也会再次生成新的集群和节点 uuid;否则会导致多个集群之间的冲突,造成未知的错误
其他
- 更多启动参数,请使用
./etcd --help
查看 - 其他 API 使用请参考官网