当前位置: 首页 > article >正文

etcd:高可用,分布式的key-value存储系统

引言

etcd是基于go语言开发的一款kv存储引擎,基于raft一致性算法实现的一种存储

 一.etcd的底层原理

1.etcd的特点

高可用性与一致性:etcd 使用 Raft 算法保证集群中数据的强一致性,即使在节点故障的情况下也能保持数据完整性。

分布式存储:数据以键值对的形式存储,支持分布式读写,适用于大规模服务发现和配置共享的场景。

易于集成:etcd 提供了 HTTP/gRPC 接口,方便各种编程语言和平台集成。

应用场景:Kubernetes 等容器编排平台使用 etcd 作为核心组件,实现状态管理和服务协调。

 2.什么是raft一致性算法

领导者选举(Leader Election)
集群中的所有节点通过选举过程选出一个领导者,负责处理客户端请求以及日志复制工作;如果当前领导者发生故障,其余节点会重新选举出新的领导者。

日志复制(Log Replication)
领导者接收到客户端请求后,会将这条命令追加到自己的日志中,然后通过日志复制机制将该命令复制到所有追随者节点,确保所有节点都以相同的顺序应用这些命令,从而保持一致的状态机。

安全性(Safety)
为防止不同节点之间的日志产生分歧,Raft设计了一套严格的规则。例如,只有领导者拥有提交日志的权利,并且只有当多数节点确认日志条目之后才允许将其提交,保证了在大多数节点正常工作的情况下,系统始终保持一致。

raft一致性算法可视化图形 链接  Raft 

 3.etcd 架构(体系结构)

 

boltdb 是一个单机的支持事务的 kv 存储, etcd 的事务是基于 boltdb 的事务实现的; boltdb 为每
一个 key 都创建一个索引( B+ 树);该 B+ 树存储了 key 所对应的版本数据;
wal(write ahead log) 预写式日志实现事务日志的标准方法;执行写操作前先写日志,跟 mysql 中 redo 类似, wal 实现的是顺序写,而若按照 B+ 树写,则涉及到多次 io 以及 随机写;
snapshot 快照数据 ,用于其他节点同步主节点数据从而达到一致性地状态;类似 redis 中主从复 制中 rdb 数据恢复;流程: 1. leader 生成 snapshot 2. leader follower snapshot 3. follower接收并应用 snapshot
gRPC server ectd 集群 间以及 client etcd 节点间都是通过 gRPC 进行通讯;
4.etcd的事务 (举一个简单的例子)

key的value是不是lion

是key的value改为tiger

不是的话获取key的value 

 二.etcd的常用命令 和 go对etcd操作代码案例

启动etc 

1.常用命令

put   get   del

etcdctl put /foo bar //将键 “/foo” 对应的值设置为 “bar”
etcdctl get /foo  //查询键 “/foo” 的值
etcdctl del /foo   //删除指定键 “/foo”

 

 watch 

etcdctl watch /foo  //监视键 “/foo” 及其后续变化(实时输出修改日志)

 

 lease

etcdctl lease grant 10 //为键设置租约,有效期 10 秒
etcdctl lease keep-alive 1234567890 //保持已有租约(例如 lease id 为 1234567890)
etcdctl lease revoke 1234567890 //撤销租约以自动删除其绑定的键
 2.go对etcd操作代码

①basic

package mainimport ("context" // 上下文包用于控制请求超时、取消等"fmt"     // 格式化输出"time"    // 时间处理clientv3 "go.etcd.io/etcd/client/v3" // etcd 客户端 v3 包
)func main() {// 通过指定 etcd 服务地址和拨号超时时间,创建 etcd 客户端cli, err := clientv3.New(clientv3.Config{Endpoints:   []string{"127.0.0.1:2379"}, // etcd 服务地址DialTimeout: 5 * time.Second,            // 连接超时时间为 5 秒})if err != nil {panic(err) // 连接失败则终止程序}defer cli.Close() // 程序结束前关闭客户端连接// 使用 context 限定操作超时时间,防止一直等待ctx, cancel := context.WithTimeout(context.Background(), time.Second)// 向 etcd 中写入一个 key/value 对_, err = cli.Put(ctx, "key", "lion")cancel() // 取消 context 的使用if err != nil {panic(err) // Put 操作失败则终止程序}// 创建新的 context 来获取 key 值ctx, cancel = context.WithTimeout(context.Background(), time.Second)// 从 etcd 中获取指定 key 值resp, err := cli.Get(ctx, "key")cancel()if err != nil {panic(err) // Get 操作失败则终止程序}// 遍历响应中所有返回的 key/value 对,并打印出来for _, ev := range resp.Kvs {fmt.Printf("%s:%s\n", ev.Key, ev.Value)}
}

  

② watch

 

package mainimport ("context" // 上下文包,用于传递取消信号和超时控制"fmt"     // 格式化输出,用于打印日志信息clientv3 "go.etcd.io/etcd/client/v3" // 导入 etcd 客户端 v3 包
)func main() {// 通过指定 etcd 服务器的 URL 创建一个 etcd 客户端cli, err := clientv3.NewFromURL("127.0.0.1:2379")if err != nil {// 如果连接失败,则终止程序并输出错误信息panic(err)}// 在 main 函数退出前关闭 etcd 客户端连接defer cli.Close()// 调用 Watch 方法,对 key3 及其后续 key 的变化进行监听// WithFromKey() 表示从 key3 开始后面的所有 keywatch := cli.Watch(context.Background(), "key3", clientv3.WithFromKey())// 循环遍历监听返回的数据for resp := range watch {// 对于每次监听返回的响应中的每个事件进行处理for _, ev := range resp.Events {// 打印事件类型、键和值fmt.Printf("Type: %s Key: %s Value: %s\n", ev.Type, ev.Kv.Key, ev.Kv.Value)}}
}

 ③lease

package mainimport ("context" // 上下文包,用于为请求设置超时和取消操作"fmt"     // 格式化输出clientv3 "go.etcd.io/etcd/client/v3" // 导入 etcd client v3 包
)func main() {// 通过指定 etcd 服务器的 URL 创建一个 etcd 客户端cli, err := clientv3.NewFromURL("127.0.0.1:2379")if err != nil {// 如果连接失败,则终止程序并输出错误信息panic(err)}// 在函数退出前确保关闭 etcd 客户端defer cli.Close()// 调用 Grant 方法申请一个租约,设置租约有效期为 5 秒lease, err := cli.Grant(context.Background(), 5)if err != nil {// 如果申请租约失败,则终止程序并输出错误信息panic(err)}// 打印租约 IDfmt.Println("lease id", lease.ID)// 使用租约将 key 与 value 绑定写入到 etcd 中_, err = cli.Put(context.Background(), "key", "lion", clientv3.WithLease(lease.ID))if err != nil {// 如果写入操作失败,则终止程序并输出错误信息panic(err)}// 如果想保持租约活跃,可以通过 KeepAlive 进行续租if true {// 续租操作: 使用 KeepAlive 方法进行长期续租ch, err := cli.KeepAlive(context.Background(), lease.ID)if err != nil {// 如果续租失败,则终止程序并输出错误信息panic(err)}// 循环从返回的通道中读取续租信息for {recv := <-ch// 打印续租后剩余的 TTL(生存时间)fmt.Println("time to live", recv.TTL)}}// 如果只需要进行一次续租,则可以使用 KeepAliveOnce 方法(此处已被禁用)if false {// 单次续租操作:仅获取一次续租信息res, err := cli.KeepAliveOnce(context.Background(), lease.ID)if err != nil {// 如果操作失败,则终止程序并输出错误信息panic(err)}// 打印续租后剩余的 TTL(生存时间)fmt.Println("time to live", res.TTL)}
}

维持心跳包 

 

 

心跳包断开 

3.etcd总结 

etcd 是一个高度可靠的分布式键值存储系统,它提供了强一致性、故障恢复和高可用的保证。它主要依靠 Raft 算法来实现集群中数据的复制与一致性,是服务发现、配置管理和分布式协调的理想工具。同时,etcd 提供了简洁的 API(基于 HTTP/gRPC),易于与各种系统和编程语言集成,被 Kubernetes 等众多云原生平台广泛采用。

相关文章:

etcd:高可用,分布式的key-value存储系统

引言 etcd是基于go语言开发的一款kv存储引擎&#xff0c;基于raft一致性算法实现的一种存储 一.etcd的底层原理 1.etcd的特点 高可用性与一致性&#xff1a;etcd 使用 Raft 算法保证集群中数据的强一致性&#xff0c;即使在节点故障的情况下也能保持数据完整性。 分布式存储&a…...

AI in Game,大模型能力与实时音视频技术融合,交出AI应用新答卷

随着AI的技术进步和工具普及&#xff0c;尤其是在这两年的跃进之后&#xff0c;AI在游戏行业内的应用已经逐步由理念设想推向落地实践。从蔡浩宇披露的AI新游《Whispers From The Star》到GDC上各大厂家呈现的游戏AI新亮点&#xff0c;我们看到了更多AI与游戏的结合方式&#x…...

欢乐熊大话蓝牙知识11:如何打造一个低功耗蓝牙温湿度传感器?

🧊 如何打造一个低功耗蓝牙温湿度传感器? 用电像抠门老头,通信像特工密谈。 🌡️ 引子:为什么你需要一个低功耗 BLE 传感器? 你是不是有过这种需求: 想在办公室角落放个传感器看温湿度,却不想拉电源线?想给智能养宠箱加个环境感知模块,但不能三天一换电池?想造个…...

Linux 安装 Remmina

欢迎关注公号&#xff1a;每日早参&#xff0c;第一时间获取AI资讯&#xff01; 为什么安装Remmina, 因为Mobaxterm免费版本有窗口限制。 Remmina 是一款功能强大的开源远程桌面客户端&#xff0c;适用于 Linux 和其他类 Unix 系统&#xff0c;也支持 Windows 平台。 安装指南…...

什么是HTTP HTTP 和 HTTPS 的区别

HTTP协议定义 超文本传输协议&#xff08;HyperText Transfer Protocol, HTTP&#xff09;是一种应用层协议&#xff0c;主要用于客户端与服务器之间的数据交换。它基于请求-响应模型运行&#xff0c;在每次会话中由客户端发起请求&#xff0c;服务器返回相应的内容。 HTTP 是…...

cos和dmz学习

COS(Capability Open Service) 组件主要为系统提供能力开放的入口和控制。系统中需要对外进行能力开放的组件将RESTful的API接口注册到COS组件中&#xff0c;第三方系统就可以通过调用API来获取组件提供的能力。应用场景&#xff1a;当你想调用的外部系统接口不支持外网访问时&…...

上升沿计数 stm32 中断

在STM32上利用中断实现上升沿计数,可以按照以下步骤进行,这里以STM32F1系列为例,使用HAL库进行代码编写: 1. STM32CubeMX配置 打开STM32CubeMX并创建一个新工程,选择对应的STM32微控制器型号(如STM32F103C8T6)。在Pinout & Configuration选项卡中,找到用于检测上升…...

Java 各版本核心新特性的详细说明

一、Java 8&#xff08;2014&#xff09;—— 函数式编程的里程碑 1. Lambda 表达式 作用&#xff1a;简化匿名内部类&#xff0c;支持函数式编程。示例&#xff1a;// 传统匿名内部类 Runnable r1 new Runnable() {Overridepublic void run() {System.out.println("He…...

Nginx 性能优化全解析:从进程到安全的深度实践

一、进程优化&#xff1a;释放硬件性能潜力 Nginx 通过多工作进程处理请求&#xff0c;合理配置进程参数能充分利用 CPU 资源&#xff0c;避免资源浪费。 1.1 worker_processes 参数详解 worker_processes用于设置 Nginx 工作进程的数量&#xff0c;它直接影响 Nginx 对 CP…...

Pycharm and Flask 的学习心得(10)重定向

一 定义&#xff1a; 服务器告诉浏览器&#xff1a;你现在访问的这个页面&#xff0c;请改去另一个地址访问。 浏览器接收到这个“指令”后&#xff0c;会 自动跳转到另一个网页。 二 如何写&#xff1a; 方法一&#xff1a;重定向到网址 方法二&#xff1a;重定向到自己的…...

单机Kafka配置ssl并在springboot使用

目录 SSL证书生成根证书生成服务端和客户端证书生成keystore.jks和truststore.jks辅助脚本单独生成truststore.jks 环境配置hosts文件kafka server.properties配置ssl 启动kafkakafka基础操作springboot集成准备工作需要配置的文件开始消费 SSL证书 证书主要包含两大类&#x…...

《棒球特长生》棒球升学途径·棒球1号位

美国大学棒球体系 | U.S. College Baseball System 美国大学棒球主要通过 NCAA&#xff08;全国大学体育协会&#xff09;和 NAIA&#xff08;全美校际体育协会&#xff09;组织&#xff0c;分为三个级别&#xff1a; NCAA Division I&#xff1a;竞技水平最高&#xff0c;提…...

JavaScript的call和apply

在 JavaScript 中&#xff0c;.call() 和 .apply() 都是 Function 原型上的方法&#xff0c;用于改变函数执行时的上下文对象&#xff08;即 this 指向&#xff09;&#xff0c;它们的区别仅在于参数传递的形式不同。下面结合几个常见场景&#xff0c;说明它们的实际应用。 1. …...

DiT、 U-Net 与自回归模型的优势

DiT 相对于 U-Net 的优势 全局自注意力 vs. 局部卷积 U-Net 依赖卷积和池化/上采样来逐层扩大感受野&#xff0c;捕捉全局信息需要堆叠很多层或借助跳跃连接&#xff08;skip connections&#xff09;。DiT 在每个分辨率阶段都用 Transformer 模块&#xff08;多头自注意力 ML…...

开源 FcDesigner 表单设计器组件事件详解

FcDesigner 是一款基于Vue的开源低代码可视化表单设计器工具&#xff0c;通过数据驱动表单渲染。可以通过拖拽的方式快速创建表单&#xff0c;提高开发者对表单的开发效率&#xff0c;节省开发者的时间。并广泛应用于在政务系统、OA系统、ERP系统、电商系统、流程管理等领域。 …...

Teigha应用——解析CAD文件(DWG格式)Teigha在CAD C#二次开发中的基本应用

Teigha是一款专为开发者设计的工具&#xff0c;其核心技术在于强大的API和丰富的功能集&#xff0c;提供了一系列工具和方法&#xff0c;使开发者能够轻松地读取、解析和操作DWG文件。它支持多种操作系统&#xff0c;能在处理大型DWG文件时保持高效性能&#xff0c;还可用于构建…...

C++23内存分配新特性:std::allocate_at_least

文章目录 一、背景与动机二、std::allocator::allocate_at_least的特性三、std::allocate_at_least的自由函数版本四、实际应用场景1. 动态容器的优化2. 自定义分配器 五、总结 在C23标准中&#xff0c; std::allocate_at_least和 std::allocator::allocate_at_least的引入为…...

JavaScript性能优化全景指南

JavaScript性能优化全景指南 Ⅰ. 加载性能优化 1.1 代码分割与懒加载 动态导入(ES2020) javascript // 路由级代码分割 const ProductPage () > import(/* webpackChunkName: "product" */ ./ProductPage.vue); // 交互驱动加载 document.querySelector(#char…...

04-jenkins学习之旅-java后端项目部署实践

1、创建被管理项目 2、构建流程说明 jenkins其实就是将服务部署拆分成了&#xff1a; 1、拉取代码(git) 2、打包编译 3、自定义脚本(jar复制、执行启动脚本) 4、部署成功后的一些通知等 3、demo配置 3.1、General 3.2 源码管理 添加用户名密码方式如下图 3.2.1 常见错误(r…...

基于Python flask 的豆瓣电影top250数据评分可视化

文章目录 基于Python flask 的豆瓣电影top250数据评分可视化项目简介项目结构效果展示源码获取 基于Python flask 的豆瓣电影top250数据评分可视化 博主介绍&#xff1a;✌安替-AnTi&#xff1a;CSDN博客专家、掘金/华为云//InfoQ等平台优质作者&#xff0c;硕士研究生毕业。专…...

Cat.4+WiFi6工业路由器介绍小体积大作用ER4200

ER42004G Cat.4WiFi6 工业路由器隶属于纵横智控ER系列&#xff0c;型号为ER4200&#xff0c;是一款坚固耐用、性能强大的网络设备&#xff0c;专为应对严苛环境而设计。它采用工业级品质设计&#xff0c;集成 4G Cat.4 全网络支持和 WiFi6 技术&#xff0c;可在稳定性和性能至关…...

大模型应用开发第三讲:大模型是Agent的“大脑”,提供通用推理能力(如GPT-4、Claude 3)

大模型应用开发第三讲&#xff1a;大模型是Agent的“大脑”&#xff0c;提供通用推理能力&#xff08;如GPT-4、Claude 3&#xff09; 资料取自《大模型应用开发&#xff1a;动手做AI Agent 》。 查看总目录&#xff1a;学习大纲 关于DeepSeek本地部署指南可以看下我之前写的…...

创建型模式之Abstract Factory(抽象工厂)

创建型模式之Abstract Factory&#xff08;抽象工厂&#xff09; 摘要&#xff1a; 本文介绍了抽象工厂模式&#xff08;Abstract Factory&#xff09;&#xff0c;它是一种创建型设计模式&#xff0c;提供了一种创建一系列相关对象的接口而无需指定具体类。文章通过手机工厂示…...

GitLab 18.0 正式发布,15.0 将不再受技术支持,须升级【一】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…...

【DeepSeek论文精读】12. DeepSeek-Prover-V2: 通过强化学习实现子目标分解的形式化数学推理

欢迎关注[【AIGC论文精读】](https://blog.csdn.net/youcans/category_12321605.html&#xff09;原创作品 【DeepSeek论文精读】1. 从 DeepSeek LLM 到 DeepSeek R1 【DeepSeek论文精读】10. DeepSeek-Coder-V2: 突破闭源模型在代码智能领域的障碍 【DeepSeek论文精读】12. De…...

字符串day7

344 反转字符串 字符串理论上也是一个数组&#xff0c;因此只需要用双指针即可 class Solution { public:void reverseString(vector<char>& s) {for(int i0,js.size()-1;i<j;i,j--){swap(s[i],s[j]);}} };541 反转字符串 自己实现一个反转从start到end的字符串…...

vue2中,codemirror编辑器的使用

交互说明 在编辑器中输入{时&#xff0c;会自动弹出选项弹窗&#xff0c;然后可以选值插入。 代码 父组件 <variable-editorv-model"content":variables"variables"placeholder"请输入模板内容..."blur"handleBlur" />data…...

FastAPI与MongoDB分片集群:异步数据路由与聚合优化

title: FastAPI与MongoDB分片集群:异步数据路由与聚合优化 date: 2025/05/26 16:04:31 updated: 2025/05/26 16:04:31 author: cmdragon excerpt: FastAPI与MongoDB分片集群集成实战探讨了分片集群的核心概念、Motor驱动配置技巧、分片数据路由策略、聚合管道高级应用、分片…...

Perl单元测试实战指南:从Test::Class入门到精通的完整方案

阅读原文 前言:为什么Perl开发者需要重视单元测试? "这段代码昨天还能运行,今天就出问题了!"——这可能是每位Perl开发者都经历过的噩梦。在没有充分测试覆盖的情况下,即使是微小的改动也可能导致系统崩溃。单元测试正是解决这一痛点的最佳实践,它能帮助我们在…...

强大的免费工具,集合了30+功能

今天给大家分享一款免费的绿色办公软件&#xff0c;它涵盖了自动任务、系统工具、文件工具、PDF 工具、OCR 图文识别、文字处理、电子表格这七个模块&#xff0c;多达 30 余项实用功能&#xff0c;堪称办公利器。 作者开发这款软件的初衷是为了解决日常办公中常见的痛点问题&am…...