ETCD简介

news2024/11/15 2:08:58

为什么使用ETCD

  • ETCD简介
  • ETCD发展史
  • ETCD架构
    • etcd数据通道
    • 具体交互
  • ETCD使用场景
  • 概念词汇

ETCD简介

现代键值(Key - Value)存储系统,ZooKeeper是历史最悠久的项目,起源于Hadoop。这里ETCD与Zk对比。
ETCD相比与ZK,更加简单,安装部署和使用更加容易,etcd的某些功能是ZK没有的。具体如下:

  • etcd更加稳定可靠
  • 在服务发现的实现上,etcd使用的是节点租约,并支持多group;而zk使用的是临时节点,临时节点存在很多问题
  • etcd支持稳定的watch
  • etcd支持MVCC(多版本并发控制),因为有协同系统需要无锁操作
  • etcd支持更大的数据规模,支持存储百万到千万级别的key
  • etcd的性能比zk更好,三台8C节点,etcd v3版本可以每秒万次的写操作和数十万次的读操作

etcd名字由来:分为etc和d,etc即linux/unix操作系统下的/etc目录,d表示分布式(distributed),/etc一般存储配置信息,所以寓意就是大规模分布式系统存储配置信息。

etcd是一个Go语言编写的分布式,高可用的一致性键值存储系统,是基于Raft协议,通过复制日志文件的方式来保证数据的强一致性。当客户端应用写一个key时,首先会存储到etcd的Leader上,然后再通过Raft协议复制到etcd集群的所有成员中,以此维护各个节点状态的一致性与实现可靠性。
虽然etcd是一个强一致性的系统,但也支持从非Leader节点读取数据以提高性能,而且写操作仍需Leader支持。
etcd实现了一个Go语言版的Raft程序库,并广泛应用于各个项目。
etcd具备一定的容错能力,假设集群共有n个节点,即便集群(n-1)/2个节点发生故障,只要剩下(n+1)/2个节点达成一致,也能操作成功。因此它能够有效应对网络分区和机器故障带来的数据丢失风险。
etcd默认数据一更新就罗盘持久化,数据持久化存储使用WAL(write ahead log,预写式日志)格式。WAL记录数据变化的全过程,在etcd中所有数据在提交之前都要先写入WAL中;etcd的Snapshot(快照)文件则存储了某一时刻的etcd的所有数据,默认设置为每10000条记录做一次快照,经过快照后WAL文件即可删除。

ETCD发展史

etcd发展至今,有几个重要的版本。

  • etcd0.4版本
    是etcd对外发布的第一个稳定版本

Raft算法做分布式协同
HTTP+JSON的API
使用SSL客户端证书验证
基准测试在每个实例中每秒写入1000次等

  • etcd2.0版本
    etcd2.0版本是etcd第一个真正意义上的大版本,引入几个重要功能:

内部etcd协议的优化避免意外错误配置
etcdctl增加了backup命令便于从集群异常恢复数据
运行时动态更新集群member配置,通过etcdctl客户端的member子命令
通过CRC校验和append-only的行为提高了存盘数据的安全性
优化Raft一致性算法实现,该实现会被其他项目引用
etcd的TCP2379/2380端口正式成为IANA(The Internet Assigned Numbers Authority,互联网数字分配机构)官方分配的端口

  • etcd3.0版本
    对2.0版本做了多出优化

提升了整体吞吐量,降低了时延,通过gRPC API降低了Raft协议调用的开销,提升了WAL的磁盘利用率
全新的存储后端带来了每个key平均内存开销的减少
自动的TLS配置
扁平的二进制键空间:摈弃了v2的key-value层级和目录
全新的v3 API,支持基于key为前缀和范围的get、watch
多版本的键空间:允许访问历史版本的key
事务:将对etcd服务的多个请求合并成一个操作
租约:允许一组key共享一个TTL
监控/告警:通过存储配额保护etcd免受偶然发生的超额使用

ETCD架构

etcd设计使用考虑的四个要素

  • 简单
    使用RESTful风格的HTTP+JSON的API
    性能考虑,etcd v3增加了对gRPC的支持,同时也提供rest gateway进行转化
    Go语言编写,跨平台,部署和维护简单
    使用Raft算法保证强一致性,Raft算法可理解性好
  • 安全
    支持TLS客户端安全认证
  • 性能
    但实力支持以每秒1000次以上的写操作(v2),极限写性能可达10K+QPS(v3)
  • 可靠
    使用Raft算法充分保证分布式系统数据的强一致性

etcd(server)大致可以分为网络层(http server),Raft模块,复制状态机,存储模块,大致如下:
在这里插入图片描述
网络层:提供网络数据读写功能,监听服务短裤,完成集群节点之间数据通信,收发客户端数据
Raft模块:Raft强一致性算法具体实现
存储模块:设计KV存储,WAL文件,Snapshot管理等,用于处理etcd支持的各类功能,包含数据索引,节点状态变更,监控与反馈,事件处理与执行等
复制状态机:抽象的一个模块,状态机的数据维护在内存中,定期持久化到磁盘。

一个用户请求,经过HTTP Server转发给存储模块进行具体的事务处理,如果涉及到节点状态更新,则交给Raft模块进行仲裁和日志记录,然后再同步给别的etcd节点,只有当半数以上的节点确认了该节点状态修改后,才会进行数据持久化。

集群中各节点传输数据:
1)Leader向Follower发送心跳包,Follower向Leader回复消息
2)Leader向Follower发送日志追加信息
3)Leader向Follower发送Snapshot数据
4)Candidate节点发起选举,向其他节点发起投票请求
5)Follower将收到的写操作数据转发给Leader
集群中任意2个节点之间均有长连接相互连接的网状结构

etcd数据通道

根据不同用途,定义了各种不同消息类型,这些不同的消息,最终都通过protocol buffer格式进行编码。消息数据大小可能不同,例如Snapshot数据量比较大,甚至会超过1GB,心跳消息可能就几十KB,所以抽象类两种类型的消息传输通道,即Stream类型通道,Pipeline类型通道,都是使用HTTP传输数据。

Stream类型通道:用于处理数据量较少的消息,例如,心跳和日志追加消息,点对点之间只维护一个HTTP长连接,交替向链接中写入数据和读取数据。
通过Channel与Raft模块传递消息,每个Stream类型通道关联2个goroutine,一个用于建立HTTP链接,从链接上读取数据并解码成消息,再通过channel传递给raft模块,另一个通过channel从raft模块中接受消息,然后写入Stream类型通道

Pipiline类型通道:用于处理数据量大的消息,例如Snapshot,这种类型的消息需要与心跳等消息分开,否则会阻塞心跳包的传输,进而影响集群的稳定性。不维护HTTP长连接,只通过短连接传输数据,用完即关闭。
不过当Stream类型链接不可用时,也可以使用Pipiline传输
Pipeline类型通道可以并行发送消息,它维护一组goroutine,每个goroutine可以向对端发送POST请求,收到回复后,链接关闭。

具体交互

在这里插入图片描述
具体各个模块交互,涉及到几个重要的结构体,EtcdServer ,RaftNode,Node
EtcdServer 是整个etcd节点的功能的入口,包含etcd节点运行过程中需要的大部分成员
RaftNode是raft状态机,维护raft状态机的步进和状态迁移。
Node包含在raftNode中,是Node接口的实现。里面包含一个协程和多个队列,是状态机消息处理的入口。
网络层和Raft模块是通过RaftNode,channel来进行交互的。

ETCD使用场景

服务注册与发现

  • 微服务注册
    原因:etcd具备强一致性,具备注册服务和健康健康状况的机制(对注册的key设置TTL,服务定时发送心跳),查找和连接服务(etcd指主题下注册的业务能再对应的主题下找到)
  • Paas平台应用多实例与实力故障重启透明化
    一般应用都会有多个实例,通过域名,负载均衡。但是应用随时可能故障重启,这时候需要动态的配置域名解析路由信息,etcd服务可以轻松解决这个动态配置的问题

消息发布和订阅
topic(etcd的某个prefix或者某个key),producer写入etcd,consumer 作为etcd的一个watcher监听消息,然后进行消费

负载均衡
服务提供方注册到etcd中,当服务提供方不健康时,etcd告诉服务请求者,提出不健康的服务

分布式锁
通过判断某个key是否存在,以及事务特性来实现

分布式队列
通过key设置一直+1,

集群监控与Leader竞选
通过watcher机制,节点设置TTL key,服务通过不断发送健康检查来对集群进行监控,

概念词汇

名词描述
Raftetcd所采用的保证分布式系统强一致性的一种算法
Node一个Raft状态机实例
Member一个etcd实例,管理一个Node,并可以为客户端请求提供服务
Cluster多个Member构成,遵循Raft一致性协议的etcd集群
Peer对同一个etcd集群中另外一个Member的叫法
Client凡是连接etcd服务器请求服务的,臀如,获取key-value、写数据或watch更新的程序,都统你为Client
Proposal一个需要经过Raft一致性协议的请求,例加,写请求或配置更新请求
Quorum
WAL:预写式日志,etcd用于持久化存储的日志格式
Snapshotetcd集群状态在某一时间点的快照(备份),etcd为防止WL文件过多而设置的快照,用于存储etcd的数据状态
Proxyetcd的一种模式,为etcd集群提供反向代理服务
LeaderRaft算法中通过竞选而产生的处理所有数据提交的节点
Follower竞选失败的节点作为Raft中的从属节点,为算法提供强一致性保证
Candidate当Follower超过一定的时间还接收不到Leader的心跳时转为Candidate开始竞选
Term某个节点从成为Leader到下一次竞选的时间,称为一个Term
IndexWAL日志数据项编号。Raft中通过Term和index来定位数据
Key用户定义的用于存储和获取用户定义数据的标识符
Key space键空间,etcd集群内所有键的集合
Revisionetcd集群范围内64位的计数器,键空间的每次修改都会导致该计数器的增加
Modification Revision一个key最后一次修改的revision
Lease一个短时的(会过期),可续订的契约(租约),当它过期时,就会删除与之关联的所有键
Transition事务,一个自动执行的操作集,要么一块成功,要么一块失败。
Watcher观察者,etcd最具特色的概念之一。客户端通过打开一个观察者来获取一个给定键范围的更新
Key Range键范围,一个键的集合,这个集合既可以是只有一个key或者是在一个字典区间,例如(a,b],或者是大于某个key的所有key
Endpoint指向etcd服务或资源的URL
Compactionetcd的压缩(Compaction)操作,丢弃所有etcd的历史数据并且取代一个给定revision之前的所有key。压缩操作通常用于重新声明etcd后端数据库的存储空间。其与Raft的日志压缩是一个原理
key version键版本,即一个健从创建开始的写(修改)次数,从1开始。一个不存在成已制除的健版本是0。其与revision的概念不同

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

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

相关文章

【力扣】3、无重复字符的最长子串

3、无重复字符的最长子串 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 //维护左指针,循环右指针 //new map是新建一个哈希表 var lengthOfLongeSubstring function (s){const map new Map();let l 0;let num 0;for(let i …

【微服务架构设计和实现】4.4 数据库和数据存储的分离和服务化

往期回顾: 第一章:【云原生概念和技术】 第二章:【容器化应用程序设计和开发】 第三章:【基于容器的部署、管理和扩展】 第四章:【4.1 微服务架构概述和设计原则】 第四章:【4.2 服务边界的定义和划分…

下载较老版本或最新版本的ARM Linux gcc 交叉编译工具链

前言 如果开发的 ARM 平台比较的多,需要多个版本的 arm gcc 交叉编译工具链,那么如何获取较新版本的 arm gcc 交叉编译工具链呢? 下载现成的 arm gcc 交叉编译工具链 速度较快的,也比较新的,就到 ARM 官方网站下载 …

突破 Python 爬虫的瓶颈:WebKit 在线模拟技术与环境搭建

部分数据来源:ChatGPT 引言 在使用 Python 进行爬虫开发的时候,很多情况下我们需要利用一些浏览器内核来模拟浏览器行为。而目前最为常用的两种浏览器内核是基于 WebKit 和基于 Chromium 的内核。那么在 Windows 10 操作系统中,我们可以使用 Anaconda 作为 Python 的发行版…

mysql的一些使用语句写法

记录一下,方便自己以后查看,以后会随时添加 1,查询重复数据 select project_id,house_location,count(*) from house_price group by house_location having count(house_location)>1; 2,删除重复的数据,并保留一条…

MySQL(六):基本的SELECT语句

基本的SELECT语句 前言一、SELECT...二、SELECT ... FROM三、列的别名四、去除重复行五、空值参与运算六、着重号七、查询常数八、显示表结构九、过滤数据 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主&#…

串口协议说明

文章目录 关系波特率概念波特率相对误差UART误差保证 协议常见的串行接口协议之间的比较USB 转串口PL2303USB 转串口CP2102USB转232终端电阻 串口电平TTL电平485电平 帧奇偶校验 关系 两个半双工,一发一收,就是Uart 在一根线的基础上,多加一…

【Git原理与使用】

🎉实战项目:Git原理与使用 博主主页:桑榆非晚ᴷ 博主能力有限,如果有出错的地方希望大家不吝赐教 给自己打气:成功没有快车道,幸福没有高速路。所有的成功,都来自不倦地努力和奔跑&#xff0c…

人机交互学习-10 评估的基础知识

评估的基础知识 背景评估目标和原则评估目标评估的优点评估的目标 评估原则 评估范型和技术“范型”与“技术”评估范型快速评估可用性测试实地研究预测性评估评估范型比较 评估技术评估范型和技术的关系 评估方法的选择区分评估技术的因素评估技术的分类评估方法组合 评估步骤…

CTFshow-pwn入门-Test_your_nc

pwn0 靶场环境启动开,显示ssh连接。 直接打开ctfshow的pwn专用虚拟机来使用ssh连接。密码是123456。 连接之后,他会出现这样的一大堆的介绍性文字,不用管他,然他输出完就行。 中间还用各种语言说了一下“消灭人类暴政&#xff…

Python+Qt桌面端与网页端人工客服沟通工具

程序示例精选 PythonQt桌面端与网页端人工客服沟通工具 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonQt桌面端与网页端人工客服沟通工具>>编写代码&#xff0c;代码整洁…

java swing 购物系统 简要文档 idea eclipse双版本

java swing 购物系统 简要文档 idea eclipse双版本 安装包等资源项目源码项目安装包部署教程 图片演示添加商品类别界面添加商品界面查询商品界面未登录主界面管理员登录界面注册会员界面购买商品界面商品类别管理界面 核心代码CustomerAddInterFrm.javaMainFrm.javaManagerLog…

单片机基于 Linux 环境下的Makefile 工程管理和工具链配置

一、开发环境 开发板&#xff1a;stm32f407 编译环境&#xff1a;18.04.6 LTS 工具链&#xff1a;gcc-arm-none-eabi, gcc-arm-none-objcopy 二、工具链下载和安装 下载地址&#xff1a;&#xff08;下载64位linux版&#xff09; https://launchpad.net/gcc-arm-embedded/downl…

从零开始Vue项目中使用MapboxGL开发三维地图教程(五)加载点、线、面图层以及三维面图层(白模)

目录 1、加载点图层2、加载线和面图层3、加载三维面图层&#xff08;白模&#xff09; 1、加载点图层 开发地图应用时&#xff0c;加载POI等点状数据&#xff0c;显示文字或者图标信息&#xff0c;mapbox-gl对应使用的是符号图层&#xff08;symbol&#xff09;&#xff0c;下面…

Modbus通信介绍 网络高级工具使用

目录 Modbus简介 ModbusTCP协议格式 》1.报文头&#xff08;共7字节&#xff09; 》2.功能码 》3.数据 练习&#xff1a;读传感器数据&#xff0c;读1个寄存器数据&#xff0c;写出主从数据收发协议。 练习&#xff1a;写出控制IO设备开关的协议数据&#xff0c;操作1个…

ansible学习

在物理机查看环境&#xff0c;[kioskfoundation0 ~]$ cat /etc/rht 先清空当前环境&#xff0c;[kioskfoundation0 ~]$ rht-clearcourse 0 再切换rh294环境&#xff0c;[kioskfoundation0 ~]$ rht-setcourse rh294 验证环境是否切换成功&#xff0c;[kioskfoundation0 ~]$ cat…

230617已安装SqlServer2017Express,再安装一个SqlServer2017ExpressAdvanced试试

再安装一个 MsSqlServer 试试 再安装一个 MsSqlServer 试试, 这次用高级版 之前已经安装了 一个 MsSqlServer2017Express一个MsSqlServer2017LocalDB 现在再安装一个 MsSqlServer2017ExpressAdvanced 直接下一步 等待 下个页面列出了已经安装的MsSqlServer实例 之前已…

【群智能算法改进】一种改进的白鲸优化算法 改进白鲸优化算法 改进后的EBWO[2]算法【Matlab代码#42】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 原始BWO算法2. 改进后的EBWO算法2.1 准反向学习QOBL策略2.2 旋风觅食策略 3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节&#xff1a;资源获取】 1. 原始BWO算法 白鲸优化算法 (BWO&#xff…

STM32pwm 时钟 配置 周期 频率 关系配置原理

一 概念 PWM&#xff08;脉冲宽度调制&#xff09;是一种常用的电子信号调制技术&#xff0c;用于控制电子设备中的电平和电流。它通过调整脉冲的宽度来控制信号的平均功率。 在PWM信号中&#xff0c;一个周期由一个固定的频率确定&#xff0c;称为PWM频率。每个周期内&#…

分布式锁服务关键技术和常见解决方案

前言 锁&#xff0c;核心是协调各个使用方对公共资源使用的一种机制。当存在多个使用方互斥地使用某一个公共资源时&#xff0c;为了避免并行使用导致的修改结果不可控&#xff0c;需要在某个地方记录一个标记&#xff0c;这个标记能够被所有使用方看到&#xff0c;当标记不存在…