zoukankan      html  css  js  c++  java
  • 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需要自己处理这种情况。
  • 相关阅读:
    ROS安装
    安装octomap的问题与解决方案
    陀螺仪和加速度计MPU6050的单位换算方法
    概率基础
    Ubuntu使用多线程cmake时出现undefined reference to `pthread_create'
    C++中的static关键字的总结
    QSignalMapper的使用和使用场景
    Linux下C ,C ++, Qt开发环境
    void operator()()的功能
    C++11多线程编程--线程创建
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/13160121.html
Copyright © 2011-2022 走看看