云原生下的数据协调艺术:etcd存储系统解析

目录

一、分布式存储简介

二、etcd介绍

三、etcd架构

四、etcd集成实践


一、分布式存储简介

        随着云原生与容器化技术的兴起,分布式系统的复杂性大大增加。分布式系统面临一系列问题,比如部署复杂、响应时间慢、运维复杂等,其中最根本的问题是多个节点之间的数据共享问题。这就需要一个可靠的共享的存储系统来同步信息,这时就出现了分布式存储系统,这也是其产生的背景。

二、etcd介绍

        etcd 就是一个分布式存储的中间件,使用 Go 语言编写,并通过Raft协议确保分布式数据一致性,解决了分布式数据一致性问题。

        etcd 目前有两个主要的大版本系列:V2 和 V3。V2 版本是较早的版本,提供了一系列简单的 API 来进行键值对的存储、获取、修改、删除等操作。V2 实例最初是基于纯内存实现的,意味着所有的数据都不会持久化到磁盘上,这限制了其在需要数据持久化的场景下的适用性。V3 版本是对V2的重大升级,引入了许多改进,包括更强的API、更好的性能、数据的一致性和持久化存储能力。V3 引入了事务支持,可以在一次操作中执行多个修改操作,保证这些操作的原子性。它使用了Raft一致性算法的优化版本,增强了集群的稳定性和容错能力。

        为什么需要 etcd 呢?所有的分布式系统,都面临一个问题就是多节点之间数据共享问题,这个和团队协作的道理是一样的,成员可以分头干活,但是总需要共享一些信息。而 etcd 就是这样一个服务,用来共享同步信息。

        etcd 提供了如下能力:

  • etcd 提供存储以及获取数据的接口,它通过 Raft 协议保证 etcd 集群中多个节点数据的强一致性。
  • 提供监听机制,客户端可以监听某个 key 或者某些 key,用于监听和推送变更。
  • 提供 key 的过期及续约机制,客户端通过定时刷新来实现续约,用于集群监控以及服务注册发现。

        很多开源组件中都有使用 etcd 组件,如 Kubenetes、Service Mesh、TiDB 中的 PD等等,通过 etcd 来保证其核心功能的正常工作。

三、etcd架构

        etcd 的架构设计围绕以下几个组件展开,旨在提供一个高可用、强一致的分布式键值存储系统。

  • HTTP Server:这是 etcd 与外部世界的主要交互层,负责接受来自客户端的 API 请求(如请求、读取、更新、删除等操作),以及处理集群内部的同步心跳信息。它支持HTTP/1.1和gRPC协议,后者是etcd v3版本中推荐的通信方式。
  • raft模块:Raft 是 etcd 实现一致性保证的核心算法,它负责维护集群成员间的共识,确保数据的一致性和领导选举。每个 etcd 节点都是 Raft 协议中的一个成员,通过选举出领导者来处理所有客户端的写请求,并将更改复制到其他节点,保证数据的强一致性。
  • WAL:持久化日志模块,在 etcd 中,所有数据修改在提交到存储之前,都会先写入到预写日志(WAL)。这是一种持久化机制,即使在系统崩溃时也能保证数据不丢失。
  • Snapshot:etcd 会周期性的创建快照,以减少 WAL 文件数量,提高恢复速度。
  • MVCC:MVCC机制允许etcd在不影响并发读操作的情况下处理写请求。它为每个键值对维护了一个版本链,每个写操作都会生成一个新的版本,从而支持历史版本查询和并发控制。
  • gRPC Server:gRPC Server是etcd v3中用于处理客户端请求的高层框架,它提供了一种高效、跨语言的RPC机制,支持复杂的API调用如范围查询、事务处理等,且具有良好的性能和可扩展性。

四、etcd集成实践

        本地已经通过 Docker 安装了 etcd 的镜像,通过 Docker 启动 etcd 服务,命令如下:

docker run -it --name etcd-server -p 23790:2379 -p 23800:2380 -e ALLOW_NONE_AUTHENTICATION=yes -d bitnami/etcd 

        然后可以通过接口确认是否启动成功,可以检查一下版本,http://localhost:23790/version

返回的结果为:{etcdserver: "3.5.1",etcdcluster: "3.5.0"}。

        添加 etcd 依赖,项目其他依赖请自行添加

<dependency><groupId>io.etcd</groupId><artifactId>jetcd-core</artifactId><version>0.5.0</version>
</dependency>

        编写 etcd 配置类

@Configuration
public class EtcdConfig {@Beanpublic Client client() {// 这里简化直接写上etcd地址,应该写到配置中return Client.builder().endpoints("http://localhost:23790").build();}@Beanpublic KV kvClient(Client client) {return client.getKVClient();}}

        etcd 操作接口

@RestController
public class EtcdController {@Autowiredprivate KV kvClient;@RequestMapping("/etcd/get/data")public String getData(@RequestParam String key) throws ExecutionException, InterruptedException {GetResponse response = kvClient.get(ByteSequence.from(key.getBytes()), GetOption.DEFAULT).get();return new String(response.getKvs().get(0).getValue().getBytes());}@RequestMapping("/etcd/put/data")public String putData(@RequestParam String key, @RequestParam String value) throws ExecutionException, InterruptedException {PutResponse response = kvClient.put(ByteSequence.from(key.getBytes()), ByteSequence.from(value.getBytes())).get();return response.toString();}
}

        然后启动服务调用相关接口,就能看到相应的操作结果。

往期经典推荐

Sentinel与Nacos强强联合,构建微服务稳定性基石的重要实践-CSDN博客

Raft共识算法领导者选举流程揭秘-CSDN博客

Raft日志复制技术及成员变更原来是这样的_raft 日志-CSDN博客

云原生:Kubernetes下的Java应用部署实战详解_kubernetes 创建java微服务-CSDN博客

​​​​​​​决胜高并发战场:Redis并发访问控制与实战解析_redis并发控制-CSDN博客

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

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

相关文章

【Redis数据库】命令操作

文章目录 一、连接命令二、键命令 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f495;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01; &#x1f495;希望您在这里可以感受到一份轻松愉快的氛围&#xff01; &#x1f495;这里不仅可以获得有…

Arduino_ESP32_控制舵机运行【2024年】版

介绍 吧下面代码复制进去就可以使用了。 当然肯定不只是esp32基本上所有的Arduino都可以使用 然后接线的话信号线接到18号io口 然后其他的接电源正负极 图示 代码教程 #include <Arduino.h>// 定义舵机控制引脚 const int servoPin 18;// 定义舵机角度对应的脉宽范围 …

算法金 | 再见,PCA 主成分分析!

​大侠幸会&#xff0c;在下全网同名[算法金] 0 基础转 AI 上岸&#xff0c;多个算法赛 Top [日更万日&#xff0c;让更多人享受智能乐趣] 1. 概念&#xff1a;数据降维的数学方法 定义 主成分分析&#xff08;PCA&#xff09;是一种统计方法&#xff0c;通过正交变换将一组可…

RTOS笔记--任务状态与调度

任务状态 freertos中的任务分为四个状态&#xff1a;就绪状态&#xff08;ready&#xff09;、运行状态&#xff08;running&#xff09;、阻塞状态&#xff08;blocked&#xff09;、暂停状态&#xff08;suspended&#xff09; 完整的任务状态转换图&#xff1a; 在使用vTas…

24V转3V的高效解决方案-AH8610.sot23-6

24V转3V的高效解决方案-AH8610.sot23-6 ### 引言 随着电子设备向小型化、高性能和高效率发展&#xff0c;对电源管理芯片的要求也越来越高。AH8610.sot23-6是一款专为小型化电源转换设计的同步降压开关芯片&#xff0c;它能够将24V的输入电压转换为3V输出&#xff0c;适用于US…

风管静压箱的作用及选型

1.压力的种类 动压—由风速而产生的压力&#xff1b;空调厂家设计时均已经考虑&#xff0c;无需计算。静压—垂直作用于风管壁面的压力&#xff0c;用于克服风管阻力&#xff1b;所以&#xff0c;对于风管机组有零静压和带静压之分&#xff0c;零静压指静压为0Pa&#xff0c;不…

数学建模笔记

数学建模 定义角度 数学模型是针对参照某种事物系统的特征或数量依存关系&#xff0c;采用数学语言&#xff0c;概括地或近似地表述出的一种数学结构&#xff0c;这种数学结构是借助于数学符号刻画出来的某种系统的纯关系结构。从广义理解&#xff0c;数学模型包括数学中的各…

数据库开发-Mysql03

目录 1. 多表查询 1.1 概述 1.1.1 数据准备 1.1.2 介绍 1.1.3 分类 1.2 内连接 1.3 外连接 1.4 子查询 1.4.1 介绍 1.4.2 标量子查询 1.4.3 列子查询 1.4.4 行子查询 1.4.5 表子查询 1.5 案例 2. 事务 2.1 介绍 2.2 操作 2.3 四大特性 3. 索引 3.1 介绍 3…

实验室类管理平台LIMS系统的ui设计实例

实验室类管理平台LIMS系统的ui设计实例

第九十七节 Java面向对象设计 - Java Object.Finalize方法

Java面向对象设计 - Java Object.Finalize方法 Java提供了一种在对象即将被销毁时执行资源释放的方法。 在Java中&#xff0c;我们创建对象&#xff0c;但是我们不能销毁对象。 JVM运行一个称为垃圾收集器的低优先级特殊任务来销毁不再引用的所有对象。 垃圾回收器给我们一个…

weak的底层原理

weak 引用在 iOS 中通过维护一个全局的弱引用表来实现。当弱引用的对象被释放时&#xff0c;所有指向它的弱引用会被自动置为 nil&#xff0c;从而防止悬挂指针。 弱引用表&#xff08;Weak Table&#xff09;的键和值 理解弱引用表的键和值对于理解 weak 引用的底层机制非常重…

容器运行nslookup提示bash: nslookup: command not found【笔记】

在容器中提示bash: nslookup: command not found&#xff0c;表示容器中没有安装nslookup命令。 可以通过以下命令安装nslookup&#xff1a; 对于基于Debian/Ubuntu的容器&#xff0c;使用以下命令&#xff1a; apt-get update apt-get install -y dnsutils对于基于CentOS/R…

AI网络爬虫:用GraphQL查询爬取动态网页数据

任务&#xff1a;爬取网站www.skillshare.com搜索结果页面数据&#xff1a; 查看网站的请求信息&#xff1a; 请求网址: https://www.skillshare.com/api/graphql 请求方法: POST 状态代码: 200 OK 远程地址: 127.0.0.1:10809 引荐来源网址政策: strict-origin-when-…

一篇文章讲透数据结构之树and二叉树

一.树 1.1树的定义 树是一种非线性的数据结构&#xff0c;它是有n个有限结点组成的一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根在上&#xff0c;叶在下的。 在树中有一个特殊的结点&#xff0c;称为根结点&#xff0c;根结点…

免费工具扫描 Linux 中已知威胁

首发公众号网络研究观&#xff0c;关注获取更多。 卡巴斯基为 Linux 平台发布了一款名为 KVRT 的新病毒清除工具&#xff0c;允许用户免费扫描他们的系统并清除恶意软件和其他已知威胁。 尽管人们普遍误以为 Linux 系统本质上是安全的&#xff0c;不会受到威胁&#xff0c;但不…

如何使用Vuforia AR进行增强现实技术的开发?

前言 今天是坚持写博客的第17天&#xff0c;很高兴自己可以一直坚持下来。我们今天来讲讲怎么使用Vuforia AR进行增强现实的开发。 我们需要在今天的开发中用到Vuforia AR和2018版的Unity3d 什么是Vuforia AR Vuforia AR是基于实时计算摄影机影像的位置及角度&#xff0c;并…

Kubernetes ingress

目录 一.ingress 1.ingress简介 2.实现外部应用能访问内部集群服务的方法 &#xff08;1&#xff09;NodePort&#xff1a; &#xff08;2&#xff09;LoadBalancer&#xff1a; &#xff08;3&#xff09;externalIPs&#xff1a; &#xff08;4&#xff09;ingress&am…

【会议征稿,ACM独立出版】第三届机器人、人工智能与信息工程国际学术会议(RAIIE 2024,7月05-07)

2024年第二届机器人、人工智能与信息工程国际学术会议&#xff08;RAIIE 2024&#xff09;将于2024年7月5-7日在新加坡举行。本次会议主要围绕“机器人”、“智能仿生”和“信息科学”的最新研究进展展开&#xff0c;会议汇聚了该领域内国际学者、专家、研究人员及相关从业人员…

274 基于matlab的随机粗糙表面对微气体轴承内气体压强分布的影响

基于matlab的随机粗糙表面对微气体轴承内气体压强分布的影响。采用差分法求解气体轴承的雷诺方程&#xff0c;通过尺寸参数、分形维数对粗糙度表面设置&#xff0c;滑流参数设置&#xff0c;实现气压分布可视化结果显示。程序已调通&#xff0c;可直接运行。 274 气体轴承 随机…

基于websocket与node搭建简易聊天室

一、前言 上一篇文章介绍了websocket的详细用法与工具类的封装&#xff0c;本篇就基于websocket搭建一个简易实时的聊天室。 在本篇开始之前也可以去回顾一下websocket详细用法&#xff1a;WebSocket详解与封装工具类 二、基于node搭建后台websocket服务 首先确认本机电脑中…