etcd 相关介绍

1.安装etcd
yum -y install etcd

2.配置文件说明
2.1 配置文件(/etc/etcd/etcd.conf)
2.2
[member]
ETCD_NAME                           节点名称
ETCD_DATA_DIR                       指定节点的数据存储目录
ETCD_LISTEN_PEER_URLS               监听URL,用于与其他节点通讯
ETCD_LISTEN_CLIENT_URLS             对外提供服务的地址:比如 http://127.0.0.1:2379 ,客户端会连接到这里和 etcd 交互

[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS    该节点同伴监听地址,这个值会告诉集群中其他节点
ETCD_INITIAL_CLUSTER                集群中所有节点的信息,格式为 node1=http://ip1:2380,node2=http://ip2:2380,… 。注意:这里的 node1 是节点的 
--name 指定的名字;后面的 ip1:2380 是 --initial-advertise-peer-urls 指定的值
ETCD_INITIAL_CLUSTER_STATE 新建集群的时候,这个值为 new ;假如已经存在的集群,这个值为 existing ETCD_INITIAL_CLUSTER_TOKEN 创建集群的 token,这个值每个集群保持唯一。这样的话,如果你要重新创建集群,即使配置和之前一样,
也会再次生成新的集群和节点 uuid;否则会导致多个集群之间的冲突,造成未知的错误 ETCD_ADVERTISE_CLIENT_URLS 对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点
3.启动etcd服务 systemctl daemon-reload systemctl enable etcd.service systemctl start etcd.service 4.停止etcd服务 systemctl stop etcd.service

 API相关介绍

1.获取etcd版本
& curl -L http://127.0.0.1:2379/version
2.设置etcd的key的value
V2版本的key在etcd是按照目录格式来存储的:
$ curl http://127.0.0.1:2379/v2/keys/message -XPUT -d value="Hello world"
{"action":"set","node":{"key":"/message","value":"Hello world","modifiedIndex":4,"createdIndex":4}}

返回属性:
1.action:就是刚才我们执行的请求操作,XPUT对应的是set
2.node.key :对应的是我们设置的key,以“/”作为开头
3.value:代表的是如果命令执行成功,key的值
4.node.createdIndex : 这个其实是raft内部的一个单调递增的值,对于etcd数据的更改操作都会分配一个index,所以可以看到,
一开始etcd启动的时候,不是从0而是从4开始的,这是因为etcd内部的一些消息交互(时钟之类)造成的。
5.node.modifiedIndex:set, delete, update, create, compareAndSwap and compareAndDelete 这些操作都会造成这个值的变动。 对于createdIndex 和 modifiedIndex两个值,基本上是一直相等的,当你-XPUT的时候,会同步更新这两个值,但delete和update的时候这两个值就会不同了,
只有modifiedIndex会增加。
3.消息头
etcd的回复里面,包含了简单的消息头,里面的数据也比较重要。

$ curl http://127.0.0.1:2379/v2/keys/message -vv

GET /v2/keys/message HTTP/1.1
User-Agent: curl/7.29.0
Host: 127.0.0.1:2379
Accept: */*

HTTP/1.1 200 OK
Content-Type: application/json
X-Etcd-Cluster-Id: cdf818194e3a8c32
X-Etcd-Index: 31
X-Raft-Index: 33
X-Raft-Term: 2
Date: Fri, 10 May 2019 08:43:37 GMT
Content-Length: 102

{"action":"get","node":{"key":"/message","value":"Hello world","modifiedIndex":31,"createdIndex":31}}
* Connection #0 to host 127.0.0.1 left intact

对于etcd的header:
    1.X-Etcd-Index  代表的是上面说的"modifiedIndex"。watch的时候默认就是从这个index后面开始的。
    2.X-Raft-Index 代表的是底层的raft的协议
    3.X-Raft-Term 代表的是raft的任期的概念。在raft里面这个和logindex是很重要的两个标志位,对于选举有重大意义(raft协议规定选主必须满足数据最新+term最大)
4.读取数据
数据读取比较简单,直接读取某个key就可以。

curl http://127.0.0.1:2379/v2/keys/message

{"action":"get","node":{"key":"/message","value":"Hello world","modifiedIndex":33,"createdIndex":33}}
5.更改key的值
和设置一样,更改的时候用也是PUT操作

& curl http://127.0.0.1:2379/v2/keys/message -XPUT -d value="Hello etcd"
{"action":"set","node":{"key":"/message","value":"Hello etcd","modifiedIndex":34,"createdIndex":34}," prevNode":{"key":"/message","value":"Hello world","modifiedIndex":33,"createdIndex":33}} 更改key的value的时候,可以看到有个preNode,代表的是我们在执行该操作之前,node的状态。如果之前不存在这个key,那么就不存在preNode.
6.删除key

& curl http://127.0.0.1:2379/v2/keys/message -XDELETE

{"action":"delete","node":{"key":"/message","modifiedIndex":35,"createdIndex":34},"prevNode":{"key":"/message","value":

"Hello etcd","modifiedIndex":34,"createdIndex":34}} 删除操作和更改操作基本一致,
7.watch功能
watch功能是etcd里面一个很重要的功能,现在有v2和v3两个版本。分别对应了不同的设计

我们可以通过常轮训来监听key的变化,同时可以使用recursive=true参数来对子key(目录)监听。

//启动监听,会一直等待,直到收到事件
curl 'http://127.0.0.1:2379/v2/keys/foo?wait=true'
//设置key,上面会收到该事件消息
curl http://127.0.0.1:2379/v2/keys/foo -XPUT -d value=bar
//可以看到收到事件信息,第一次设置该key只会显示本次的操作,如果再监听一次可以看到上次的操作。
{"action":"set","node":{"key":"/foo","value":"bar","modifiedIndex":22,"createdIndex":22}}
 //因为etcd会保存最近的1000条记录,如果直接加上waitIndex则直接返回上次的数据,这里选择上面的modifiedIndex,是不会阻塞等待的
curl 'http://127.0.0.1:2379/v2/keys/foo?wait=true&waitIndex=22'
//如果选择一个比目前小的waitIndex(比如选择10),则会返回9之后最早发生的一次。
curl 'http://127.0.0.1:2379/v2/keys/foo?wait=true&waitIndex=10'
//17是最早的一次改动,所以就会返回最早的一次
{"action":"set","node":{"key":"/foo","value":"","modifiedIndex":17,"createdIndex":17}}

recursive参数
curl 'http://127.0.0.1:2379/v2/keys/dir/?wait=true&recursive=true'
curl 'http://127.0.0.1:2379/v2/keys/dir/?wait=true'

两个watch命令都是watch同一个目录,但第一个用了recursive,也就是会监听目录下面所有的key的变化。下面的命令,如果操作目录下的key,不会触发事件。
注意:

etcd的watch智能保持100条记录(V2版本,v3没这个限制),所以收到通知之后应该将response交给其它线程去处理,不要在watch线程里处理,不然容易阻塞!!
8.连接关闭
连接关闭指的是可能server还没来的及发送event,但由于超时或者server发生了关机,因为http的header是一旦接收到连接就会返回头部的,
所以返回值会是200:ok和空的消息体。client需要自己处理这种情况。
原文地址:https://www.cnblogs.com/zhanggaofeng/p/13160121.html