etcd的使用

2023-11-05

启动etcd服务

启动etcd时最主要的是需要准备两个没有使用过的端口,这两个端口一个用于etcd之间同步信息,一个用于etcd向客户端提供服务的端口。

因此启动单个etcd节点,只需按照如下命令行输入即可

server -name myetcd1 -listen-client-urls http://0.0.0.0:12379 \
-advertise-client-urls http://0.0.0.0:12379  \
-listen-peer-urls http://0.0.0.0:12380  \
-initial-advertise-peer-urls http://0.0.0.0:12380 \  
-initial-cluster myetcd1=http://0.0.0.0:12380 

其中listen-client-urls的端口是客户端连接的端口,listen-peer-urls指定的端口是etcd之间同步数据使用的,并且在注册集群的时候,集群指定的端口也是etcd之间同步数据使用的端口

-initial-cluster myetcd1=http://0.0.0.0:12380

如何启动一个etcd集群

对etcd的操作

官方提供了etcdctl来连接etcd,使用etcdctl连接etcd很简单,只需要提供指定的endpoints,然后输入要操作的命令即可

etcdctl --endpoints=$ENDPOINTS get foo
etcdctl --endpoints=$ENDPOINTS --write-out="json" get foo

对etcd数据的增删改查

etcdctl --endpoints=$ENDPOINTS put web1 value1
etcdctl --endpoints=$ENDPOINTS put web2 value2
etcdctl --endpoints=$ENDPOINTS put web3 value3

etcdctl --endpoints=$ENDPOINTS get web --prefix
etcdctl --endpoints=$ENDPOINTS put key myvalue
etcdctl --endpoints=$ENDPOINTS del key

etcdctl --endpoints=$ENDPOINTS put k1 value1
etcdctl --endpoints=$ENDPOINTS put k2 value2
etcdctl --endpoints=$ENDPOINTS del k --prefix

事务型操作

etcdctl --endpoints=$ENDPOINTS put user1 bad
etcdctl --endpoints=$ENDPOINTS txn --interactive

compares:
value("user1") = "bad"

success requests (get, put, delete):
del user1

failure requests (get, put, delete):
put user1 good

对数据进行监听

// 在一个控制端上监听指定数据
etcdctl --endpoints=$ENDPOINTS watch stock1
// 在另外一个控制端上操作数据
etcdctl --endpoints=$ENDPOINTS put stock1 1000
// 在一个控制端上监听所有stock 开头的数据
etcdctl --endpoints=$ENDPOINTS watch stock --prefix
// 在另外一个控制端上操作数据
etcdctl --endpoints=$ENDPOINTS put stock1 10
etcdctl --endpoints=$ENDPOINTS put stock2 20

创建lease并将创建的数据绑定租约上

etcdctl --endpoints=$ENDPOINTS lease grant 300# lease 2be7547fbc6a5afa granted with TTL(300s)

etcdctl --endpoints=$ENDPOINTS put sample value --lease=2be7547fbc6a5afa
etcdctl --endpoints=$ENDPOINTS get sample

etcdctl --endpoints=$ENDPOINTS lease keep-alive 2be7547fbc6a5afa
etcdctl --endpoints=$ENDPOINTS lease revoke 2be7547fbc6a5afa
# or after 300 seconds
etcdctl --endpoints=$ENDPOINTS get sample

etcd提供的分布式锁

// 在一个控制端上创建lock一个Key值
etcdctl --endpoints=$ENDPOINTS lock mutex1

// 另外一个控制端如果想拿到锁,会卡住直到第一个拿到锁的释放锁为止
# another client with the same name blocks
etcdctl --endpoints=$ENDPOINTS lock mutex1

https://etcd.io/docs/v3.5/tutorials/how-to-create-locks/

查看集群状态

etcdctl --write-out=table --endpoints=$ENDPOINTS endpoint status

+------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|    ENDPOINT      |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| 10.240.0.17:2379 | 4917a7ab173fabe7 |  3.5.0  |   45 kB |      true |      false |         4 |      16726 |              16726 |        || 10.240.0.18:2379 | 59796ba9cd1bcd72 |  3.5.0  |   45 kB |     false |      false |         4 |      16726 |              16726 |        || 10.240.0.19:2379 | 94df724b66343e6c |  3.5.0  |   45 kB |     false |      false |         4 |      16726 |              16726 |        |
+------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------|
etcdctl --endpoints=$ENDPOINTS endpoint health

10.240.0.17:2379 is healthy: successfully committed proposal: took = 3.345431ms
10.240.0.19:2379 is healthy: successfully committed proposal: took = 3.767967ms
10.240.0.18:2379 is healthy: successfully committed proposal: took = 4.025451ms

保存etcd快照

etcdctl --write-out=table --endpoints=$ENDPOINTS snapshot status my.db

+---------+----------+------------+------------+
|  HASH   | REVISION | TOTAL KEYS | TOTAL SIZE |
+---------+----------+------------+------------+
| c55e8b8 |        9 |         13 | 25 kB      |
+---------+----------+------------+------------+

etcdv2升级到etcdv3

# write key in etcd version 2 storeexport ETCDCTL_API=2
etcdctl --endpoints=http://$ENDPOINT set foo bar

# read key in etcd v2
etcdctl --endpoints=$ENDPOINTS --output="json" get foo

# stop etcd node to migrate, one by one# migrate v2 dataexport ETCDCTL_API=3
etcdctl --endpoints=$ENDPOINT migrate --data-dir="default.etcd" --wal-dir="default.etcd/member/wal"# restart etcd node after migrate, one by one# confirm that the key got migrated
etcdctl --endpoints=$ENDPOINTS get /foo

Etcd特性

客户端必须向leader发送请求吗?

raft算法是以Leader为准-强领导权,领导处理所有客户端的请求,但是客户端不需要知道谁是领导,任何的需要一致性的请求就算发发送给follower也会被转发给leader,非一致性请求任何集群成员都能进行处理

listen-<client,peer>-urls, advertise-client-urls or initial-advertise-peer-urls的区别

listen-client-urls and listen-peer-urls是用来etcd服务端绑定用的,是集群之间连接使用的

advertise-client-urls and initial-advertise-peer-urls是etcd客户端连接服务端用的端口,advertise的地址必须是远程机器可访问的,

etcd的个数

原则上来说etcd是没有个数硬性限制的,然而一个etcd集群个数最好不要超过7个节点,根据google的经验来说节点个数最好保持为5个

当出现request ignored (cluster ID mismatch)” 意味着什么?

每个集群都会根据集群初始化配置和用户提供的initial-cluster-token值来生成一个唯一的cluster ID,根据cluster ID etcd能够防止不同集群之间的交叉访问。

当拆除一些旧集群,然后新集群重新使用同样的地址时会出现这些警告。如果旧集群中任何的etcd成员尝试连接新集群,新集群会忽略请求并发出警告,通常通过确保不同集群之间地址不相交可以避免这些警告。

如何解决mvcc: database space exceeded问题

默认情况下,etcd会保存kv值的所有历史信息而不是周期的进行压缩(可通过设置–auto-comaction来实现自动压缩),当存储空间耗尽时etcd会发出空间配额预警警告以防止进一步的写入集群中信息,只要警告持续,etcd就会对请求返回mvcc: database space exceeded

自动压缩空间

# keep one hour of history
$ etcd --auto-compaction-retention=1

碎片整理

在压缩之后数据库会出现碎片,这些碎片会占用一定的内存空间,这些内存空间etcd数据库可以使用,但是在主机上表现还是占用着内存空间,要想这些内存空间再次归还系统,需要对内存碎片空间进行整理并进行内存释放。

碎片整理可以将这些存储空间归还给文件系统,碎片整理是针对单个集群成员发出的,可以避免集群范围内的延迟峰值。

$ etcdctl defrag
Finished defragmenting etcd member[127.0.0.1:2379]

需要注意的是对一个活动节点进行碎片整理会阻塞读写(一个节点在碎片整理重构状态时)

需要注意的是碎片整理的请求并不会在集群上进行复制,因此请求只是应用到了本地的节点,如果需要对整个集群的成员进行碎片整理需要在–endpoints上或–cluster上指定所有成员来对整个集群中成员进行碎片整理

$ etcdctl defrag --cluster
Finished defragmenting etcd member[http://127.0.0.1:2379]
Finished defragmenting etcd member[http://127.0.0.1:22379]
Finished defragmenting etcd member[http://127.0.0.1:32379]

当etcd集群没有运行时可以通过指定文件夹来对指定文件夹进行碎片整理

etcdctl defrag --data-dir <path-to-etcd-data-dir>

etcd配额

默认情况下etcd的配额是2G,但是有些使用特殊的情况下,比如在虚拟机或者其他嵌入式小型设备中本身的磁盘都没有那么大,那么这个时候就需要对etcd的默认配额进行修改来满足特定的场景了

# set a very small 16MB quota
$ etcd --quota-backend-bytes=$((16*1024*1024))

可以用脚本来测试etcd配额不足的情况

# fill keyspace
$ while [ 1 ]; do dd if=/dev/urandom bs=1024 count=1024  | ETCDCTL_API=3 etcdctl put key  || break; done
...
Error:  rpc error: code = 8 desc = etcdserver: mvcc: database space exceeded
# confirm quota space is exceeded
$ ETCDCTL_API=3 etcdctl --write-out=table endpoint status
+----------------+------------------+-----------+---------+-----------+-----------+------------+
|    ENDPOINT    |        ID        |  VERSION  | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX |
+----------------+------------------+-----------+---------+-----------+-----------+------------+
| 127.0.0.1:2379 | bf9071f4639c75cc | 2.3.0+git | 18 MB   | true      |         2 |       3332 |
+----------------+------------------+-----------+---------+-----------+-----------+------------+
# confirm alarm is raised
$ ETCDCTL_API=3 etcdctl alarm list
memberID:13803658152347727308 alarm:NOSPACE

当出现配额不足时通过压缩和碎片整理来恢复当前etcd

# get current revision
$ rev=$(ETCDCTL_API=3 etcdctl --endpoints=:2379 endpoint status --write-out="json" | egrep -o '"revision":[0-9]*' | egrep -o '[0-9].*')# compact away all old revisions
$ ETCDCTL_API=3 etcdctl compact $rev
compacted revision 1516# defragment away excessive space
$ ETCDCTL_API=3 etcdctl defrag
Finished defragmenting etcd member[127.0.0.1:2379]# disarm alarm
$ ETCDCTL_API=3 etcdctl alarm disarm
memberID:13803658152347727308 alarm:NOSPACE
# test puts are allowed again
$ ETCDCTL_API=3 etcdctl put newkey 123
OK

etcd的使用场景

服务注册与发现

服务注册发现时分布式系统常见的问题之一,即在同一个分布式系统中找到我们需要的目标服务,建立连接,然后完成整个链路的调度。

用通俗的话来说服务发现就是要知道当前集群中的进程监听的udp或tcp端口,并且通过名字就可以进行查找和连接。etcd主要实现以下三种机制来完成服务发现:

  1. 强一致性、高可用的服务存储目录。基于Raft算法的etcd天生就是这样一个强一致性高可用的服务存储目录

  2. 提供注册服务和监控服务健康状态的机制,通过注册key-value值,并且定时保持服务的心跳以达到监控健康状态的效果

  3. 查找和连接服务的机制,通过在etcd指定的主题下注册服务,也能在对应的主题下查找到

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LBLqDyWx-1679296449075)(https://ny5odfilnr.feishu.cn/space/api/box/stream/download/asynccode/?code=OTdiMTI3YTcwOTZhMjYwMDVkYTA3ZWJlM2M1N2RmMTVfSDRyVFNUVXRra21LSHZQNmtJRnZrcVJXUzJ4WmxzNFdfVG9rZW46Ym94Y25nOXd4QzJjZlVDZk9kUE45S0Q4REJmXzE2NzkyOTU5NzU6MTY3OTI5OTU3NV9WNA)]

一个用户的API请求可能会调用多个微服务的资源,这些服务我们可以使用etcd进行注册和服务发现
在这里插入图片描述

消息发布和订阅

在 分布式系统中,最适用的一种组件间通信方式就是消息发布与订阅,即构建一个配置共享中心,数据提供者在这个配置中心发布消息,而消息使用者则订阅他们关心的主题,一旦主题有消息发布,就会实时通知订阅者,通过这种方式可以做到分布式系统配置的集中管理与动态更新。

  • 应用中用到的一些配置信息放到etcd上进行集中管理。启动时获取一次配置信息,同时注册一个watcher并等待,后期有配置更新的时候,etcd都会实时通知订阅者,以此达到获取最新配置信息的目的

  • 分布式搜索服务,索引元信息和服务器机器的节点状态存放到etcd中

  • 分布式日志收集系统

  • 系统中的信息需要动态自动获取与人工干预修改信息请求内容的情况

在这里插入图片描述

负载均衡

负载均衡通常来说有两种:

  • 软负载,通过软件手段实现负载均衡,也被称为4层或7层负载

  • 硬负载,就是靠硬件实现负载均衡,数据包发送转发功能

etcd上实现是软件上实现的负载均衡,在分布式场景下

ETCD

关注公众号:码上有话了解更多

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

etcd的使用 的相关文章

  • 期权、期货及其他衍生产品 第一章读书笔记

    期权 期货及其他衍生产品 第一章读书笔记 介绍 什么是衍生产品 衍生产品的特点 有哪些交易所场所 交易所市场 一些著名的交易所市场 场外市场 我国的场外市场 远期合约 远期合约可以用来对冲外汇风险 远期合约的收益 远期价格和即期价格 期货合

随机推荐

  • lua学习笔记—table

    1 什么是table table是lua的一种数据结构 可以用来创建数组或映射 lua中的table使用的是关联型数组 关联数组的key值可以是除过nil之外任意类型的值 table的大小是不固定的 可以自己进行扩容 2 如何构造table
  • iOS autorelease 示例研究

    iOS autorelease是Objective C中的一个自动内存管理机制 它通过在对象创建时将其添加到自动释放池中 在池被释放时自动释放对象 从而减少手动内存管理的工作量 本文将介绍如何使用autorelease机制来管理内存 aut
  • 跨部门的高效沟通与协作

    在企业管理当中 沟通是一个非常重要的技能 它运用我们管理当中每一个细节 首先要做好沟通和协作 我们需要有一个很好的思维模式 这个就像盖房子一样 它是地基 是一个房子的地基部分 没有一个正确的思维模式 那我们其后的技巧都不会有一个很好的效果
  • 大数据框架总结

    hdfs 1 写数据流程 2 HDFS读数据流程1 3 HDFS副本节点选择 4 HDFS nn 2nn 镜像文件以及编辑日志的工作机制 注意此类机制都是先更新编辑日志 再更新内存文件block元数据 checkpoint触发默认条件是一小
  • 谈谈虚幻引擎4的Global Illumination

    本届GDC 2013 Epic再次展示了UE4的最新demo 效果惊艳毋庸置疑 不过今天我们只谈UE4的光照利器 SVOGI SVOGI全称Sparse Voxel Octree Global Illumination 由Epic的Andr
  • DES的加密与解密(C语言实现)——大三密码学实验

    目录 DES的描述 Feistel体制 密钥扩展函数 F函数 总流程 代码 get函数的构建 yihuo函数的构建 fuck函数的构建 left move函数的构建 exchange函数的构建 erzhuanshi函数的构建 shizhua
  • 利用Vulnhub复现漏洞 - GoAhead 远程命令执行漏洞(CVE-2017-17562)

    GoAhead 远程命令执行漏洞 CVE 2017 17562 Vulnhub官方复现教程 漏洞原理 复现漏洞 启动环境 漏洞复现 动态链接库源码 编译so文件 发送payload Vulnhub官方复现教程 https vulhub or
  • EasyExcel导出模板实现下拉选(解决下拉超过50个限制)

    学习地址 https d9bp4nr5ye feishu cn wiki O3obweIbgi2Rk1ksXJncpClTnAf B站视频 https www bilibili com video BV1H34y1T7Lm 先来看看最终实现
  • MySQL基本操作语句

    目录 基本的操作数据库的语句 操作库的基本SQL语句 针对表的基本SQL语句 针对记录的基本SQL语句 扩展知识 select 标准用法 基本的操作数据库的语句 show databases gt gt gt gt 查看所有的数据库 sho
  • vue3 nvm配置多个版本node

    在实际开发中 我们可能会负责多个项目 有的项目是vue2版本开发的 有的是vue3版本开发的 如果我们电脑全局的node版本是低版本的 那么高版本的vue3项目在安装依赖时就会报错 反之亦然 我们可以使用nvm来安装多个版本的node 并使
  • Vue table不分页 动态加载数据(类似手机端滑动到底端后再去获取数据)

    最近接到一个需求 pc端中的table 数据不做分页 而是做成滚动条形式 但是table中的数据还是一次显示50条 等这50条滑动到底部后 再去加载50条 有加载效果 以此类推 直到数据全部展示 值得注意的是 我的需求是 第一次请求数据就将
  • 在线UTF-8/GBK互相转换工具

    在线UTF 8 GBK互相转换工具 https encode guiboweb com
  • shell执行Oracle SQL并捕获异常案例分析

    一 shell脚本 实现功能读取指定配置文件中的Oracle数据库连接 清空传入变量表的数据 以及清除数据之后的结果进行捕获分析 bin bash Created Date 2022 12 16 Author Last Modified 2
  • db2错误代码

    DB2错误代码 SQL返回码信息对照 用COBOL链接DB2时 出现DB2错误信息时 如果你不懂代码是什么意思 可以用这份资料查找 当然你也可以直接在db2的命令行下输入 db2 SQL30081N 系统会给出一些提示信息 sqlcode
  • LiDAR SLAM的比较

    在自动驾驶领域 定位是很重要的一环 为了建立更有鲁棒性 精确的定位 在实际自动驾驶车上往往都会使用激光雷达 激光雷达相比于摄像头 对光照变化不敏感 适合白天和黑夜 绝大多数路况 激光雷达获得的距离信息精度很高 获取的feature很稳定 当
  • Spring 异常处理的三种方式 整理

    异常处理方式一 ExceptionHandler 异常处理方式二 实现HandlerExceptionResolver接口 异常处理方式三 ControllerAdvice ExceptionHandler 三种方式比较说明 强烈推荐各位看
  • 小程序接入微信客服

    wx openCustomerServiceChat Object object 微信开放文档 微信小程序打开微信客服 接口文档 企业微信开发者中心 1 网页搜索 微信客服 扫码登录 根据提示 填写信息 微信客服 2 在 微信客服 中进入企
  • 项目打包报不能在脱机状态下访问**资源

    项目场景 springboot项目 使用maven进行打包操作 问题描述 Failed to execute goal org springframework boot spring boot maven plugin 2 5 0 repa
  • UE4_UStruct 遍历

    一个结构体中存在一个Val变量 Val变量的类型是FVector4 想从c 层面去遍历获得Val的值 上图是很早之前的一个Property继承关系图 当然 在4 25UProperty被FProperty夺笋 好处呢 见下 没有继承UObj
  • etcd的使用

    启动etcd服务 启动etcd时最主要的是需要准备两个没有使用过的端口 这两个端口一个用于etcd之间同步信息 一个用于etcd向客户端提供服务的端口 因此启动单个etcd节点 只需按照如下命令行输入即可 server name myetc