云原生下的数据协调艺术: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 {

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

    @Bean
    public KV kvClient(Client client) {
        return client.getKVClient();
    }

}

        etcd 操作接口

@RestController
public class EtcdController {

    @Autowired
    private 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博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1790java网络学习平台Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java网络学习平台系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了java设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&…

17、Spring系列-SpringMVC-请求源码流程

前言 Spring官网的MVC模块介绍&#xff1a; Spring Web MVC是基于Servlet API构建的原始Web框架&#xff0c;从一开始就已包含在Spring框架中。正式名称“ Spring Web MVC”来自其源模块的名称&#xff08;spring-webmvc&#xff09;&#xff0c;但它通常被称为“ Spring MVC…

规则引擎-Easy rule

规则引擎-Easy rule 最近有几个项目中都出现了根据XX条件执行XX方法的业务&#xff0c;在动手之前脑中总会下意识的发现如果按照常规的去写代码&#xff0c;无论使用何种设计模式&#xff0c;都会出现不同程度上的代码冗余或大量if-else判断。 甚至说判断XX条件的代码和执行X…

ubuntu20.04中设置包含ros节点的文件自启动

若文件里包含了ros话题的发布和接收&#xff0c;那么设置自启动时&#xff0c;应该首先将roscore设置为自启动。 首先确保roscore有一个systemd服务文件。如果还没有&#xff0c;需要在/etc/systemd/system/下创建一个。例如&#xff0c;一个基本的roscore.service文件可能如下…

IO进程线程(六)进程

文章目录 一、进程状态&#xff08;二&#xff09;进程状态切换实例1. 实例1 二、进程的创建&#xff08;一&#xff09;原理&#xff08;二&#xff09;fork函数--创建进程1. 定义2. 不关注返回值3. 关注返回值 &#xff08;三&#xff09; 父子进程的执行顺序&#xff08;四&…

OCP 备份 OceanBase集群

注:OCP版本为4.2.1,OceanBase版本为 社区版4.2.1.0 手动备份 进行合并 在手动进行备份数据之前&#xff0c;建议进行一次OB集群合并(不影响业务的前提下)&#xff0c;关于合并的概念请参考OB官网。 点击进入要备份的OB集群 点击左侧工具栏中的 合并管理&#xff0c;在 基本信息…

【前端基础】CSS介绍|CSS选择器|常用CSS

目录 一、CSS介绍 1.1 什么是CSS 1.2 基本语法规范 1.3 引⼊⽅式 1.4 规范 &#x1f4a1;二、CSS选择器 1. 标签选择器 2. class选择器 3. id选择器 4. 复合选择器 5. 通配符选择器 三、常用CSS 3.1 color 3.2 font-size 3.3 border 3.4 width/height 3.5 padd…

安全生产新篇章:可燃气体报警器检验周期的国家标准解读

随着工业化进程的加快&#xff0c;安全生产成为了重中之重。 可燃气体报警器作为预防火灾和爆炸事故的重要设备&#xff0c;其准确性和可靠性直接关系到企业的生产安全和员工的生命财产安全。 因此&#xff0c;国家对可燃气体报警器的检验周期有着明确的规定&#xff0c;以确…

密塔AI:联网搜索工具,可以搜索科研文献

文章目录 简介功能探究 简介 作为联网搜索AI&#xff0c;肯定得有能力做个自我介绍&#xff0c;在搜索框中输入“密塔AI简介”&#xff0c;其处理过程如下&#xff0c;看来主打一个没有广告&#xff0c;直达结果。 回复如下 秘塔AI搜索(metaso.cn)于2024年初上线&#xff0c;它…

若依 ruoyi-vue element-ui el-cascader 级联选择器 选择任意一级选项,去掉单选按钮,选中点击后隐藏

Cascader 级联选择器 选择任意一级选项&#xff0c;去掉单选按钮。 这兄弟文章写的可以&#xff0c;查了一堆文章&#xff0c;基本搞完才发现。 官方的例子不支持选中后自动关闭&#xff0c;要点击旁边空白&#xff0c;并且单选框太小了。 <el-form-item label"所属地…

CSS双飞翼布局

双飞翼布局是一种经典的CSS布局模式&#xff0c;主要用于实现左右两列固定宽度&#xff0c;中间列自适应的布局。 比如&#xff1a;写一个左中右布局占满全屏&#xff0c;其中左、右两块固定宽 200px&#xff0c;中间自适应&#xff0c;要求先加载中间块。 <!DOCTYPE html…

一文看懂llama2(原理模型训练)

自从Transformer架构问世以来&#xff0c;大型语言模型&#xff08;Large Language Models, LLMs&#xff09;以及AIGC技术的发展速度惊人&#xff0c;它们不仅在技术层面取得了重大突破&#xff0c;还在商业应用、社会影响等多个层面展现出巨大潜力。随着ChatGPT的推出&#x…

Nginx02-Nginx虚拟主机介绍、日志介绍、Location规则介绍

目录 写在前面NginxNginx处理用户请求流程虚拟主机虚拟主机的分类基于域名的虚拟主机基于端口的虚拟主机基于IP的虚拟主机 Nginx日志错误日志案例 访问日志访问格式变量案例 Location规则案例1案例2Location规则小结 写在前面 这是Nginx第二篇&#xff0c;内容为Nginx处理用户请…

【WEB系列】过滤器Filter

Filter&#xff0c;过滤器&#xff0c;属于Servlet规范&#xff0c;并不是Spring独有的。其作用从命名上也可以看出一二&#xff0c;拦截一个请求&#xff0c;做一些业务逻辑操作&#xff0c;然后可以决定请求是否可以继续往下分发&#xff0c;落到其他的Filter或者对应的Servl…

mysql中optimizer trace的作用

大家好。对于MySQL 5.6以及之前的版本来说&#xff0c;查询优化器就像是一个黑盒子一样&#xff0c;我们只能通过EXPLAIN语句查看到最后 优化器决定使用的执行计划&#xff0c;却无法知道它为什么做这个决策。于是在MySQL5.6以及之后的版本中&#xff0c;MySQL新增了一个optimi…

量化投资分析平台 迅投 QMT(三)字典数据下载后读取成Dataframe形式

量化投资分析平台 迅投 QMT [迅投 QMT](https://www.xuntou.net/?user_code7NYs7O)我目前在使用如何读取下载好的数据出来上代码历史帖子 迅投 QMT 我目前在使用 两个月前&#xff08;2024年4月&#xff09;迅投和CQF有一个互动的活动&#xff0c;进行了平台的一个网上路演&…

初始C++(类与对象)

感谢大佬的光临各位&#xff0c;希望和大家一起进步&#xff0c;望得到你的三连&#xff0c;互三支持&#xff0c;一起进步 个人主页&#xff1a;LaNzikinh-CSDN博客 文章目录 前言一.引用二.内联函数三.类和对象总结 前言 之前讲c的命令空间和第一个程序的运行&#xff0c;继…

adb shell service命令与SurfaceFlinger调试

“ 在Android上有丰富的shell命令便于开发者用来调试程序&#xff0c;非常方便&#xff0c;本文简单说明下service命令的用法。” 01 基本用法 首先看一下使用说明&#xff0c;带上参数-h 或 -&#xff1f; $ adb shell service -h Usage: service [-h|-?]service listservi…

STM32 MDK Keil5软件调试功能使用(无需连接硬件)

MDK Keil5 在线仿真STM32&#xff08;无需连接硬件&#xff09; 首先点击工具栏的魔术棒配置一下&#xff1a;&#xff08;记得选择自己的STM32芯片类型&#xff09; 开启调试 使用逻辑分析仪查看IO输出 会打开这个界面&#xff0c;点击左边的setup按钮 会打开这个窗口&am…

交易量突破 3000 亿美元,去中心化衍生品协议 APX Finance 成最大的黑马?

“APX Finance 总交易量现已突破 3000 亿美元&#xff0c;已然成为链上衍生品赛道的主力军” 自 2021 年链上衍生品市场进入萌芽期以来&#xff0c;该板块始终保持着较高的市场增速&#xff0c;即便如此该领域仍旧存在极大的发展空间。一方面&#xff0c;衍生品板块交易量目前占…