初识分布式键值对存储etcd

欢迎大家到我的博客浏览。胤凯 (oyto.github.io)


大家好,今天我带大家来学习一下 etcd。

一、什么是 etcd

etcd 是一个开源的分布式键值存储系统,主要用于构建分布式系统中那点服务发现、配置管理、分布式锁等场景。它采用 Raft 一致性算法来确保所有节点上的数据一致性。

下面我们来讲讲 etcd 的基本架构组成要点,以及一些对应的概念:

节点

etcd 集群由多个节点组成。每个节点都运行着 etcd 的服务,并负责存储数据、处理客户端请求以及与其他节点通信。

etcd 架构的节点有三种角色,分别是:Leader、Follower、候选人。

Leader 具有唯一性,Leader 挂掉之后,会从 Follower 选择一个成为候选人,参与新一次的领导人的选举。

在 etcd 节点基础服务中,关键组件包括:

  • boltdb:作为底层存储引擎,boltdb 提供了支持事务的键值存储,用于存储节点的状态和数据。这确保了数据在节点重启后依然可用。

  • Wal(Write-Ahead-Log):Wal 是 etcd 中的预写式日志,记录所有的写入操作。在实际的键值存储操作之前,etcd 将操作写入 Wal,然后再将数据谢日 boltdb。这一机制保证了数据的一致性和持久性。

  • gRPC Server:etcd 节点之间和客户端节点之间的通信采用 gRPC 协议。

Raft 一致性算法

etcd 使用 Raft 算法来保证分布式中节点之间的一致性。Raft 算法将集群中的节点分为 Leader、Follower 和 Candidate 三种角色,通过选举机制选出 Leader,并由 Leader 负载处理客户端请求和更新集群中的数据。Leader 将更新操作复制到其他节点,确保所有节点数据一致性。

数据存储

etcd 使用键值对(Key-Value)的方式存储数据。每个节点都保存着整个集群的数据副本。数据可以通过 HTTP 或 gRPC 接口进行读写操作。etcd 的数据存储是强一致性的,即当数据提交后,所有节点上的数据都会保持一致性。

选主过程

当一个 etcd 集群启动时,所有节点都是 Follower 角色。通过 Raft 选主过程,集群中的节点将选举出一个 Leader。Leader 负责处理客户端的读写请求,并将更新操作同步给其他节点。Follower 负责接收 Leader 的同步请求并保持数据一致。

分布式通信

etcd 集群中的节点通过相互通信来维护一致性。节点之间通过心跳机制保持连接。Leader 定期发送心跳消息给 Follower,以确保节点之间通信正常。同时,Leader 将客户端的写请求同步给其他节点,确保数据的一致性。

快照

为了减少数据传输的开销,etcd 使用快照机制。当节点的数据过大时,etcd 将节点的状态进行快照,只保留最新的快照和后续的变更日志,以便在需要时进行恢复,之前的预写式日志就可以删除了,以此来节省磁盘空间,保持系统的性能。

总体而言,etcd 的基本结构就是通过这样一些机制来实现了分布式系统中的数据一致性,并通过多节点的协同工作来提供可靠、稳定、高性能的分布式键值存储服务。

二、分布式部署 etcd

下面我们将使用虚拟机来部署一个 etcd 集群,为了避免对我们的虚拟机造成影响,我们这里使用 docker 的方式来进行部署。

官方示例

打开链接 Releases · etcd-io/etcd (github.com) ,我们可以看到有教我们如何使用 docker 进行部署,下面我们来看看这些命令:

rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
  docker rmi gcr.io/etcd-development/etcd:v3.5.10 || true && \
  docker run \
  -p 2379:2379 \
  -p 2380:2380 \
  --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
  --name etcd-gcr-v3.5.10 \
  gcr.io/etcd-development/etcd:v3.5.10 \
  /usr/local/bin/etcd \
  --name s1 \
  --data-dir /etcd-data \
  --listen-client-urls http://0.0.0.0:2379 \
  --advertise-client-urls http://0.0.0.0:2379 \
  --listen-peer-urls http://0.0.0.0:2380 \
  --initial-advertise-peer-urls http://0.0.0.0:2380 \
  --initial-cluster s1=http://0.0.0.0:2380 \
  --initial-cluster-token tkn \
  --initial-cluster-state new \
  --log-level info \
  --logger zap \
  --log-outputs stderr
​
docker exec etcd-gcr-v3.5.10 /usr/local/bin/etcd --version
docker exec etcd-gcr-v3.5.10 /usr/local/bin/etcdctl version
docker exec etcd-gcr-v3.5.10 /usr/local/bin/etcdutl version
docker exec etcd-gcr-v3.5.10 /usr/local/bin/etcdctl endpoint health
docker exec etcd-gcr-v3.5.10 /usr/local/bin/etcdctl put foo bar
docker exec etcd-gcr-v3.5.10 /usr/local/bin/etcdctl get foo
  • rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp:删除并创建 /tmp/etcd-data.tmp 目录,这是为了防止我们的目录下已经存在该目录,用于存储 etcd 的数据。

  • docker rmi gcr.io/etcd-development/etcd:v3.5.10 || true: 删除 etcd 镜像,如果不存在则不报错。

  • docker run ...:启动 etcd 容器,参数如下:

    • -p 2379:2379:映射容器的 2379 端口到主机的 2379 端口。

    • -p 2380:2380: 映射容器的 2380 端口到主机的 2380 端口。

    • --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data: 将主机的 /tmp/etcd-data.tmp 目录绑定到容器的 /etcd-data 目录,用于持久化 etcd 的数据。

    • --name etcd-gcr-v3.5.10: 指定容器的名称为 etcd-gcr-v3.5.10

    • gcr.io/etcd-development/etcd:v3.5.10: 使用 etcd 官方提供的 Docker 镜像。

    • /usr/local/bin/etcd ...: 启动 etcd 的命令及相关参数。这里后面会做讲解。

  • docker exec etcd-gcr-v3.5.10 /usr/local/bin/etcd --version: 在容器内执行 etcd --version 命令,输出 etcd 的版本信息。

  • docker exec etcd-gcr-v3.5.10 /usr/local/bin/etcdctl version: 在容器内执行 etcdctl version 命令,输出 etcdctl 的版本信息。

  • docker exec etcd-gcr-v3.5.10 /usr/local/bin/etcdutl version: 这一行命令有误,应为 docker exec etcd-gcr-v3.5.10 /usr/local/bin/etcdutl version。这个命令在容器内执行 etcdutl version,输出 etcdutl 的版本信息。

  • docker exec etcd-gcr-v3.5.10 /usr/local/bin/etcdctl endpoint health: 在容器内执行 etcdctl endpoint health,检查 etcd 集群的健康状态。

  • docker exec etcd-gcr-v3.5.10 /usr/local/bin/etcdctl put foo bar: 在容器内执行 etcdctl put foo bar,将键值对 foo: bar 存储到 etcd 集群中。

  • docker exec etcd-gcr-v3.5.10 /usr/local/bin/etcdctl get foo: 在容器内执行 etcdctl get foo,获取键 foo 对应的值。

上面只是官方给我们的使用示例,我们做一个参考就行,我们可以按照自己的方式进行部署。

开始部署
创建容器

由于我们采用 docker 的方式进行部署,故第一步肯定是下载镜像。

我们这里通过 coreos/etcd · Quay 找到我们想要的 docker 镜像,我这里下载 v3.5.5 ,选择 Docker Pull(by tag),获取到对应的下载链接。

然后来到我们的虚拟机,执行 docker pull quay.io/coreos/etcd:v3.5.5 拉取镜像,当前前提是需要在虚拟机上安装并启动 docker 服务,安装这里就不再讲解了,大家可以去查看对应的资料进行安装和启动。

拉取完成后,我们可以通过 docker images 命令检查一下是否成功拉取到镜像:

根据我们拉取到的镜像,启动容器 docker run -dit quay.io/coreos/etcd:v3.5.5 sh,通过 docker ps -a 查看容器 ID,根据进入 etcd 容器的交互模式 docker exec -it eeb9a5e45d9e sh

验证并认识参数

我们可以使用 etcd -h 命令检查是否能够访问 etcd 服务

出现上面这个界面,就说明我们的 etcd 容器已经成功创建了,刚好借着 etcd -h 这个命令我们来看一些启动 etcd 集群需要了解的参数:

  • --name:指定 etcd 服务器的名称,以此来区分集群中不同的 etcd 节点

  • --data-dir:指定 etcd 保存数据的目录,用于存储 etcd 数据库文件,包括 kv 数据和元数据

  • --wal-dir:指定 etcd 预写式日志的目录,它记录了 etcd 数据库所有的变更,以确保数据的一致性和持久性

  • snapshot-count:设置 etcd 触发快照的触发次数,当写入预写式日志的次数达到该值,就会生成一次快照。

  • listen-peer-urls:指定 etcd 服务器监听的对等节点通信地址, 用于集群中节点之间的通信,传递心跳、日志复制等信息。端口通常为 2380,即暴露给其他节点的通信地址。

  • --listen-client-urls:指定 etcd 服务器监听的客户端通信地址。 用于客户端与 etcd 服务器进行通信,包括查询和修改 key-value 数据等操作。通常端口为 2379,即对外提供的 etcd 服务节点。

  • --initial-advertise-peer-urls: 指定 etcd 服务器用于集群中通信的地址。用于告知其他节点该节点的通信地址,集群中其他节点将通过这个地址与该节点进行通信。

  • --initial-cluster: 指定初始集群的成员信息。用于告知 etcd 服务器集群中的其他节点。格式为<name>=<url>

  • --initial-cluster-state:指定 etcd 服务器在集群启动时的状态。 'new' 表示新的集群,'existing' 表示已经存在的集群。

  • --initial-cluster-token:指定新创建的集群的 token。用于标识一个集群,确保不同的集群拥有不同的 token。

  • advertise-client-urls:指定 etcd 服务器广播给客户端的地址。用于告知客户端与 etcd 服务器进行通信的地址。

配置集群信息

认识并了解了启动集群所必备的参数和信息,我们开始配置集群信息。

我们的集群,以同一台虚拟机使用 docker 启动 3 个不同的 etcd 服务,来模拟集群中的三个节点,并且为了展示集群的功能,所以我们再准备第四个配置文件。所以我们需要去写 4 个 etcd 节点配置文件。

我们可以在虚拟机 root 目录下创建 etcd 文件夹,并在 etcd 文件夹里创建 etcdconf 文件夹,使用 vim etcd0.yaml 创建配置文件,配置内容如下:

etcd0.yaml
# 节点名称
name: "etcdnode0"
# 数据存储目录
data-dir: "/etcd-data/data"
# 预写式日志存储目录
wal-dir: "/etcd-data/wal"
# 集群成员之间通讯使用URL
listen-peer-urls: "http://0.0.0.0:2380"
# 集群提供给外部客户端访问的URL,即外部客户端必须通过制定的IP加端口访问etcd
listen-client-urls: "http://0.0.0.0:2379"
​
# 集群配置
initial-advertise-peer-urls: "http://192.168.235.128:2380"
# 集群初始成员配置,是etcd静态部署的核心初始化配置,它说明了当前集群由哪些URLs组成,此处default为节点名称
initial-cluster: "etcdnode0=http://192.168.235.128:2380,etcdnode1=http://192.168.235.128:12380,etcdnode2=http://192.168.235.128:22380"
# 初始化集群状态(new 或 existing)
initial-cluster-state: "new"
# 引导期间etcd集群的初始集群令牌,防止不同集群之间产生交互
initial-cluster-token: "etcd-cluster"
# 向客户端发布的服务端节点
advertise-client-urls: "http://192.168.235.128:2379"
logger: "zap"
# 配置日志级别,仅支持 debuf、info、warn、error、panic、or fatal
log-level: "warn"
log-outputs:
  - "stderr"

参数的意义,我们已经在上面讲解过了,下面就讲所有的配置文件一并给大家:

etcd1.yaml
# 节点名称
name: "etcdnode1"
# 数据存储目录
data-dir: "/etcd-data/data"
# 预写式日志存储目录
wal-dir: "/etcd-data/wal"
# 集群成员之间通讯使用URL
listen-peer-urls: "http://0.0.0.0:12380"
# 集群提供给外部客户端访问的URL,即外部客户端必须通过制定的IP加端口访问etcd
listen-client-urls: "http://0.0.0.0:12379"
​
# 集群配置
initial-advertise-peer-urls: "http://192.168.235.128:12380"
# 集群初始成员配置,是etcd静态部署的核心初始化配置,它说明了当前集群由哪些URLs组成,此处default为节点名称
initial-cluster: "etcdnode0=http://192.168.235.128:2380,etcdnode1=http://192.168.235.128:12380,etcdnode2=http://192.168.235.128:22380"
# 初始化集群状态(new 或 existing)
initial-cluster-state: "new"
# 引导期间etcd集群的初始集群令牌,防止不同集群之间产生交互
initial-cluster-token: "etcd-cluster"
# 向客户端发布的服务端节点
advertise-client-urls: "http://192.168.235.128:12379"
logger: "zap"
# 配置日志级别,仅支持 debuf、info、warn、error、panic、or fatal
log-level: "warn"
log-outputs:
  - "stderr"
etcd2.yaml
# 节点名称
name: "etcdnode2"
# 数据存储目录
data-dir: "/etcd-data/data"
# 预写式日志存储目录
wal-dir: "/etcd-data/wal"
# 集群成员之间通讯使用URL
listen-peer-urls: "http://0.0.0.0:22380"
# 集群提供给外部客户端访问的URL,即外部客户端必须通过制定的IP加端口访问etcd
listen-client-urls: "http://0.0.0.0:22379"
​
# 集群配置
initial-advertise-peer-urls: "http://192.168.235.128:22380"
# 集群初始成员配置,是etcd静态部署的核心初始化配置,它说明了当前集群由哪些URLs组成,此处default为节点名称
initial-cluster: "etcdnode0=http://192.168.235.128:2380,etcdnode1=http://192.168.235.128:12380,etcdnode2=http://192.168.235.128:22380"
# 初始化集群状态(new 或 existing)
initial-cluster-state: "new"
# 引导期间etcd集群的初始集群令牌,防止不同集群之间产生交互
initial-cluster-token: "etcd-cluster"
# 向客户端发布的服务端节点
advertise-client-urls: "http://192.168.235.128:22379"
logger: "zap"
# 配置日志级别,仅支持 debuf、info、warn、error、panic、or fatal
log-level: "warn"
log-outputs:
  - "stderr"
etcd3.yaml
# 节点名称
name: "etcdnode3"
# 数据存储目录
data-dir: "/etcd-data/data"
# 预写式日志存储目录
wal-dir: "/etcd-data/wal"
# 集群成员之间通讯使用URL
listen-peer-urls: "http://0.0.0.0:32380"
# 集群提供给外部客户端访问的URL,即外部客户端必须通过制定的IP加端口访问etcd
listen-client-urls: "http://0.0.0.0:32379"
​
# 集群配置
initial-advertise-peer-urls: "http://192.168.235.128:32380"
# 集群初始成员配置,是etcd静态部署的核心初始化配置,它说明了当前集群由哪些URLs组成,此处default为节点名称
initial-cluster: "etcdnode0=http://192.168.235.128:2380,etcdnode1=http://192.168.235.128:12380,etcdnode2=http://192.168.235.128:22380,etcdnode3=http://192.168.235.128:32380"
# 初始化集群状态(new 或 existing)
initial-cluster-state: "existing"
# 引导期间etcd集群的初始集群令牌,防止不同集群之间产生交互
initial-cluster-token: "etcd-cluster"
# 向客户端发布的服务端节点
advertise-client-urls: "http://192.168.235.128:32379"
logger: "zap"
# 配置日志级别,仅支持 debuf、info、warn、error、panic、or fatal
log-level: "warn"
log-outputs:
  - "stderr"

由于第四个配置文件中,集群配置里有四个节点并且初始化集群状态会已存在,故我们在后面的以第四个配置文件启动 etcd 服务的时候,需要先在集群中创建该节点,告诉其他节点有新节点来了,才能在使用该配置文件启动服务时与其他节点成功建立通信。

启动 etcd 服务

写好配置文件之后,我们仿照官网示例来启动 etcd 服务了,我们这里是采用读取配置文件的方式进行启动服务的,与官方示例不同。

使用下面的命令创建并允许一个容器,这个命令主要是将 docker 设置在后台允许容器,以及一些端口映射、命名、配置文件路径的配置:

docker run -d -p 2379:2379 -p 2380:2380 -v /tmp/etcd0-data:/etcd-data -v /root/etcd/etcdconf:/etcd-conf --name etcd0 quay.io/coreos/etcd:v3.5.5 /usr/local/bin/etcd --config-file=/etcd-conf/etcd0.yaml

可以通过 docker ps 观察容器是否启动起来了,如果启动了,就说明没有说明问题;如果没有成功启动,可以使用 docker log etcd0 查看 etcd0 的日志输出,找到错误信息进行排查。

接着可以再检查一下我们的目录映射有没有问题,

ls /tmp/etcd0-data/

再看看我们的日志,

docker logs -f etcd0

会发现一直在报 warn 错,因为我们配置在其他几个节点,但是其他集群几个节点还没有启动,所以就会一直报错。

然后我们依次去把其他两个节点启动,

docker run -d -p 12379:12379 -p 12380:12380 -v /tmp/etcd1-data:/etcd-data -v /root/etcd/etcdconf:/etcd-conf --name etcd1 quay.io/coreos/etcd:v3.5.5 /usr/local/bin/etcd --config-file=/etcd-conf/etcd1.yaml

docker run -d -p 22379:22379 -p 22380:22380 -v /tmp/etcd2-data:/etcd-data -v /root/etcd/etcdconf:/etcd-conf --name etcd2 quay.io/coreos/etcd:v3.5.5 /usr/local/bin/etcd --config-file=/etcd-conf/etcd2.yaml

启动完成后,使用 docker ps 查看容器:

然后再次查看我们的日志,就发现我们的日志报错停止了,就说明我们的 etcd 集群启动成功了。

三、etcd 集群运维基本操作

由于虚拟机本地没有下载 etcd,我们只能去访问容器内的 etcd 服务了,使用下面的命令进入 etcd 容器交互模式

docker exec -it etcd0 bash

然后我们开始我们的功能讲解,以及一些参数讲解。

健康检查

健康检查功能是值系统能够自动检测节点的健康状态,以确保集群的正常运行。

集群节点心跳间隔

--heartbeat-interval:这个参数用于设置 etcd 集群中节点之间发送心跳的时间间隔。默认值为 100 毫秒。你可以通过以下方式修改为 500 毫秒:

etcd --heartbeat-interval=500
心跳间隔最长时间

--election-timeout 这个参数用于设置选举超时时间,即节点在多长时间内没有收到心跳信号后就可能发起一次选举。默认值为 1000 毫秒。你可以通过以下方式修改为 3000 毫秒:

etcd --election-timeout=3000
获取集群各节点状态信息

etcdctl endpoint status:这个命令用于获取 etcd 集群中各节点的详细状态信息,包括节点的 ID、地址、健康状况等。

常用的参数有:

  1. --cluster:打印所有节点

  2. -w table:表格格式展示

  3. --endpoints:指定访问的节点

详细解释:

  • ID:节点的唯一标识符。

  • Version:etcd 版本。

  • Endpoint:节点的监听地址。

  • Status:节点的健康状况,通常包括 healthyunhealthyunknown

  • Duration:节点的运行时间。

  • Peer URLs:节点的对等节点通信地址。

  • Client URLs:节点的客户端通信地址。

检查 etcd 集群的健康状况

etcdctl endpoint health:该命令用于检查 etcd 集群的健康状况,判断是否所有节点都处于正常运行状态。

常用参数:

  1. --cluster:打印所有节点

  2. -w table:表格格式展示

  3. --endpoints:指定访问的节点

详细解释:

  • cluster is healthy:表示集群中的所有节点都处于健康状态。

  • unhealthy:表示集群中存在不健康的节点。

告警管理:

在 etcd 中,告警管理是一种机制,用于帮助管理员和操作人员监测和响应 etcd 集群中可能发生的问题。通过设置告警规则和配置,管理员可以在集群遇到异常或潜在问题时得到通知,以便及时采取必要的措施。

常见的命令有:

  1. alarm disarm

    • 作用:解除etcd集群中的告警状态,允许集群继续正常运行。

  2. alarm list

    • 作用:列出etcd集群中的告警信息,提供了对当前集群告警状态的查看。

数据规模检查

在 etcd 中,数据规模检查通常是指对 etcd 存储的数据规模(数据量的大小)进行监测和检查的机制。这涉及到集群中存储的键值对数量、数据大小等方面的指标。

常见的命令有:

  1. etcdctl check datascale检查 etcd 集群数据规模的工具,常用参数如下:

    • --auto-compact启用自动压缩功能。etcd 存储中的历史版本可能会占用磁盘空间,自动压缩可以清理不再需要的历史版本,释放磁盘空间。

    • --auto-defrag 启用磁盘自动碎片整理功能。etcd 存储在删除键值对时可能会导致碎片,自动碎片整理有助于提高磁盘空间的利用率。

    • --load指定不同规模的集群来进行性能测试。可以用于模拟不同负载下 etcd 集群的性能表现。

    • --endpoints: 对指定节点进行数据规模检查。可以通过 --endpoints 参数指定 etcd 集群的节点地址。

  2. etcdctl check perf执行 etcd 集群的性能检查,用于评估集群的性能表现。

  3. etcdctl del /etcdctl-check-datascale/ --prefix删除以指定前缀的所有键,通常用于清理测试数据。在进行数据规模检查之前,可以使用该命令清理之前的测试数据。

快照操作

在 etcd 中,快照操作是指对 etcd 存储中的当前状态进行备份的操作。快照是一个在某个时间点捕获的 etcd 存储的状态副本,它包含了该时间点的所有键值对数据以及相应的元数据信息。

常见命令有:

  1. etcdctl snapshot save

    • 保存etcd集群的快照,用于备份和恢复。

  2. etcdutl snapshot restore

    • 恢复etcd集群的快照,用于在需要时还原数据。

  3. etcdutl snapshot status

    • 查看etcd集群快照的状态信息,包括快照文件的大小、创建时间等。

集群管理

在 etcd 中,集群管理涉及到对 etcd 集群进行配置、监控、维护和优化等一系列操作。

常见的命令有:

  1. etcdctl move-leader:手动移动etcd集群的领导者节点,用于修改集群中的领导者。

节点管理

在 etcd 中,节点管理是指对 etcd 集群中的节点进行监控、维护和操作的一系列管理任务。

常见的命令有:

  1. etcdctl member add

    • 作用:向etcd集群中添加新的节点。

  2. etcdctl member list

    • 作用:列出etcd集群中的所有节点。

  3. etcdctl member promote

    • 作用:提升etcd集群中普通节点的权限,使其具备领导者选举资格。

  4. etcdctl member remove

    • 作用:从etcd集群中移除指定节点。

  5. etcdctl member update

    • 作用:更新etcd集群中节点的信息,如名称、地址等。

四、etcd 数据操作之租约与事务

数据操作

在 etcd 中,数据操作的确主要涉及 putgetdel 这三个基本操作,分别用于存储、检索和删除键值对。

下面带大家一一熟悉:

put

etcdtcl put 是用于将键值对存储到 etcd 中的命令。

常见的参数及其功能如下:

  • --ignore-lease: 忽略租约。使用此参数可以在存储键值对时忽略租约的存在。

  • --ignore-value: 忽略值。即使键已经存在,也强制写入新值。

  • --lease="0": 设置租约的持续时间,0 表示无租约。

  • --prev-kv: 在更新操作时,检查前一个键值对的存在性,只有存在时才执行更新。

get

etcdctl get 用于从 etcd 中检索键值对。

常见的参数及其功能如下:

  • -w json: 指定输出格式为 JSON,并提供详细的键值对信息。

  • --prefix: 指定前缀,以获取匹配指定前缀的所有键值对。相当于 SQL 中的 LIKE 'key%'

  • --consistency="l or s": 设置一致性级别,l 表示与 leader 节点比较数据的一致性较高,s 表示仅在当前节点上检查键值对的存在性。

  • --count-only: 仅返回匹配条件的键值对数量而不返回具体的键值对。

  • --from-key: 获取键大于或等于指定键的所有键值对。相当于 SQL 中的 WHERE key >= 'specified_key'

del

etcdctl del 用于从 etcd 中删除键值对。

租约

在etcd中,租约(Lease)是一种用于为键值对分配时间的机制,用于管理临时性的关联性数据。租约的主要目的是为了在一段时间内提供对键值对的持久性,而在租约到期后,键值对会自动从存储中删除。

租约的主要特性:

  1. 时间控制: 每个租约都有一个预定的时间期限,称为TTL(Time-to-Live)。该TTL指定了租约的生命周期,通常以秒为单位。

  2. 续约: 租约可以续约,即在TTL期限内,持有者可以通过向etcd发送心跳继续使用租约。如果续约失败或终止,租约将在TTL到期后失效。

  3. 关联键值对: 租约通常与键值对相关联。在创建键值对时,可以将租约ID与其关联,从而确定键值对的生命周期。

  4. 自动删除: 当租约到期时,关联的键值对将自动从etcd中删除,释放资源。

租约中常用参数:

  1. lease grant:

    • 用于创建一个新的租约,并返回租约的 ID。

    • 用法:

      etcdctl lease grant <TTL>
  2. lease keep-alive:

    • 保持租约的活动状态,防止租约过期。该命令会持续发送心跳以保持租约的有效性。

    • 用法:

      etcdctl lease keep-alive <lease-id>
  3. lease list:

    • 列出当前存在的所有租约。

    • 用法:

      etcdctl lease list
  4. lease revoke:

    • 用于撤销(取消)指定的租约。

    • 用法:

      etcdctl lease revoke <lease-id>
  5. lease timetolive:

    • 获取指定租约的剩余生存时间。

    • 用法:

      etcdctl lease timetolive <lease-id>

下面带大家一起使用一下:

  1. 我们先使用 etcdctl lease grant 60 创建一个 60s 的租约,它会返回一个租约 ID,

  2. 然后我们拿着这个租约 ID 去给我们的设置租约,etcdctl put k v --lease=<lease-id>

  3. 然后使用 etcdctl lease timetolive <lease-id> 查看还有多久过期,

  4. 在未过期时,可以使用 etcdctl get k 查看到键值对,在租约过期后,就无法查看到了。

大家可以自己实践一下,而且只要租约还未过期,我们就可以为租期设置为永不过期 etcdctl lease keep-alive <lease-id>

事务

在etcd中,事务是一组对键值存储的原子操作,可以确保这些操作要么全部成功,要么全部失败。etcd的事务支持在单个事务中包含多个操作,这些操作可以是读取、写入、修改等,事务将这些操作组合在一起执行。

etcd 中的事务本质上是由 if 语句 + then语句 + else 语句 组成。if 语句检查通过,则执行 then 语句里面的内容,否则执行 else 语句里面的内容

if 语句里面可以判断的条件包括但不限于:

  1. mod_revision:检查键的修改版本号是否满足条件。

  2. create_revision:检查键的创建版本号是否满足条件。

  3. version:检查键的版本号是否满足条件。

  4. value:检查键的值是否满足条件。

  5. evalue:检查键的值是否匹配指定的正则表达式。

开启事务

下面我们带大家写一个简单的 etcd 事务。

使用 etcdctl txn -i 开启事务,具体的流程图如下:

小结

今天我们对 etcd 的介绍就只讲这么多了,后面还会带大家手把手用 Go 语言去操作 etcd 的客户端。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/169702.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Redis】渐进式遍历数据库管理

文章目录 渐进式遍历scan 数据库管理切换数据库清除数据库 获取当前数据库key的个数 渐进式遍历 Redis使⽤scan命令进⾏渐进式遍历键&#xff0c;进⽽解决直接使⽤keys获取键时能出现的阻塞问题。每次scan命令的时间复杂度是O(1)&#xff0c;但是要完整地完成所有键的遍历&…

Linux本地WBO创作白板部署与远程访问

文章目录 前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cpolar4. 配置WBO公网访问地址5. 公网远程访问WBO白板6. 固定WBO白板公网地址 前言 WBO在线协作白板是一个自由和开源的在线协作白板&#xff0c;允许多个用户同时在一个虚拟的大型白板上画图。该白板对所有线上用…

python的socket模块以及通信相关学习笔记

Socket又称"套接字"&#xff0c;应用程序通常通过"套接字"向网络发出请求或者应答网络请求&#xff0c;使主机间或者一台计算机上的进程间可以通讯(最初设计是为了是使同一台计算机中的不同进程进行信息传递通信)&#xff0c;最后拓展到可以使网络上两台计…

redis-持久化

目录 一、RDB RDB触发保存的两种方式 优劣势总结 二、AOF AOF持久化流程&#xff1a; 1、开启AOP 2、异常恢复 3、AOF的同步频率设置 4、ReWrite压缩 5、优劣势总结 Redis 4.0 混合持久化 redis是内存数据库&#xff0c;所有的数据都会默认存在内存中&#xff0c;如…

python爬虫SHA案例:某直播大数据分析平台

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关 一、找出需要加密的参数 js运行 atob(‘aHR0cDovL3d3dy5oaDEwMjQuY29tLyMvc2VhcmNoL3NlYXJjaA’) 拿到网址&#xff0c;F12打…

原理Redis-ZipList

ZipList 1) ZipList的组成2) ZipList的连锁更新问题3) 总结 1) ZipList的组成 ZipList 是一种特殊的“双端链表” &#xff0c;由一系列特殊编码的连续内存块组成。可以在任意一端进行压入/弹出操作, 并且该操作的时间复杂度为 O(1)。 ZipListEntry: ZipList 中的Entry并不像…

re 2019安洵杯复现

game 64位elf&#xff0c;ollvm混淆&#xff0c;直接用deflat就能去混淆 展示的是去除之后 arr[ 1,0,5,3,2,7,0,0,8,8,0,9,0,5,0,0,2,0,0,7,0,0,1,0,5,0,3,4,9,0,1,0,0,3,0,0,0,1,0,0,7,0,9,0,6,7,0,3,2,9,0,4,8,0,0,6,0,5,4,0,8,0,9,0,0,4,0,0,1,0,3,0,0,2,1,0,3,0,7,0,4] f…

【小呆的力学笔记】有限元专题之循环对称结构有限元原理

文章目录 1. 循环对称问题的提出2. 循环对称条件2.1 节点位移的循环对称关系2.2 节点内力的循环对称关系 3. 在平衡方程中引入循环对称条件 1. 循环对称问题的提出 许多工程结构都是其中某一扇面的n次周向重复&#xff0c;也就是是周期循环对称结构。如果弹性体的几何形状、约…

【zabbix监控四】zabbix之监控tomcat服务报警

一、监控tomcat服务是否正常运行 1、客户端部署 首先要在zabbix-agent客户端上安装tomcat服务&#xff0c;并能正常启动和关闭 1.1 客户端编写脚本 vim /opt/tomcat.sh#!/bin/bash anetstat -natp |grep 8080|awk {print $6}|grep LISTEN if [[ $a LISTEN ]];thenecho &qu…

redis非关系型数据库(缓存型数据库)——中间件

【重点】redis为什么这么快&#xff1f;&#xff08;应届&#xff09; ①redis是纯内存结构&#xff0c;避免磁盘I/O的耗时 ②redis核心模块是一个单进程&#xff0c;减少线程切换和回收线程资源时间 ③redis采用的是I/O的多路复用机制&#xff08;每一个执行线路可以同时完…

原理Redis-Dict字典

Dict 1) Dict组成2) Dict的扩容3) Dict的收缩4) Dict的rehash5) 总结 1) Dict组成 Redis是一个键值型&#xff08;Key-Value Pair&#xff09;的数据库&#xff0c;可以根据键实现快速的增删改查。而键与值的映射关系正是通过Dict来实现的。 Dict由三部分组成&#xff0c;分别…

深入了解原型与原型链

1、[[Prototype]] JS中的对象有一个特殊的 [[Prototype]] 内置属性&#xff0c;其实就是对于其他对象的引用。几乎所有的对象在创建时 [[Prototype]] 属性都会被赋予一个非空的值。 var anotherObject {a:2 }; // 创建一个关联到 anotherObject 的对象 var myObject Object…

代码随想录算法训练营第二十九天| 491 递增子序列 46 全排列

目录 491 递增子序列 46 全排列 491 递增子序列 在dfs中进行判断&#xff0c;如果path的长度大于1&#xff0c;则将其添加到res中。 本题nums中的元素的值处于-100与100之间&#xff0c;可以将元素映射0到199之间并且通过布尔数组st来记录此层中元素是否被使用过&#xff0c;…

WordPress画廊插件Envira Gallery v1.9.7河蟹版下载

Envira Gallery是一款功能强大的WordPress画廊插件。通过使用这个插件&#xff0c;你可以在WordPress的前台页面上创建出令人赏心悦目的图片画廊展示形式。 拖放生成器&#xff1a;轻松创建精美照片和视频画廊 自定义主题&#xff0c;打造独特外观 使用预设模板&#xff0c;为…

运动耳机怎么选?运动耳机哪个好?蓝牙无线运动耳机排行榜10强

​说起耳机&#xff0c;相信大家都比较熟悉&#xff0c;特别是对于喜欢运动的爱好人士来说&#xff0c;那更是随身携带着。随着运动耳机的增长&#xff0c;大家都不知道该如何选择了。对于运动耳机除了需要佩戴稳固舒适之外&#xff0c;还有就是音质表现、防水性能、通话质量等…

智能井盖传感器建设信息化时代智慧城市

近年来随着信息技术的快速发展和城市化进程的加速推进&#xff0c;智慧城市的概念逐渐成为现实。作为智慧城市生命线建设中的重要组成部分&#xff0c;智能井盖传感器的应用正在为城市的可持续发展和居民的生活质量提供新的解决方案。 智能井盖传感器能够实时监测井盖状态&…

Windows 安装 Docker

目录 前言安装 WSL2WSL2 简介系统要求安装步骤 安装 Docker Desktop下载安装验证 安装 Docker Compose结语开源项目 前言 下图展示了在 Windows 系统上安装 Docker&#xff0c;并利用Docker Compose一键搭建 youlai-mall 微服务商城所需的环境。本篇将先介绍 Windows 上如何安…

【OpenCV】仿射变换中cv2.estimateAffine2D 的原理

目录 一、介绍 二、仿射变换矩阵 (M) 1.M中六个元素的说明 2.计算旋转角度 3.M的计算过程 三、输出状态 (inliers) 四、错切参数 1.错切参数的定义 2.错切参数例子 &#xff08;1&#xff09;水平错切 &#xff08;2&#xff09;垂直错切 一、介绍 cv2.estimateAffi…

K8S(一)

一、kubernetes 概述 1、kubernetes 基本介绍 kubernetes&#xff0c;简称 K8s&#xff0c;是用 8 代替 8 个字符“ubernete”而成的缩写。是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c;Kubernetes 的目标是让部署容器化的 应用简单并且高效…

数据保密新标杆:迅软DSE企业防泄密系统为企业安全保驾护航

由于目前数据安全防护边界越来越大&#xff0c;企业面临的内部安全风险正在快速增长&#xff1b;企业内部安全防护体系和管理制度一旦有所缺失&#xff0c;就会造成严重的数据泄露安全事故。面对互联网泄密事件层出不穷&#xff0c;企业管理者们对于企业数据安全管理如何落实到…