etcd的简单使用

 

etcd的简单使用

ETCD安装配置

安装

https://github.com/coreos/etcd/releases/下载想要的版本解压etcd包
解压后进入目录,增长x权限html

chmod +x etcd 
chmod +x etcdctl
 

并将etcd和etcdctl 复制到 /binnode

配置启动

简单启动

./bin/etcd 这样就能够启动使用git

集群配置

在两台机器上部署了简单的集群github

192.168.231.130
192.168.231.132
 

在配置文件/etc/defalut/etcd 中增长:sql

ETCD_OPTS="-name infra0   -initial-advertise-peer-urls http://192.168.231.130:2380   -listen-peer-urls http://192.168.231.130:2380   -initial-cluster-
token etcd-cluster-1   -initial-cluster infra0=http://192.168.231.130:2380,infra1=http://192.168.231.132:2380   -initial-cluster-state new"
 

也可用参数的方法json

ETCD_INITIAL_CLUSTER="infra0=http://192.168.231.130:2380,infra1=http://192.168.231.132:2380"
ETCD_INITIAL_CLUSTER_STATE=new
 

192.168.231.132机器上api

ETCD_OPTS="-name infra1   -initial-advertise-peer-urls http://192.168.231.132:2380   -listen-peer-urls http://192.168.231.132:2380   -initial-cluster-token etcd-cluster-1   -initial-cluster infra0=http://192.168.231.130:2380,infra1=http://192.168.231.132:2380   -initial-cluster-state new"

 

 

参数解释app

启动etcd进程后查看集群curl

etcdctl member list
27e6981eec74137d: name=infra0 peerURLs=http://192.168.231.130:2380 clientURLs=http://localhost:2379,http://localhost:4001
3955a9b061e52de1: name=infra1 peerURLs=http://192.168.231.132:2380 clientURLs=http://localhost:2379,http://localhost:4001

 

 

判断leader和followerspost

curl http://127.0.0.1:2379/v2/stats/leader

{"leader":"27e6981eec74137d","followers":{"3955a9b061e52de1":{"latency":{"current":0.178536,"average":0.26406266231884085,"standardDeviation":0.3787246458449882,"minimum":0.084328,"maximum":10.527117},"counts":{"fail":0,"success":1380}}}}

 

 

协议

简单发送一个请求设置key值的请求

# curl -vvv http://127.0.0.1:2379/v2/keys/mykey -XPUT -d value="this is test"
* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 2379 (#0)
> PUT /v2/keys/mykey HTTP/1.1
> User-Agent: curl/7.35.0
> Host: 127.0.0.1:2379
> Accept: */*
> Content-Length: 18
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 18 out of 18 bytes
< HTTP/1.1 200 OK
< Content-Type: application/json
< X-Etcd-Cluster-Id: 69bc358c20384a4c
< X-Etcd-Index: 16333
< X-Raft-Index: 87030
< X-Raft-Term: 117
< Date: Fri, 14 Aug 2015 01:39:39 GMT
< Content-Length: 201
<
{"action":"set","node":{"key":"/mykey","value":"this is test","modifiedIndex":16333,"createdIndex":16333},"prevNode":{"key":"/mykey","value":"this is test","modifiedIndex":14840,"createdIndex":14840}}
* Connection #0 to host 127.0.0.1 left intact

 

 

http接口是rest api的风格

body里面字段详解:

  • action: set 操做对应的是url的put,rest api的风格
  • node.key: 设置的key值
  • node.value: 设置的value值
  • node.createdIndex: 惟一的整数,每当etcd有改变时,这个值也会发生变化. 不只限于key值操做,包括增长和同步服务改变。这里要修改
  • node.modifiedIndex: 和createdIndex相似,也是一个惟一证整数 set , delete , update , create , - compareAndSwap , compareAndDelete 这些操做都会改变这个值,而get和watch 命令不会修改改变这个值

header字段详解:

X-Etcd-Cluster-Id: 69bc358c20384a4c
X-Etcd-Index: 16333
X-Raft-Index: 87030
X-Raft-Term: 117
  • X-Etcd-Index 等同于createdIndex.
  • X-Etcd-Index is the current etcd index when the watch starts, which means that the watched event may happen after X-Etcd-Index
  • X-Raft-Index 相似etcd index,可是用于raft protocol
  • X-Raft-Term is an integer that will increase whenever an etcd master election happens in the cluster. If this number is increasing rapidly, you may need to tune the election timeout. See the tuning section for details.

可使用etcdctl简化操做

# etcdctl get mykey
this is test
 

基本操做

可使用etcdctl或者url去执行手动操做
etcdctl几个有用的附加命令

  • –debug 将指令的url显示出来
# etcdctl --debug get mykey
Cluster-Endpoints: http://localhost:2379, http://localhost:2379, http://localhost:4001, http://localhost:4001
Curl-Example: curl -X GET http://localhost:2379/v2/keys/mykey?consistent=true&recursive=false&sorted=false
this is test

 

 
  • –output /-o 将输出以指定的方式显示出来
# etcdctl -o json get mykey 
{"action":"get","node":{"key":"/mykey","value":"12345","modifiedIndex":18134,"createdIndex":18134},"etcdIndex":18168,"raftIndex":96532,"raftTerm":124}

# etcdctl get mykey         
12345

 

 

查看版本

curl -L http://127.0.0.1:2379/version

etcdctl –version

# etcdctl --version
etcdctl version 2.0.13

 

 

设定键值

etcdctl set key value 
curl -X PUT http://localhost:2379/v2/keys/key -d value=value

 

如想要建立一个{mykey,kkkkk}的键值

# etcdctl --debug -o json set mykey kkkkk
Curl-Example: curl -X PUT http://localhost:2379/v2/keys/mykey -d value=kkkkk
{"action":"set","node":{"key":"/mykey","value":"kkkkk","modifiedIndex":21283,"createdIndex":21283},"prevNode":{"key":"/mykey","value":"kkkkk","modifiedIndex":20087,"createdIndex":20087},"etcdIndex":21283,"raftIndex":112958,"raftTerm":149}

# etcdctl --debug -o json get mykey
Curl-Example: curl -X GET http://localhost:2379/v2/keys/mykey?consistent=true&recursive=false&sorted=false
{"action":"get","node":{"key":"/mykey","value":"kkkkk","modifiedIndex":21283,"createdIndex":21283},"etcdIndex":21283,"raftIndex":112963,"raftTerm":149}

 

 

这里显示了前一个值,设置后再get返回的是最新的值
etcdctl mk key value也能起到建立并设置键值的做用,和set操做的区别主要是,不能对已存在的key进行建立的操做

# etcdctl --debug -o json mk aa 11
Curl-Example: curl -X PUT http://localhost:2379/v2/keys/aa?prevExist=false -d value=11
{"action":"create","node":{"key":"/aa","value":"11","modifiedIndex":21093,"createdIndex":21093},"etcdIndex":21093,"raftIndex":112010,"raftTerm":149}

# etcdctl --debug -o json mk aa 22
Curl-Example: curl -X PUT http://localhost:2379/v2/keys/aa?prevExist=false -d value=22
Error:  105: Key already exists (/aa) [21098]

 

 

查看键值

etcdctl get key 
curl -X GET http://localhost:2379/v2/keys/key?

etcdctl --debug -o json get mykey
Cluster-Endpoints: http://localhost:2379, http://localhost:2379, http://localhost:4001, http://localhost:4001
Curl-Example: curl -X GET http://localhost:2379/v2/keys/mykey?consistent=true&recursive=false&sorted=false
{"action":"get","node":{"key":"/mykey","value":"12345","modifiedIndex":18134,"createdIndex":18134},"etcdIndex":18661,"raftIndex":99095,"raftTerm":126}

 

 

查看键值

etcdctl rm key 
curl -X DELETE http://localhost:2379/v2/keys/key?

# etcdctl --debug -o json rm mykey
Cluster-Endpoints: http://localhost:2379, http://localhost:2379, http://localhost:4001, http://localhost:4001
Curl-Example: curl -X DELETE http://localhost:2379/v2/keys/mykey?dir=false&recursive=false
{"action":"delete","node":{"key":"/mykey","modifiedIndex":18766,"createdIndex":18701},"prevNode":{"key":"/mykey","value":"kkkkk","modifiedIndex":18701,"createdIndex":18701},"etcdIndex":18766,"raftIndex":99607,"raftTerm":127}

# etcdctl --debug -o json get mykey
Cluster-Endpoints: http://localhost:2379, http://localhost:2379, http://localhost:4001, http://localhost:4001
Curl-Example: curl -X GET http://localhost:2379/v2/keys/mykey?consistent=true&recursive=false&sorted=false
Error:  100: Key not found (/mykey) [18766]

 



设置键值的TTL

etcdctl set key value –ttl time
curl -X PUT http://localhost:2379/v2/keys/key -d value=value -d ttl=time
经过设置TTL可让key值在规定时间过时,好比设置这个key的ttl为100

 etcdctl --debug -o json set mykey ok --ttl 100
Cluster-Endpoints: http://localhost:2379, http://localhost:2379, http://localhost:4001, http://localhost:4001
Curl-Example: curl -X PUT http://localhost:2379/v2/keys/mykey -d value=ok -d ttl=100
{"action":"set","node":{"key":"/mykey","value":"ok","expiration":"2015-08-14T03:15:14.665295244Z","ttl":100,"modifiedIndex":19036,"createdIndex":19036},"etcdIndex":19036,"raftIndex":100957,"raftTerm":129}

 

 

过了几十秒查看,ttl减为23

# etcdctl --debug -o json get mykey
Cluster-Endpoints: http://localhost:2379, http://localhost:2379, http://localhost:4001, http://localhost:4001
Curl-Example: curl -X GET http://localhost:2379/v2/keys/mykey?consistent=true&recursive=false&sorted=false
{"action":"get","node":{"key":"/mykey","value":"ok","expiration":"2015-08-14T03:15:14.665295244Z","ttl":23,"modifiedIndex":19036,"createdIndex":19036},"etcdIndex":19077,"raftIndex":101148,"raftTerm":129}

 

 

当ttl减为0,这个key值就查询不到了

Error:  100: Key not found (/mykey) [19084]

 

 

目录的ttl设置方法和key的相似

监控键值的改动

etcdctl watch key 
curl -X GET http://localhost:2379/v2/keys/key?consistent=true&wait=true 

 


监听键值的改动,而后输出信息, –after-index能够根据etcd-index来获取后续index对应的改动

etcdctl --debug watch mykey 
Cluster-Endpoints: http://localhost:2379, http://localhost:2379, http://localhost:4001, http://localhost:4001
Curl-Example: curl -X GET http://localhost:2379/v2/keys/mykey?consistent=true&wait=true

 

 

当监测到键值设置为kkkkk时打印

kkkkk

 

 

若etcdctl watch 带上–forever参数则会不退出一直监测键值的改动,好比这里检测到了set和delete操做

# etcdctl --debug -o json watch mykey --forever
Curl-Example: curl -X GET http://localhost:2379/v2/keys/mykey?consistent=true&wait=true


{"action":"set","node":{"key":"/mykey","value":"kkkkk","modifiedIndex":19656,"createdIndex":19656},"prevNode":{"key":"/mykey","value":"kkkkk","modifiedIndex":19645,"createdIndex":19645},"etcdIndex":19655,"raftIndex":104107,"raftTerm":131}


Curl-Example: curl -X GET http://localhost:2379/v2/keys/mykeyconsistent=true&wait=true&waitIndex=19657

{"action":"delete","node":{"key":"/mykey","modifiedIndex":19661,"createdIndex":19656},"prevNode":{"key":"/mykey","value":"kkkkk","modifiedIndex":19656,"createdIndex":19656},"etcdIndex":19656,"raftIndex":104115,"raftTerm":131}


Curl-Example: curl -X GET http://localhost:2379/v2/keys/mykey?consistent=true&wait=true&waitIndex=19662

 

 

对于目录类型的key能够用–recursive 来检测目录下的子keys的改动

一样能够用做监测的命令是exec-watch,相比watch,增长了监测到改动能够执行自定义的操做
etcdctl watch key command

# etcdctl exec-watch mykey -- sh -c 'echo hit'
hit

 

 

目录相关的操做

etcdctl mkdir dirname

建立一个目录能够关联多个子keys,好比先创建一个名叫mydir的dir

etcdctl --debug -o json mkdir mydir 
Curl-Example: curl -X PUT http://localhost:2379/v2/keys/mydir?dir=true&prevExist=false

 

 

在这个dir下面能够创建多个keys

# etcdctl --debug -o json set /mydir/key1 11111
Curl-Example: curl -X PUT http://localhost:2379/v2/keys/mydir/key1 -d value=11111
{"action":"set","node":{"key":"/mydir/key1","value":"11111","modifiedIndex":20850,"createdIndex":20850},"etcdIndex":20850,"raftIndex":110723,"raftTerm":148}

# etcdctl --debug -o json set /mydir/key2 22222
Curl-Example: curl -X PUT http://localhost:2379/v2/keys/mydir/key2 -d value=22222
{"action":"set","node":{"key":"/mydir/key2","value":"22222","modifiedIndex":20855,"createdIndex":20855},"etcdIndex":20855,"raftIndex":110747,"raftTerm":148}

 

 

能够用etcdctl ls dirname进行查看,获得该dir下面的2个key

# etcdctl --debug -o json ls /mydir
Curl-Example: curl -X GET http://localhost:2379/v2/keys/mydir?consistent=true&recursive=false&sorted=false
/mydir/key2
/mydir/key1

 

 

若是向目录名的路径 post一个value,那么在这个目录下面会自动用createdIndex建立一个key

# curl -X POST http://localhost:2379/v2/keys/mydir -d value=33333
{"action":"create","node":{"key":"/mydir/21442","value":"33333","modifiedIndex":21442,"createdIndex":21442}}

# etcdctl --debug -o json ls /mydir
Curl-Example: curl -X GET http://localhost:2379/v2/keys/mydir?consistent=true&recursive=false&sorted=false
/mydir/key1
/mydir/key2
/mydir/21442

 

 

用rmdir 删除目录要保证目录下没有keys,否则会失败

# etcdctl --debug -o json rmdir mydir
Curl-Example: curl -X DELETE http://localhost:2379/v2/keys/mydir?dir=true&recursive=false
Error:  108: Directory not empty (/mydir) [21682]

 



若要将目录和keys都删除能够用rm指令

# etcdctl --debug -o json rm mydir --recursive=true
Curl-Example: curl -X DELETE http://localhost:2379/v2/keys/mydir?dir=false&recursive=true

# etcdctl --debug -o json ls /mydir
Curl-Example: curl -X GET http://localhost:2379/v2/keys/mydir?consistent=true&recursive=false&sorted=false
Error:  100: Key not found (/mydir) [21883]

 

 

状态查看

etcd分别提供了查看leader、本身以及store状态的接口

  • 查看leader的状态
curl http://127.0.0.1:2379/v2/stats/leader
{"leader":"27e6981eec74137d","followers":{"3955a9b061e52de1":{"latency":{"current":0.158241,"average":0.22540039942528703,"standardDeviation":0.17653730983599686,"minimum":0.087808,"maximum":1.988291},"counts":{"fail":0,"success":348}}}}

 

 
  • 查看本身的状态
curl http://127.0.0.1:2379/v2/stats/self
# curl http://127.0.0.1:2379/v2/stats/self
{"name":"infra0","id":"27e6981eec74137d","state":"StateLeader","startTime":"2015-08-14T12:52:39.624477849+08:00","leaderInfo":{"leader":"27e6981eec74137d","uptime":"2m37.095030303s","startTime":"2015-08-14T12:55:31.332765166+08:00"},"recvAppendRequestCnt":429,"sendAppendRequestCnt":1064,"sendPkgRate":6.896118337343223,"sendBandwidthRate":1170.6850489473857}

 

 
  • 查看store的状态
curl http://127.0.0.1:2379/v2/stats/store 
{"getsSuccess":13,"getsFail":2152,"setsSuccess":120,"setsFail":2,"deleteSuccess":6,"deleteFail":0,"updateSuccess":0,"updateFail":0,"createSuccess":961,"createFail":186,"compareAndSwapSuccess":19631,"compareAndSwapFail":296,"compareAndDeleteSuccess":0,"compareAndDeleteFail":0,"expireCount":849,"watchers":0}

 

 

其余接口以及更详尽的接口说明能够看官网说明

相关文章
相关标签/搜索