zoukankan      html  css  js  c++  java
  • etcd的简单使用

    etcd的简单使用

    ETCD安装配置

    安装

    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里面字段详解:

    • 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}
     

    其他接口以及更详尽的接口说明可以看官网说明

  • 相关阅读:
    安卓热修复
    Activity四种启动模式
    11、网页制作Dreamweaver(补充:JS零碎知识点&&正则表达式)
    6、C#基础整理(for 语句经典习题--for循环嵌套、穷举)
    5、C#基础整理(for 语句经典习题--与 if 的嵌套)
    4、C#基础整理(if语句经典习题)
    3、C#基础整理(语句概述)
    2、C#基础整理(运算符、数据类型与转换、var关键字)
    1、C#基础整理(进制转换的方法)
    10、网页制作Dreamweaver(扩展:各浏览器对 onunload 事件的支持与触发条件实现有差异)
  • 原文地址:https://www.cnblogs.com/opama/p/5836674.html
Copyright © 2011-2022 走看看