标签:
去https://github.com/coreos/etcd/releases/下载想要的版本解压etcd包
解压后进入目录,增加x权限
chmod +x etcd chmod +x etcdctl
并将etcd和etcdctl 复制到 /bin
./bin/etcd 这样就可以启动使用
在两台机器上部署了简单的集群
192.168.231.130 192.168.231.132
在配置文件/etc/defalut/etcd 中增加:
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"
也可用参数的方法
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机器上
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"
参数解释
启动etcd进程后查看集群
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和followers
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里面字段详解:
header字段详解:
X-Etcd-Cluster-Id: 69bc358c20384a4c
X-Etcd-Index: 16333
X-Raft-Index: 87030
X-Raft-Term: 117
可以使用etcdctl简化操作
# etcdctl get mykey
this is test
可以使用etcdctl或者url去执行手动操作
etcdctl几个有用的附加命令
# 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
# 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]
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状态的接口
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}
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}
其他接口以及更详尽的接口说明可以看官网说明
标签:
原文地址:http://www.cnblogs.com/opama/p/5836674.html