etcd API-V2

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了etcd API-V2相关的知识,希望对你有一定的参考价值。

参考技术A

V2版本的key在etcd是按照目录格式来存储的:

对于createdIndex 和 modifiedIndex两个值,基本上是一直相等的,当你-XPUT的时候,会同步更新这两个值,但delete和update的时候这两个值就会不同了,只有modifiedIndex会增加。

etcd的回复里面,包含了简单的消息头,里面的数据也比较重要。

数据读取比较简单,直接读取某个key就可以。

和设置一样,更改的时候用也是PUT操作

TTL就是给key设置一个timeout,时间到了之后,key会被自动删除,当然你可以在超时之前删除timeout,这样key就不会有超期了。同样的你也可以不断的去刷新key的timeout,这样可以起到看门狗的作用(可以用来探测etcd的存活)。

需要注意的一点是,timeout只会由leader来触发,如果一个instance(不是leader)因为某种原因退出集群了,那么该instance的超时key就不会删除了,除非它重新加入集群,leader会帮它删掉(个人认为这时候不再是timeout删除,而是raft底层的数据同步,会把删除操作append到节点,节点会删除数据.如果leader退出了,那么新的leader会执行timeout操作。

上面说过,在超时之前可以用命令重新更新key的ttl。

watch功能是etcd里面一个很重要的功能,现在有v2和v3两个版本。分别对应了不同的设计,可以参照下面的链接:
https://blog.csdn.net/zl1zl2zl3/article/details/79627412

我们可以通过常轮训来监听key的变化,同时可以使用 recursive=true 参数来对子key(目录)监听。

注意:

etcd的watch智能保持100条记录(V2版本,v3没这个限制),所以收到通知之后应该将response交给其它线程去处理,不要在watch线程里处理,不然容易阻塞!!

前面已经说过etcd的v2版本只能保存1000个事件,如果已经事件丢失,我们需要先得到目前的状态,然后再开始监听。比如我们对一个key设置了2000次,那么etcd里面保存的直邮1000-2000的事件,如果这时候我们用下面命令:

那现在我们怎么开始监听这个key那,因为我们也不知道etcd里面保存的事件是从哪里开始的。所以我们可以使用下面命令得到etcd现在的状态。

前面已经解释过返回的信息的标志位的意思了。X-Etcd-Index代表的是etcd的状态,modifiedIndex代表的是上次修改这个key的index,X-Etcd-Index是大于等于modifiedIndex的,理论上来讲用两个index + 1是相同效果,但是用modifiedIndex可能会导致上面说的401error,所以我们一般都用X-Etcd-Index。

连接关闭指的是可能server还没来的及发送event,但由于超时或者server发生了关机,因为http的header是一旦接收到连接就会返回头部的,所以返回值会是200:ok和空的消息体。client需要自己处理这种情况。

在一个目录下使用POST可以创建出顺序的key,有时候这个功能很有用,比如需要严格按照顺序处理的事件。可以保证cleint可以公平的访问mutex锁(这个点没太搞懂)

创建一个顺序的key很简单:

这里的key的后缀是全局的etcd的index。

etcd的存储是以目录树的结构来的,所以我们可以对某个目录设置一个TTL。

目录的ttl超时的时候,如果有监听线程正在监听它下面的key,那么watch会收到一个expire的事件。

etcd主要通过三个标志位来对etcd的数据进行原子操作,注意etcd的原子操作只能针对key,不能针对目录,否则会返回102“Not a file” error。

1.prevValue - 检查key的上一个状态.

2.prevIndex -检查key的modifiedIndex.(保证没别的线程修改过)

3.prevExist - 如果是true,代表"update"请求,否则是create请求。

下面看几个例子:

etcd的删除操作也支持原子操作,标志位和上面的比少了prevExist。其它的是一样的。看例子:

在大多数情况下,目录都会在创建key的时候自动创建,但有时候我们需要自己去创建一个目录或者删除一个目录。用参数 dir=true 就可以了。

在etcd中,如果想获得目录下所有的key,可以用下面的命令:

如果没有recursive,那么只会显示目录,不会现在目录下面的key或者子目录。

删除etcd的目录的时候,如果目录下面有key或者别的目录存在,你删除的时候会返回下面的错误:

所以如果想 直接删除整个目录,可以用下面的命令(recursive=true)

etcd可以通过添加_前缀创建隐藏的key或者目录,这时候你通过GET指令是看不到这个node的。

etcd隐藏的node主要作用是为了安全性,特地去github上看了一下作者的解释。

https://github.com/etcd-io/etcd/issues/6375

就是说隐藏key你通过etcd的api是看不到的,除非你能登陆本地的disk,然后查看本地的存储文件。保密性高,我们可以将我们一些key放在里面。创建的指令如下:

我们可以用etcd存储一些小的配置文件。

大家都知道etcd的写操作是都要经过raft协议同步的,线性化读取也是同样的道理。如果 Get的时候使用参数 quorum=true ,那么GET操作也要走raft协议,不是本地直接返回。

我们可以查看etcd的一些内部统计信息来观察etcd的状态。主要就分为etcd的状态和存储状态。

每个标志位的含义:

etcd的存储的状态是存储在内存中的,所以重启之后是会重置各个参数。

掌握etcd的API是使用etcd的前提条件,所以把v2版本的按照个人理解和操作整理出来。后面会整理v3版本的API。

Etcd-Etcd快速入门及PromQL查询etcd指标

Prometheus-Prometheus-Opterator中添加监控etcd集群

一、Etcd快速入门

1.1、 etcd 介绍

  • 2013 年 6 月,CoreOS 发起了 etcd 项目。etcd 使用 Go 语言实现,是分布式系统中重要的基础组件,目前最新版本为 V3.4.9。etcd 可以用来构建高可用的分布式键值数据库,根据官网介绍,总结来说有如下的特点:
    • 简单:etcd 的安装简单,且为用户提供了 HTTP API,用户使用起来也很简单
    • 存储:etcd 的基本功能,数据分层存储在文件目录中,类似于我们日常使用的文件系统
    • Watch 机制:Watch 指定的键、前缀目录的更改,并对更改时间进行通知
    • 安全通信:SSL 证书验证
    • 高性能:etcd 单实例可以支持 2k/s 读操作,官方也有提供基准测试脚本
    • 一致可靠:基于 Raft 共识算法,实现分布式系统数据的高可用性、一致性
  • etcd 是一个分布式键值存储数据库,支持跨平台,拥有强大的社区。etcd 的 Raft 算法,提供了可靠的方式存储分布式集群涉及的数据。etcd 广泛应用在微服务架构和 Kubernates 集群中,不仅可以作为服务注册与发现,还可以作为键值对存储的中间件。从业务系统 Web 到 Kubernetes 集群,都可以很方便地从 etcd 中读取、写入数据。

1.2、etcd 应用场景

  • etcd 在稳定性、可靠性和可伸缩性表现极佳,同时也为云原生应用系统提供了协调机制。etcd 经常用于服务注册与发现的场景,此外还有键值对存储、消息发布与订阅、分布式锁等场景。

1.2.1、 键值对存储

  • 如下是官方对 etcd 的描述:
    ❝❝❝❝
    A highly-available key value store for shared configuration and service discovery.
    一个用于配置共享和服务发现的键值存储系统。
    ❞❞❞❞
    从其定义来看,etcd 是一个「键值存储」的组件,存储是 etcd 最基本的功能,其他应用场景都是建立在 etcd 的可靠存储上。etcd 的存储有如下特点:

采用键值对数据存储,读写性能一般高于关系型数据库;
etcd 集群分布式存储,多节点集群更加可靠;
etcd 的存储采用类似文件目录的结构:
叶子节点存储数据,其他节点不存储,这些数据相当于文件;
非叶节点一定是目录,这些节点不能存储数据。
比如 Kubernetes 将一些元数据存储在 etcd 中,将存储状态数据的的复杂工作交给 etcd,Kubernetes 自身的功能和架构能够更加专注。

二、PromQL查询etcd指标

以上是关于etcd API-V2的主要内容,如果未能解决你的问题,请参考以下文章

金庸武功之“七伤拳”--etcd集群搭建

K8s 集群 etcd节点故障解决方案

2 二进制方式搭建K8S集群

k8s集群之master节点部署

Etcd-Etcd快速入门及PromQL查询etcd指标

第17 章 : 深入理解 etcd:etcd 性能优化实践