ETCD 简介

ETCD 简介


1-etcd介绍

etcd 是 CoreOS 团队于 2013 年 6 月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。具有以下特点:

  • 简单:安装配置简单,而且提供了 HTTP API 进行交互,使用也很简单
  • 键值对存储:将数据存储在分层组织的目录中,如同在标准文件系统中
  • 监测变更:监测特定的键或目录以进行更改,并对值的更改做出反应
  • 安全:支持 SSL 证书验证
  • 快速:根据官方提供的 benchmark 数据,单实例支持每秒 2k+ 读操作
  • 可靠:采用 raft 算法,实现分布式系统数据的可用性和一致性

etcd 采用 Go 语言编写,它具有出色的跨平台支持,很小的二进制文件和强大的社区。 etcd 机器之间的通信通过 Raft 算法处理。

etcd 是一个高度一致的分布式键值存储,它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据。它可以优雅地处理网络分区期间的 leader 选举,以应对机器的故障,即使是在 leader 节点发生故障时。

从简单的 Web 应用程序到 Kubernetes 集群,任何复杂的应用程序都可以从 etcd 中读取数据或将数据写入 etcd。

2- 使用场景

etcd 比较多的应用场景是用于服务注册与发现,除此之外,也可以用于键值对存储,应用程序可以读取和写入 etcd 中的数据。

一个简单的用例是将数据库连接详细信息或功能标志存储在 etcd 中作为键值对。 可以观察这些值,使我们的应用在更改时可以重新配置自己。高级用法是利用 etcd 的一致性保证来实施数据库 leader 选举或在一组 follower 之间执行分布式锁定。

2.1 键值对存储

A highly-available key value store for shared configuration and service discovery.
一个用于配置共享和服务发现的键值存储系统。

归根结底,etcd 是一个键值存储的组件,其他的应用都是基于其键值存储的功能展开。etcd 的存储有如下特点:

  • 采用kv型数据存储,一般情况下比关系型数据库快。

  • 支持动态存储(内存)以及静态存储(磁盘)。

  • 分布式存储,可集成为多节点集群。

  • 存储方式,采用类似目录结构。

    • 只有叶子节点才能真正存储数据,相当于文件。
    • 叶子节点的父节点一定是目录,目录不能存储数据。
  • 在这里插入图片描述

2.2Etcd 数据结构与特性

Etcd 在其数据模型和组织结构上更接近于 ZooKeeper和对象存储,而不是 Redis。它使用层次化的键值对来存储数据,支持类似于文件系统路径的层次结构,能够很灵活地单 key 查询、按前缀查询、按范围查询。

Etcd 的核心数据结构

1.Key(键):Etcd 中的基本数据单元,类似于文件系统中的文件名。每个键都唯一标识一个值,并且可以包含子键,形成类似于路径的层次结构。

2.Value(值):与键关联的数据,可以是任意类型的数据,通常是字符串形式。只有 key、value,是不是比 Redis 好理解多了?我们可以将数据序列化后写入 value。

Etcd 有很多核心特性,其中,应用较多的特性是:

1.Lease(租约):用于对键值对进行 TTL 超时设置,即设置键值对的过期时间。当租约过期时,相关的键值对将被自动删除。

2.Watch(监听):可以监视特定键的变化,当键的值发生变化时,会触发相应的通知。

有了这些特性,我们就能够实现注册中心的服务提供者节点过期和监听了。
此外,Etcd 的一大优势就是能够保证数据的强一致性。
Etcd 如何保证数据一致性?

从表层来看,Etcd 支持事务操作,能够保证数据一致性。
从底层来看,Etcd 使用 Raft 一致性算法来保证数据的一致性,
Raft 是一种分布式一致性算法,它确保了分布式系统中的所有节点在任何时间点都能达成一致的数据视图。

具体来说,Raft 算法通过选举机制选举出一个领导者(Leader)节点,领导者负责接收客户端的写请求,并将写操作复制到其他节点上。当客户端发送写请求时,领导者首先将写操作写入自己的日志中,并将写操作的日志条目分发给其他节点,其他节点收到日志后也将其写入自己的日志中。一旦大多数节点(即半数以上的节点)都将该日志条目成功写入到自己的日志中,该日志条目就被视为已提交,领导者会向客户端发送成功响应。在领导者发送成功响应后该写操作就被视为已提交,从而保证了数据的一致性。

如果领导者节点宕机或失去联系,Raf 算法会在其他节点中 选举出新的领导者,从而保证系统的可用性和一致性。新的领导者会继续接收客户端的写请求,并负责将写操作复制到其他节点上,从而保持数据的一致性。

上面这段不理解也没关系,我们可以使用官方提供的 Etcd Playground 来可视化操作 Etcd,便于学习。

可视化学习地址

Playground 地址:

进入上述链接,首先可以看到如下图所示:可以看到存在5个节点,然后主节点是node2

在这里插入图片描述

试图停掉上述node2这个主节点,会在一段时间后,发现变成了node3主节点

在这里插入图片描述

有意思的是:在node3为主节点时,停止主节点,node4先变为主节点后续,存活的两个节点都不是在主节点或者从节点,且在一小段时间内,读取值的时候,显示 error: 504 - Gateway Timeout,并且无信息输出。

在这里插入图片描述

查阅资料后了解到,edtc存在两个节点的时候,应该还是会分配主从节点,但是出现这个问题的原因,我们不得而知

具体操作

和所有数据存储中间件一样,基本操作无非就是:增删改查

可以用可视化界面模拟操作,比如 write 写数据(更新数据)
在这里插入图片描述

read 读取操作

在这里插入图片描述

前缀读取

在这里插入图片描述

delete 删除

在这里插入图片描述

删除后查询

在这里插入图片描述

关于租约,监听等 后续再给大家进行演示。


至此,我们简介了ETCD基本的使用方式,

码字不易,希望大家能够一键三连🌝⭐🌟


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

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

相关文章

数据丢失不慌张,手机数据恢复一键解决!

如今手机已经成为我们生活中不可或缺的一部分。无论是工作、学习还是娱乐,手机都扮演着重要的角色。随着使用时间的增加,手机数据丢失的问题也时常发生。那么手机数据恢复有哪些方法呢?面对这种情况,先不要慌张,本文将…

神经元(科普)

Ⅰ 神经元简介 神经元即神经元细胞,是神经系统最基本的结构和功能单位。 分为细胞体和突起两部分。 细胞体由细胞核、细胞膜、细胞质组成,具有联络和整合输入信息并传出信息的作用。 突起有树突和轴突两种。树突短而分枝多,直接由细胞体…

MySQL数据库——22.复制表

MySQL 中复制表 是指创建一个与现有表具有相同结构和数据的新表。可以使用 CREATE TABLE ... SELECT 语句或者 CREATE TABLE ... LIKE 语句来复制表。下面是两种方法的示例: 1.使用 CREATE TABLE ... SELECT 语句: CREATE TABLE new_table_name SELECT…

雪深监测站解析-云境天合

TH-XS2雪深监测站是一种用于监测雪深的设备,它们分布在全国各地的关键区域,如高速公路、铁路沿线、机场等重要交通节点,以及山区、林区等易发生雪灾的地区。这些监测站就像是气象工作者的“眼睛”,时刻关注着雪情的变化&#xff0…

Python语言基础(简单入门)

一、Python是什么? Python是一种高级、通用、解释型的编程语言,由Guido van Rossum于1991年创建。它以简洁、易读的语法和强大的功能而闻名,有以下特点: 动态类型:Python是动态类型的语言,这意味着变量无需…

计算机毕业设计Python+Vue.js天气预测系统 中国气象质量采集与可视化 天气数据分析 天气可视化 天气大数据 天气爬虫 大数据毕业设计

摘要 随着科技技术的不断发展,人民物质生活质量不断提高,我们越来越关注身边的气象、空气等地理环境。对于普通居民我们会选择合适的气象进行出游,提高精神层面的生活质量;对于企业会关注气象变换状况,来定制相关的生产…

【微机原理及接口技术】8086/8088系统时序和微机总线

【微机原理及接口技术】8086/8088系统时序和微机总线 文章目录 【微机原理及接口技术】8086/8088系统时序和微机总线前言一、8086/8088引脚信号和工作模式1.8088 的两种组态模式2.最小组态的引脚信号3.最小组态的总线形成4.最大组态的总线形成 二、8086/8088典型时序1.三种周期…

【编程题-错题集】非对称之美(找规律 / 贪心)

牛客对应题目链接:非对称之美 (nowcoder.com) 一、分析题目 找规律: 判断是否全都是相同字符。判断本身是否是回文。 如果这个字符串每个字符相同,不存在非回文子串,直接返回 0。如果这个字符串不是回文,输出字符串长度…

临时有事无法及时签字盖章?试试用契约锁设置“代理人”

遇到“领导休假中、在开重要会议、外出考察或者主任医生手术中等”一段时间内不方便或者无法及时签字盖章的情况怎么办?业务推进不了只能干等? 契约锁电子签及印控平台支持印章、签名“临时授权”、“代理签署”,实现指定人、指定时间段、指定…

Python专题:二、Python小游戏,体验Python的魅力

希望先通过一个小的游戏让大家先对Python感兴趣,兴趣是最好的老师。 小游戏的运行结果: 1、在sublime编辑器里面写如下代码: import randomnum random.randint(1, 100) # 获得一个随机数 is_done False # 是否猜中的标记 count 0 # 玩…

整合 Java, Python 和 Scrapy 爬虫以传递和使用参数

这篇博客将详细说明如何从 Java 应用程序调用一个 Python 脚本,并在此过程中传递参数给一个 Scrapy 爬虫。最终目标是让 Java 控制爬虫的行为,如爬取数量和特定的运行参数。 一、Scrapy 爬虫的修改 首先,我们需要确保 Scrapy 爬虫能接收从命…

虹科Pico汽车示波器 | 免拆诊断案例 | 2010款凯迪拉克SRX车发动机无法起动

故障现象 一辆2010款凯迪拉克SRX车,搭载LF1发动机,累计行驶里程约为14.3万km。该车因正时链条断裂导致气门顶弯,大修发动机后试车,起动机运转有力,但发动机没有着机迹象;多起动几次,火花塞会变…

Python-VBA函数之旅-repr函数

目录 一、repr函数的常见应用场景 二、repr函数使用注意事项 三、如何用好repr函数? 1、repr函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页:https://blog.csdn.net/ygb_1024?spm1010.2135.…

阿里云VOD视频点播流程(1)

一、开通阿里云VOD 视频点播(ApsaraVideo VoD,简称VOD)是集视频采集、编辑、上传、媒体资源管理、自动化转码处理、视频审核分析、分发加速于一体的一站式音视频点播解决方案。登录阿里云,在产品找到视频点播VOD ,点击…

Java基础入门day44

day44 登录功能 代码实现 DBUtil.java package com.saas.util; ​ import java.sql.*; ​ public class DBUtil { ​private static final String DB_DRIVER "com.mysql.jdbc.Driver";private static final String DB_URL "jdbc:mysql://localhost:3306/saa…

数据结构复习/学习9--堆/堆实现/升降序建堆/top-k问题

一、堆与完全二叉树 1.堆的逻辑与物理结构 2.父节点与子节点的下标 3.大小根堆 二、堆的实现(大根堆为例) 注意事项总结: 注意堆中插入与删除数据的位置和方法与维持大根堆有序时的数据上下调整 三、堆排序 1.排升序建大堆效率高 注意事项…

Redis快速学习

Redis快速学习 一、 Redis快速入门1.1 初始Redis1.1.1 Redis的存储方式1.1.2 NoSQL 与 sql 之间的区别 1.2 Redis概述1.2.1 Redis是什么1.2.2 Redis有什么用1.2.3 Redis的特性 1.3 Redis安装测试1.3.1 Redis Linux安装 1.4 Redis测试工具1.5 Redis的基本知识 二、Redis的五大数…

HFSS-day3-HFSS的工作界面

工作界面也称为用户界面,是HFSS软件使用者的工作环境:了解、熟悉这个工作环境是掌握HFSS软件使用的第一步 HFSS工作环境介绍 1.HFSS工作界面简单的组成说明2.工作界面中各个工作窗口功能主菜单工具栏项目管理窗口属性窗口信息管理窗口进程窗口三维模型窗口 3.HFSS主…

gin自定义中间件

gin自定义中间件 代码 代码 package mainimport ("fmt""github.com/gin-gonic/gin""net/http""time" )// MyLogger 自定义中间件:方式二:通过定义函数,返回gin.HandlerFunc类型的函数,定…

解决vue elementUI el-tabs默认选项下划线不显示的问题

el-tabs初始加载时,el-tabs__active-bar的宽度为0,导致下划线不显示,因此设置其宽度即可: this.$nextTick((_) > {const activeBarElement document.getElementsByClassName("el-tabs__active-bar")[0];activeBarEl…