ETCD概述--使用/特性/架构/原理

ETCD概述

请添加图片描述
ETCD是一个高度一致的分布式键值存储, 它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据(高可用, 强一致性)​全局的配置服务中心. 本文将介绍其特性、相关操作和常见的应用场景.

如果想了解更多, 请查阅我的技术博客: https://dingyuqi.com

特性

不能存储大量的具体数据, 应用来存储少量重要的数据

相关操作

$ etcdctl put foo bar
OK

​在HTTP请求体中的JSON对象, 其包含的key和value字段都被定义成了byte数组, 因此必须在JSON对象中, 使用base64编码对内容进行处理

$ etcdctl get foo
foo
bar

这是只读取键 foo 的值的命令:

$ etcdctl get foo --print-value-only
bar

键 foo 到foo3的值的命令:

$ etcdctl get foo foo3
foo
bar
foo1
bar1
foo2
bar2
### 半开区间 [foo, foo3)

范围覆盖以 foo 为前缀的所有键的命令, 结果数量限制为2:

$ etcdctl get --prefix --limit=2 foo
foo
bar
foo1
bar1$ etcdctl get key -w json

版本(revision)

每put一次相同的key都会修改该key的版本

$ etcdctl get --prefix foo # 访问键的最新版本
foo
bar_new
foo1
bar1_new$ etcdctl get --prefix --rev=4 foo # 访问修订版本为 4 时的键的版本
foo
bar_new
foo1
bar1$ etcdctl get --prefix --rev=3 foo # 访问修订版本为 3 时的键的版本
foo
bar
foo1
bar1$ etcdctl get --prefix --rev=2 foo # 访问修订版本为 2 时的键的版本
foo
bar$ etcdctl get --prefix --rev=1 foo # 访问修订版本为 1 时的键的版本

观察(watch)

watch key

观察多个键 foozoo 的命令:

$ etcdctl watch -i
$ watch foo
$ watch zoo
# 在另外一个终端: etcdctl put foo bar
PUT
foo
bar
# 在另外一个终端: etcdctl put zoo val
del
zoo
val

观察历史改动:

# 从修订版本 2 开始观察键 `foo` 的改动
$ etcdctl watch --rev=2 foo
PUT
foo
bar
PUT
foo
bar_new

租约(lease)

一个lease可对应多个key

授予租约:

# 授予租约, TTL为10秒
$ etcdctl lease grant 10
lease 32695410dcc0ca06 granted with TTL(10s)# 附加键 foo 到租约32695410dcc0ca06
$ etcdctl put --lease=32695410dcc0ca06 foo bar
OK

撤销一个租约(会删除附带lease的的所所有key):

$ etcdctl lease revoke 32695410dcc0ca06
lease 32695410dcc0ca06 revoked$ etcdctl get foo
# 空应答, 因为租约撤销导致foo被删除

续约(刷新)

$ etcdctl lease keep-alive 32695410dcc0ca06
lease 32695410dcc0ca06 keepalived with TTL(10)
lease 32695410dcc0ca06 keepalived with TTL(10)
lease 32695410dcc0ca06 keepalived with TTL(10)

事务:

$ etcdctl txn -i
compares:  # 比较
value("key") = "xxx"  # key具体值
create("key") = "xxx"  # key的版本信息
mod("key") = "xxx"  # key的修改版本
# 可写多个
例如: (事务相当于一个if-else)
$ etcdctl txn -i
compares:
value("foo") = "ccvvb"success requests (get, put, del):
get foofailure requests (get, put, del):
del fooSUCCESSfoo
ccvvb

应用场景

共享配置(kv存储)

​有一个定义良好、面向用户的API(gRPC), 有些语言的客户端不支持gRPC通信协议, 此时就可以使用gRPC-Gateway对外提供的HTTP API接口, 通过HTTP请求, 实现与gRPC调用协议同样的功能

服务注册与发现

​服务注册是指服务实例启动时将自身信息注册到服务注册与发行中心, 并在运行时通过心跳等方式向其汇报自身服务状态

​服务发现是指服务实例向服务注册与发现中心获取其他服务实例信息, 用于远程调用

​服务注册与发现中心(etcd): 1.管理当前注册到服务注册与发现中心的微服务实例元数据信息, 包括服务实例的服务名、IP地址、端口号、服务描述和服务状态等. 2.与注册到服务发现与注册中心的微服务实例维持心跳, 定期检查注册表中的服务实例是否在线, 并剔除无效服务实例信息. 3.提供服务发现能力, 为服务调用方提供服务提供方的服务实例元数据

​CAP理论

​本质上来说, 服务发现就是想要了解集群中是否有进程在监听 udp 或 tcp 端口, 并且通过名字就可以查找和连接.

​解决服务发现的问题:

  1. 一个强一致性、高可用的服务存储目录. 基于Raft算法的etcd天生就是这样一个强一致性高可用的服务存储目录.
  2. 一种注册服务和监控服务健康状态的机制. 用户可以在etcd中注册服务, 并且对注册的服务设置key TTL, 定时保持服务的心跳以达到监控健康状态的效果.
  3. 一种查找和连接服务的机制. 通过在 etcd 指定的主题下注册的服务也能在对应的主题下查找到. 为了确保连接, 我们可以在每个服务机器上都部署一个Proxy模式的etcd, 这样就可以确保能访问etcd集群的服务都能互相连接. lease保持心跳, 实时反应任务执行情况, watch监控.

消息发布、订阅

​构建一个配置共享中心, 数据提供者在这个配置中心发布消息, 而消息使用者则订阅他们关心的主题, 一旦主题有消息发布, 就会实时通知订阅者

​watch 消费者订阅

请添加图片描述

分布式锁

分布式锁应该具备条件:

  • 互斥性: 在任意时刻, 对于同一个锁, 只有一个客户端能持有, 从而保证一个共享资源同一时间只能被一个客户端操作;
  • 安全性: 即不会形成死锁, 当一个客户端在持有锁的期间崩溃而没有主动解锁的情况下, 其持有的锁也能够被正确释放, 并保证后续其它客户端能加锁;
  • 可用性: 当提供锁服务的节点发生宕机等不可恢复性故障时, “热备” 节点能够接替故障的节点继续提供服务, 并保证自身持有的数据与故障节点一致.
  • 对称性: 对于任意一个锁, 其加锁和解锁必须是同一个客户端, 即客户端 A 不能把客户端 B 加的锁给解了.

etcd提供的技术支持

  • Lease 机制

即租约机制(TTL, Time To Live), Etcd 可以为存储的 Key-Value 对设置租约, 当租约到期, Key-Value 将失效删除;同时也支持续约, 通过客户端可以在租约到期之前续约, 以避免 Key-Value 对过期失效. Lease 机制可以保证分布式锁的安全性, 为锁对应的 Key 配置租约, 即使锁的持有者因故障而不能主动释放锁, 锁也会因租约到期而自动释放.

  • Revision 机制

每个 Key 带有一个 Revision 号, 每进行一次事务便加一, 因此它是全局唯一的, 如初始值为 0, 进行一次 put(key, value), Key 的 Revision 变为 1, 同样的操作, 再进行一次, Revision 变为 2;换成 key1 进行put(key1, value)操作, Revision将变为 3;这种机制有一个作用: 通过 Revision 的大小就可以知道写操作的顺序. 在实现分布式锁时, 多个客户端同时抢锁, 根据 Revision 号大小依次获得锁, 可以避免 “羊群效应” (也称"惊群效应"), 实现公平锁.

  • Prefix 机制

即前缀机制, 也称目录机制, 例如, 一个名为 /mylock 的锁, 两个争抢它的客户端进行写操作, 实际写入的Key分别为: key1="/mylock/UUID1",key2="/mylock/UUID2", 其中, UUID表示全局唯一的ID, 确保两个Key的唯一性. 很显然, 写操作都会成功, 但返回的Revision不一样, 那么, 如何判断谁获得了锁呢?通过前缀"/mylock"查询, 返回包含两个Key-Value对应的Key-Value列表, 同时也包含它们的Revision, 通过Revision大小, 客户端可以判断自己是否获得锁, 如果抢锁失败, 则等待锁释放(对应的 Key 被删除或者租约过期), 然后再判断自己是否可以获得锁.

  • Watch 机制

即监听机制, Watch机制支持监听某个固定的Key, 也支持监听一个范围(前缀机制), 当被监听的Key或范围发生变化, 客户端将收到通知;在实现分布式锁时, 如果抢锁失败, 可通过Prefix机制返回的Key-Value列表获得Revision比自己小且相差最小的 Key(称为 Pre-Key), 对Pre-Key进行监听, 因为只有它释放锁, 自己才能获得锁, 如果监听到Pre-Key的DELETE事件, 则说明Pre-Key已经释放, 自己已经持有锁.

实现

​使用IF-Then-Else语句(事务), IF 语言判断etcd服务端是否存在指定的key, 通过该key创建的版本号create_ _revision 是否为0来检查key是否已存在, 如果该key存在, 版本号不为0

​客户端请求在获取到分布式锁后, 如果发生异常, 需要及时将锁释放掉, 因此需要租约, 长时间使用需要续约

请添加图片描述

请添加图片描述

架构及原理

请添加图片描述

​BoltDB是一个单机的支持事务的 kv存储, etcd 的事务是基于boltdb的事务实现的; boltdb 为每一个key都创建一个索引(B+树) ;该B+树存储了key所对应的版本数据(储存key的历史版本信息, 每个key对应一个索引, 索引对对应b+树);

​wal (write ahead log)预写式日志实现事务日志的标准方法;执行写操作前先写日志, 跟mysql中redo类似, wal实现的是顺序写, 而若按照B+树写, 则涉及到多次io以及随机写;

​snapshot快照数据,用于其他节点同步主节点数据从而达到一致性地状态;
类似redis中主从复制史rdb数据恢复;
流程:

  1. leader生成snapshot
  2. leader向follower发送snapshot
  3. follower接收

​gRPC server ectd集群间以及client 与etcd节点间都是通过gRPC进行通讯;

参考资料

  1. Raft动态演示
  2. 官方文档 - etcd官方文档中文版 (gitbook.io)
  3. etcd学习(1)-etcd的使用场景 - ZhanLi - 博客园 (cnblogs.com)
  4. etcd 原理与实践【2022】_哔哩哔哩_bilibili

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新章节:全设备通用调度算法-通讯重构

新章节:全设备通用调度算法-通讯重构 文章目录 新章节:全设备通用调度算法-通讯重构前言一、重构了TCP和UDP通讯二、优化了OPC和OPCUA三、升级了监控客户端四、升级了通讯的图形化其他升级 前言 现在真的很懒也很少写代码了,写代码和更新进度…

webSocket网页通信---使用js模拟多页面实时通信

webSocket是什么 WebSocket是一种先进的网络技术,它提供了一种在单个TCP连接上进行全双工通信的能力。传统的基于HTTP的通信是单向的,即客户端发起请求,服务器响应请求,然后连接关闭。但是,WebSocket允许服务器和客户端…

欧盟,又出了新规-通用充电器新规通用充電器的 RED 修正案如何办理?

欧盟,又出了新规-通用充电器新规通用充電器的 RED 修正案如何办理? 欧盟新规委员会发布《通用充电器指令》指南通用充電器的 RED 修正案办理流程: 2024年5月7日,欧盟委员会发布《通用充电器指令》指南,修订了《无线…

Linux之进程控制(下)

目录 进程替换的概念 进程替换的函数 execl​编辑 execlp execle execv execvp execve 上期,我们学习了进程创建,进程终止和进程等待,今天我们要学习的是进程控制中相对重要的板块------进程替换。 进程替换的概念 在进程创建时&…

【 香橙派 AIpro评测】大语言模型实战教程:香橙派 AIpro部署LLMS大模型实站(保姆级教学)

引言 OrangePi AIpro 这块板子作为业界首款基于昇腾深度研发的AI开发板,一经发布本博主就火速去关注了,其配备的 8/20TOPS澎湃算力是目前开发板市场中所具备的最大算力,可谓是让我非常眼馋啊!这么好的板子那必须拿来用用&#xff…

LeetCode热题100刷题6:160. 相交链表、206. 反转链表、234. 回文链表、141. 环形链表、142. 环形链表 II

160. 相交链表 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode…

QDockWidget类详解

一.QDockWidget类概述 1.QDockWidget类 QDockWidget类提供了一个特殊的窗口部件,它可以是被锁在QMainWindow窗口内部或者是作为顶级窗口悬浮在桌面上。 QDockWidget类提供了dock widget的概念,dock widget也就是我们熟悉的工具面板或者是工具窗口。Do…

nginx转发的问题

我在项目配置的时候遇到一个问题: 配置了域名转发,且配置了https nginx配置如下: server {listen 443 ssl;server_name yourdomain.com;ssl_certificate /path/to/your/certificate.crt;ssl_certificate_key /path/to/your/private.key;loca…

10.SQL注入-http header利用案例

SQL注入-http header利用案例 首先通过登录http头界面,如图所示:登录的信息会被记录到数据库中去,同时使用bp进行抓包分析 将抓包的数据发送repeater里面进行调试 通过useragent进行注入 将useragent对应的数据信息删除掉,输入单引号测试被后台执行报错sql语法…

【Python机器学习】模型评估与改进——带交叉验证的网格搜索

虽然将数据划分为训练集、验证集、测试集的方法是可行的,也相对常用,但这种方法对数据的划分相当敏感,为了得到对泛化性能的更好估计,我们可以使用交叉验证来评估每种参数组合的性能,而不是仅将数据单次划分为训练集与…

为什么要在成像应用中使用图像采集卡?

达到最大产量是工业和工厂自动化的关键标准之一。提高传感器分辨率和帧速率有助于实现这一目标,但也使带宽达到极限,并提出了新的传输问题。当前高带宽接口(如10GigE、相机直接与PC连接和嵌入式系统)的实现促使成像应用的许多用户询问如何以最佳配置最优…

vue3进阶,渲染函数使用

目录 渲染函数使用场景 h() 渲染函数 渲染函数基础写法 渲染函数的组件传参,事件传递 渲染函数的插槽使用 结语 渲染函数使用场景 在写这篇文章之前,我会先简单说一下渲染函数,并且我会在第一个渲染函数的介绍中,标名渲染函数…

[Go 微服务] Kratos 验证码业务

文章目录 1.环境准备2.验证码服务2.1 kratos 初始化验证码服务项目2.2 使用 Protobuf 定义验证码生成接口2.3 业务逻辑代码实现 1.环境准备 protoc和protoc-gen-go插件安装和kratos工具安装 protoc下载 下载二进制文件:https://github.com/protocolbuffers/protobu…

探索智慧校园人事系统:社会关系管理功能全解析

智慧校园人事系统中的社会关系管理模块,旨在通过数字化手段,高效、安全地记录与管理教职工的社会联系信息,包括但不限于家庭成员、紧急联系人、学术合作关系、社会兼职等,旨在促进学校对教职工个人生活关怀及职业网络拓展的理解和…

四、(2)获取数据(补充urllib)(爬虫及数据可视化)

四、(2)获取数据(补充urllib)(爬虫及数据可视化) urllibget请求post请求User-AgentResponse模拟真实信息在豆瓣spider中真实实现 urllib 此处的扩展,可以进行在主体的程序学习完成后&#xff0…

【数据结构】04.双向链表

一、双向链表的结构 注意:这里的“带头”跟前面我们说的“头节点”是两个概念,带头链表里的头节点,实际为“哨兵位”,哨兵位节点不存储任何有效元素,只是站在这里“放哨的”。 “哨兵位”存在的意义:遍历循…

Roboflow自动标定数据集

最近需要自己打数据集,记录一下用Roboflow来打标签。 https://roboflow.com/(官网) 进入官网先注册,注册完成后进入这个界面。 我先讲如果不想让数据集公开怎么办,因为这里每个新建的都是公开的。新账号进去应该进去…

【数据分享】国家级旅游休闲街区数据(Excel/Shp格式/免费获取)

之前我们分享过从我国文化和旅游部官网整理的2018-2023年我国50个重点旅游城市星级饭店季度经营状况数据(可查看之前的文章获悉详情)!文化和旅游部官网上也分享有很多与旅游相关的常用数据,我们基于官网发布的名单文件整理得到全国…

Qt Creator13配置Android开发环境

QT Creator13是目前(2024年)最新版本,配置Android开发环境有一些不一样,走了一些弯路,记录如下。 1、安装JDK和SDK 下载安装JDK和SDK,建议安装在无空格和中文字符的目录下。 具体安装步骤不再赘述&#…

GraalVM

文章目录 1、什么是GraalVM2、GraalVM的两种模式1_JIT模式2_AOT模式3_总结 3、应用场景1_SpringBoot搭建GraalVM应用2_函数计算3_Serverless应用 4、参数优化和故障诊断1_内存快照文件的获取2_运行时数据的获取 1、什么是GraalVM GraalVM是Oracle官方推出的一款高性能JDK&…