当前位置: 首页 > news >正文

ETCD 安装及使用

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

安装golang

安装etcd:

操作如下

$ export GOPATH=$HOME/go
$ mkdir -p $GOPATH/src/go.etcd.io
$ git clone https://gitee.com/who7708/etcd 或 git clone https://github.com/etcd-io/etcd
$ cd etcd
$ ./build
$ ./bin/etcd
验证:
$ ./bin/etcdctl put mykey "this is awesome"
$ ./bin/etcdctl get mykey
mykey
this is awesome
  • 启动成功

API 文档

  1. 更新 message,没有则增加
curl http://127.0.0.1:2379/v2/keys/message -XPUT -d value="Hello etcd" | jq .

新增时:
{
  "node": {
    "createdIndex": 4,
    "modifiedIndex": 4,
    "value": "Hello world",
    "key": "/message"
  },
  "action": "set"
}

更新时:
{
  "prevNode": {
    "createdIndex": 4,
    "modifiedIndex": 4,
    "value": "Hello world",
    "key": "/message"
  },
  "node": {
    "createdIndex": 5,
    "modifiedIndex": 5,
    "value": "Hello etcd",
    "key": "/message"
  },
  "action": "set"
}
  • action 请求的动作,因为是新建一个 key 并设置它的值,所以是 set
  • node.key key 的 HTTP 路径
  • node.value key 的值
  • node.createdIndex 每次有 key 被创建的时候增加
  • node.modifiedIndex 每次有 key 被修改的时候增加
  • prevNode 更新之前该 key 的信息
  1. 查询 message
curl http://127.0.0.1:2379/v2/keys/message | jq .
{
  "node": {
    "createdIndex": 5,
    "modifiedIndex": 5,
    "value": "Hello etcd",
    "key": "/message"
  },
  "action": "get"
}
  1. 删除 message
curl http://127.0.0.1:2379/v2/keys/message -XDELETE | jq .
{
  "prevNode": {
    "createdIndex": 5,
    "modifiedIndex": 5,
    "value": "Hello etcd",
    "key": "/message"
  },
  "node": {
    "createdIndex": 5,
    "modifiedIndex": 7,
    "key": "/message"
  },
  "action": "delete"
}

其中: modifiedIndex 增加了,但是 createdIndex 没有变化,因为这是一个修改操作,不是新建操作

  1. 设置 key 存活时间(TTL, time to live)
curl http://127.0.0.1:2379/v2/keys/message-ttl -XPUT -d value="Hello etcd" -d ttl=5 | jq .
{
  "prevNode": {
    "createdIndex": 11,
    "modifiedIndex": 11,
    "value": "Hello etcd",
    "key": "/message-ttl"
  },
  "node": {
    "createdIndex": 12,
    "modifiedIndex": 12,
    "ttl": 5,
    "expiration": "2019-04-28T06:28:38.477817864Z",
    "value": "Hello etcd",
    "key": "/message-ttl"
  },
  "action": "set"
}

多出的两个字段含义:

  • expiration:代表 key 过期被删除的时间
  • ttl:表示 key 剩余存活时间 如果需要取消 key 的过期,则重新更新下此 key 并将 ttl 参数设置为空,即 ttl=
  1. 更新存活时间 refresh=true
curl http://127.0.0.1:2379/v2/keys/message-ttl -XPUT -d ttl=10 -d refresh=true | jq .
{
  "prevNode": {
    "createdIndex": 42,
    "modifiedIndex": 42,
    "ttl": 2,
    "expiration": "2019-04-28T06:37:02.466721738Z",
    "value": "Hello etcd",
    "key": "/message-ttl"
  },
  "node": {
    "createdIndex": 43,
    "modifiedIndex": 43,
    "ttl": 10,
    "expiration": "2019-04-28T06:37:11.045243954Z",
    "value": "Hello etcd",
    "key": "/message-ttl"
  },
  "action": "set"
}
  1. 监听某个 key 或某个目录下的 key 变化 wait=true [recursive=true]
curl 无法进行堵塞.可以使用 wget
wget http://127.0.0.1:2379/v2/keys/message-ttl?wait=true
# curl -XGET http://127.0.0.1:2379/v2/keys/message-ttl -d wait=true | jq .
{
  "prevNode": {
    "createdIndex": 45,
    "modifiedIndex": 45,
    "value": "hahaha",
    "key": "/message-ttl"
  },
  "node": {
    "createdIndex": 46,
    "modifiedIndex": 46,
    "value": "Hello etcdsssssssssssssssss",
    "key": "/message-ttl"
  },
  "action": "set"
}

当 key 被修改时,则会获取到修改后的信息了. 除了监听 key 的变化, 还可以提供基于 index 的监听。如果通过 waitIndex 指定了 index,那么会返回从 index 开始出现的第一个事件,这包含了两种情况:

  • 给出的 index 小于等于当前 index ,即事件已经发生,那么监听会立即返回该事件
  • 给出的 index 大于当前 index,等待 index 之后的事件发生并返回
  1. 获取 etcd 服务的版本信息
curl http http://127.0.0.1:2379/version | jq .
{
  "etcdcluster": "3.3.0",
  "etcdserver": "3.3.0+git"
}
  1. 获取所有key信息
curl http://127.0.0.1:2379/v2/keys | jq .
{
  "node": {
    "nodes": [
      {
        "createdIndex": 10,
        "modifiedIndex": 10,
        "value": "Hello etcd",
        "key": "/message"
      },
      ...
    ],
    "dir": true
  },
  "action": "get"
}
  1. 响应头
HTTP/1.1 200 OK
Access-Control-Allow-Headers: accept, content-type, authorization
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE
Access-Control-Allow-Origin: *
Content-Type: application/json
X-Etcd-Cluster-Id: cdf818194e3a8c32
X-Etcd-Index: 10
X-Raft-Index: 11
X-Raft-Term: 2
Date: Sun, 28 Apr 2019 06:20:43 GMT
Content-Length: 354
  • X-Etcd-Index 当前 etcd 集群的 index
  • X-Raft-Index raft 集群的 index
  • X-Raft-Term raft 集群的任期,每次有 leader 选举的时候,这个值就会增加
  1. 获取集群数据信息 etcd 还保存了集群的数据信息,包括节点之间的网络信息,操作的统计信息。
  • /v2/stats/leader会返回集群中 leader 的信息,以及 followers 的基本信息
  • /v2/stats/self 会返回当前节点的信息
  • /v2/state/store:会返回各种命令的统计信息

常用配置的参数和它们的解释

./etcd --name=node1 \
    --listen-client-urls "http://127.0.0.1:2379" \
    --advertise-client-urls "http://127.0.0.1:2379" \
    --listen-peer-urls "http://127.0.0.1:2380"
  • --name 方便理解的节点名称,默认为 default,在集群中应该保持唯一,可以使用 hostname
  • --data-dir 服务运行数据保存的路径,默认为 ${name}.etcd
  • --snapshot-count 指定有多少事务(transaction)被提交时,触发截取快照保存到磁盘
  • --heartbeat-interval leader 多久发送一次心跳到 followers。默认值是 100ms
  • --eletion-timeout 重新投票的超时时间,如果 follow 在该时间间隔没有收到心跳包,会触发重新投票,默认为 1000 ms
  • --listen-peer-urls 和同伴通信的地址,比如 http://ip:2380,如果有多个,使用逗号分隔。需要所有节点都能够访问,所以不要使用 localhost!
  • --listen-client-urls 对外提供服务的地址 比如 http://ip:2379,http://127.0.0.1:2379,客户端会连接到这里和 etcd 交互
  • --advertise-client-urls 对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点
  • --initial-advertise-peer-urls 该节点同伴监听地址,这个值会告诉集群中其他节点
  • --initial-cluster 集群中所有节点的信息,格式为 node1=http://ip1:2380,node2=http://ip2:2380,…。注意 这里的 node1 是节点的 --name 指定的名字;后面的 ip1:2380 是 --initial-advertise-peer-urls 指定的值
  • --initial-cluster-state 新建集群的时候,这个值为 new;假如已经存在的集群,这个值为 existing
  • --initial-cluster-token 创建集群的 token,这个值每个集群保持唯一。这样的话,如果你要重新创建集群,即使配置和之前一样,也会再次生成新的集群和节点 uuid;否则会导致多个集群之间的冲突,造成未知的错误

其他

  • 更多启动参数,请使用 ./etcd --help 查看
  • 其他 API 使用请参考官网

转载于:https://my.oschina.net/who7708/blog/3043468

相关文章:

  • Server.MapPath和Request.PhysicalApplicationPath的异同
  • 滴滴 Elasticsearch 多集群架构实践
  • php实现猴子选大王
  • 报错:exec:gcc executable file not found in %PATH%
  • 趣味集算:数独
  • Python学习(三)流程控制
  • OpenGL学习(3)——Shader(补)
  • WebService到底是什么?
  • Java基础教程(24)--集合
  • 网页Gzip
  • 阿里云服务器防火墙相关命令
  • struts_22_xwork校验器列表使用说明
  • 洛谷 P1126 机器人搬重物
  • 自定义starter
  • 【转】js onclick用法:跳转到指定URL
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • Angular 响应式表单之下拉框
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • Docker入门(二) - Dockerfile
  • gf框架之分页模块(五) - 自定义分页
  • Golang-长连接-状态推送
  • HTTP那些事
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • input的行数自动增减
  • Iterator 和 for...of 循环
  • JavaScript实现分页效果
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Octave 入门
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • spring-boot List转Page
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 关于springcloud Gateway中的限流
  • 理解在java “”i=i++;”所发生的事情
  • 如何胜任知名企业的商业数据分析师?
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 1.Ext JS 建立web开发工程
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (超详细)语音信号处理之特征提取
  • (九)c52学习之旅-定时器
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (十一)c52学习之旅-动态数码管
  • (一)u-boot-nand.bin的下载
  • . Flume面试题
  • .NET DataGridView数据绑定说明
  • .net framework4与其client profile版本的区别
  • .NET Remoting学习笔记(三)信道
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • @31省区市高考时间表来了,祝考试成功
  • @Data注解的作用
  • @软考考生,这份软考高分攻略你须知道