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

etcd入门到实战

概述:本文将介绍etcd特性、使用场景、基本原理以及Linux环境下的实战操作

入门

什么是etcd?

etcd是一个分布式键值存储数据库

关键字解析:

  • 键值存储存储协议是 key—value 的形式,类似于redis
  • 分布式:具有分布式特性、每个etcd实例作为集群中的一个节点,通过分布式锁, leader选举保障可靠的分布式协同
  • 数据库持久化存储、与redis的主内存存储不同,etcd主持久化到磁盘,同MySQL

etcd的特性

1.强一致性,通过Raft共识算法保证集群中各节点数据的一致性,这是etcd最重要特点

2.全量复制,集群中每个节点拥有全量数据,这也是强一致性的体现

3.数据结构仅支持字符串格式

4.性能,单节点支持1000次/秒 写操作,2000次/秒 读操作(远低于redis的10w+8w)

使用场景

从etcd的性能指标发现,单从性能考虑,etcd远不如redis,那么etcd有什么过人之处呢?

1.服务注册与服务发现

在一些由多服务模块组成的大型项目中,例如即时通讯项目,一般有login_server,msg_server,route_server,file_server等各个分工不同的server,这些server之间有互相连接通信的需求,而连接就需要获知对方的ip+port,如何获知呢?

a.第一种方式是把所有server的地址写在配置文件中,也就是写死在代码中的方式

b.将所有server的地址保存在另一个server中,也就是加一层注册中心,支持动态删减

而etcd正适合作为服务的注册和发现中心etcd的各个节点保证的强一致性可以确保在访问不同节点时,得到的同一份数据是完全相同的,这对服务间的协同是必要的

2.分布式选主

etcd通过部署多个节点组成集群,集群中分为一个leader和剩下的follower。来自客户端的写请求全部由leader节点处理,读请求全部由follower节点处理。不管是leader还是follower节点都会有失效的情况,也就是服务挂掉了。

  • 如何获知节点挂掉了?

    leader节点会定时向所有follower节点发生心跳,表明自己还在工作,而follower节点则会响应心跳,表明自己也尚存活,任有一方长时间没有得到对方的相应,则认为对方失效

Leader 节点失效时的行为

如果集群的 Leader 节点失效,etcd 的行为如下:

3.1 Leader 检测失效
  • 当集群中的 Follower 节点未能在规定时间(称为 election timeout)内收到 Leader 的心跳时,认为 Leader 失效,开始进入 选举阶段
3.2 选举新 Leader
  • 在选举阶段,所有 Follower 节点会随机等待一段时间(称为随机延迟),之后尝试成为新 Leader,这一过程称为 候选人状态
  • 候选人会向其他节点发送投票请求(RequestVote),询问它们是否同意将自己选为新 Leader。
  • 当某个候选人得到集群中大多数节点(即 Quorum,N/2 + 1)的投票支持后,它会成为新的 Leader。
  • 成为 Leader 后,它会开始向其他节点发送心跳,并继续接管客户端的写请求。
3.3 数据一致性保障
  • 选举过程中,etcd 使用 Raft 的一致性协议确保所有节点的日志保持一致。只有当候选人确认自己拥有最新的日志记录时,才能成为新的 Leader。
  • 这避免了一个拥有落后数据的节点被选为 Leader,从而导致数据不一致的问题。
3.4 Leader 重新恢复
  • 如果失效的 Leader 节点重新上线,它会以 Follower 的身份重新加入集群,不会自动恢复成 Leader。新 Leader 会通过日志复制的方式将其与集群的最新数据同步。

Follower 节点失效时的行为

如果 Follower 节点失效,etcd 集群的行为如下:

4.1 失效 Follower 检测
  • Leader 通过心跳和日志同步来检测 Follower 是否失效。如果 Leader 发现某个 Follower 不响应,它会将该节点标记为不健康,并停止向该节点发送日志更新。
4.2 失效 Follower 不影响集群可用性
  • etcd 集群依赖 Quorum(大多数派)来保持正常运行,因此只要集群中有足够多的节点(N/2 + 1)在线,失效的 Follower 节点不会影响整个系统的可用性。
  • 举例来说,如果集群有 5 个节点,允许最多 2 个节点失效,集群依然能正常工作。
4.3 失效 Follower 恢复后
  • 一旦失效的 Follower 恢复,它会重新加入集群,并通过与 Leader 进行数据同步,获取最新的日志条目。Leader 会将它在失效期间未接收到的日志记录发送给它,确保其数据与其他节点一致。

  • 这个过程通常是透明的,客户端不会感知到。

3.读多写少的场景

etcd不同于redis的高性能,大量写操作会导致响应速度降低

Linux环境下 etcd实战

为了演示etcd的集群环境,本文使用docker部署etcd集群

环境:Ubuntu22.04

1.拉取etcd镜像

docker pull quay.io/coreos/etcd:v3.5.7

2.编写配置文件

存放路径:/home/w/conf/etcd

第一个节点 etcd0.yaml
# 节点名称
name: "etcdnode0"
# 数据存储目录
data-dir: "/etcd-data/data"
# 预写式日志存储目录
wal-dir: "/etcd-data/wal"
# 集群成员之间通讯使用URL
listen-peer-urls: "http://0.0.0.0:2380"
# 集群提供给外部客户端访问的URL,即外部客户端必须通过指定的IP加端口访问etcd
listen-client-urls: "http://0.0.0.0:2379"
#集群配置
initial-advertise-peer-urls: "http://192.168.62.128:2380"
# 集群初始成员配置,是etcd静态部署的核心初始化配置,它说明了当前集群由哪些URLs组成,此处default为节点名称
initial-cluster: "etcdnode0=http://192.168.62.128:2380,etcdnode1=http://192.168.62.128:12380,etcdnode2=http://192.168.62.128:22380"
# 初始化集群状态(new 或 existing)
initial-cluster-state: "new"
# 引导期间etcd集群的初始集群令牌,防止不同集群之间产生交互
initial-cluster-token: "etcd-cluster"
# 向客户端发布的服务端点
advertise-client-urls: "http://192.168.62.128:2379"
logger: "zap"
# 配置日志级别,仅支持 debug, info, warn, error, panic, or fatal
log-level: "warn"
log-outputs:
- "stderr"
第二个节点 etcd1.yaml
# 节点名称
name: "etcdnode1"
# 数据存储目录
data-dir: "/etcd-data/data"
# 预写式日志存储目录
wal-dir: "/etcd-data/wal"
# 集群成员之间通讯使用URL
listen-peer-urls: "http://0.0.0.0:12380"
# 集群提供给外部客户端访问的URL,即外部客户端必须通过指定的IP加端口访问etcd
listen-client-urls: "http://0.0.0.0:12379"
#集群配置
initial-advertise-peer-urls: "http://192.168.62.128:12380"
# 集群初始成员配置,是etcd静态部署的核心初始化配置,它说明了当前集群由哪些URLs组成,此处default为节点名称
initial-cluster: "etcdnode0=http://192.168.62.128:2380,etcdnode1=http://192.168.62.128:12380,etcdnode2=http://192.168.62.128:22380"
# 初始化集群状态(new 或 existing)
initial-cluster-state: "new"
# 引导期间etcd集群的初始集群令牌,防止不同集群之间产生交互
initial-cluster-token: "etcd-cluster"
# 向客户端发布的服务端点
advertise-client-urls: "http://192.168.62.128:12379"
logger: "zap"
# 配置日志级别,仅支持 debug, info, warn, error, panic, or fatal
log-level: "warn"
log-outputs:
- "stderr"
第三个节点 etcd2.yaml
# 节点名称
name: "etcdnode2"
# 数据存储目录
data-dir: "/etcd-data/data"
# 预写式日志存储目录
wal-dir: "/etcd-data/wal"
# 集群成员之间通讯使用URL
listen-peer-urls: "http://0.0.0.0:22380"
# 集群提供给外部客户端访问的URL,即外部客户端必须通过指定的IP加端口访问etcd
listen-client-urls: "http://0.0.0.0:22379"
#集群配置
initial-advertise-peer-urls: "http://192.168.62.128:22380"
# 集群初始成员配置,是etcd静态部署的核心初始化配置,它说明了当前集群由哪些URLs组成,此处default为节点名称
initial-cluster: "etcdnode0=http://192.168.62.128:2380,etcdnode1=http://192.168.62.128:12380,etcdnode2=http://192.168.62.128:22380"
# 初始化集群状态(new 或 existing)
initial-cluster-state: "new"
# 引导期间etcd集群的初始集群令牌,防止不同集群之间产生交互
initial-cluster-token: "etcd-cluster"
# 向客户端发布的服务端点
advertise-client-urls: "http://192.168.62.128:22379"
logger: "zap"
# 配置日志级别,仅支持 debug, info, warn, error, panic, or fatal
log-level: "warn"
log-outputs:
- "stderr"

3.创建并运行容器

!先关闭防火墙

sudo ufw disable

分别执行以下三条命令

#etcd0:
docker run -d -p 2379:2379 -p 2380:2380 \-v /home/w/conf/etcd:/etcd-conf \-v /tmp/etcd0-data:/etcd-data \--name etcd0 \quay.io/coreos/etcd:v3.5.7 \/usr/local/bin/etcd --config-file=/etcd-conf/etcd0.yaml#etcd1:
docker run -d -p 12379:12379 -p 12380:12380 \-v /home/w/conf/etcd:/etcd-conf \-v /tmp/etcd1-data:/etcd-data \--name etcd1 \quay.io/coreos/etcd:v3.5.7 \/usr/local/bin/etcd --config-file=/etcd-conf/etcd1.yaml#etcd2
docker run -d -p 22379:22379 -p 22380:22380 \-v /home/w/conf/etcd:/etcd-conf \-v /tmp/etcd2-data:/etcd-data \--name etcd2 \quay.io/coreos/etcd:v3.5.7 \/usr/local/bin/etcd --config-file=/etcd-conf/etcd2.yaml
检查节点运行状态
docker exec etcd0 /usr/local/bin/etcdctl endpoint health --cluster -w table
检查集群运行状态
docker exec etcd0 /usr/local/bin/etcdctl endpoint status --cluster -w table

4.操作etcd

1.添加一个key

docker exec etcd0 /usr/local/bin/etcdctl put key1 value1

2.获取一个key-value

docker exec etcd0 /usr/local/bin/etcdctl get key1

3.获取所有key-value

docker exec etcd0 /usr/local/bin/etcdctl get "" --prefix

4.删除一个key

docker exec etcd0 /usr/local/bin/etcdctl del key1

由于etcd集群各节点间数据完全同步,因此,在一个节点上的put操作可以在另一个节点上看到结果,此外,由于leader节点负责写操作,所以在follower节点上的写操作会被重定向到leader节点进行操作

点击获取更多Linux C/C++开发学习资料

相关文章:

etcd入门到实战

概述:本文将介绍etcd特性、使用场景、基本原理以及Linux环境下的实战操作 入门 什么是etcd? etcd是一个分布式键值存储数据库 关键字解析: 键值存储:存储协议是 key—value 的形式,类似于redis分布式:…...

Build an Android project and get a `.apk` file on a Debian 11 command line

You can build an Android project and get a .apk file on a Debian 11 command line without using Android Studio. The process involves using the Android SDK command-line tools (sdkmanager, adb, and gradle). Here’s a step-by-step guide to building the ???…...

解读 Java 经典巨著《Effective Java》90条编程法则,第4条:通过私有构造器强化不可实例化的能力

文章目录 【前言】欢迎订阅【解读《Effective Java》】系列专栏java.lang.Math 类的设计经验总结 【前言】欢迎订阅【解读《Effective Java》】系列专栏 《Effective Java》是 Java 开发领域的经典著作,作者 Joshua Bloch 以丰富的经验和深入的知识,全面…...

Vivado HLS学习

视频链接: 6课:数据类型的转换_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1bt41187RW?spm_id_from333.788.videopod.episodes&vd_sourcea75d5585c5297210add71187236ec90b&p6 目录 1.数据类型的转换 2.自动类型转换 2.1隐式数据转换 2.2…...

一款AutoXJS现代化美观的日志模块AxpLogger

简介 Axp Logger是一款基于autox.js的现代化日志模块,具备窗口事件穿透、拖拽和缩放功能。 Axp Logger文档 特性现代化的UI设计支持点击穿透模式(不影响脚本运行)监听音量-键切换模式支持窗口操作模式窗口拖拽移动窗口自由缩放清空日志关闭日…...

成都睿明智科技有限公司共创抖音电商新篇章

在当今这个数字化浪潮汹涌的时代,抖音电商以其独特的魅力迅速崛起,成为众多商家竞相追逐的新蓝海。在这片充满机遇与挑战的领域中,成都睿明智科技有限公司凭借其专业的服务、创新的策略和敏锐的市场洞察力,成为了众多商家信赖的合…...

Spark的安装配置及集群搭建

Spark的本地安装配置&#xff1a; 我们用scala语言编写和操作spark&#xff0c;所以先要完成scala的环境配置 1、先完成Scala的环境搭建 下载Scala插件&#xff0c;创建一个Maven项目&#xff0c;导入Scala依赖和插件 scala依赖 <dependency><groupId>org.scal…...

网络编程基础-IO模型深入理解

一、IO的基本概念 什么是IO&#xff1f; I/O就是计算机内存与外部设备之间拷贝数据的过程 什么是网络IO&#xff1f; 网络IO是指在计算机网络环境中进行的输入和输出操作&#xff0c;涉及数据在网络设备之间的传输。 网络IO操作可以是发送请求、接收响应、下载文件、传输数…...

go 语言学习路线图(一)

1. Go语言简介 Go语言的历史背景和设计理念Go的优势&#xff1a;简洁、高效、并发支持强Go的应用场景&#xff1a;微服务、云计算、系统编程 2. 开发环境设置 安装Go语言开发环境 在Windows、macOS、Linux系统上的安装方法 配置环境变量&#xff1a;GOROOT 和 GOPATH验证安装…...

前端自动化部署,Netlify免费满足你

1 Netlify 介绍 为什么推荐 Netliy &#xff0c; 主要还是穷&#xff0c;Netlify 免费太香了 Netlify you优势100GB 内免费 &#xff0c;满足个人日常 需求&#xff0c;操作,兼容性绑定代码仓库&#xff0c;提交代码自动部署 支持 github , gitlab 等 大多常用代码仓库易操作只…...

Linux的开发工具gcc Makefile gdb的学习

一&#xff1a;gcc/g 1. 1 背景知识 1. 预处理&#xff08;进行宏替换) 预处理 ( 进行宏替换 ) 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。 预处理指令是以#号开头的代码行。 实例: gcc –E hello.c –o hello.i 选项“-E”,该选项的作用是让 gcc 在预处理结…...

基于SSM出租车管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;车辆管理&#xff0c;驾驶员管理&#xff0c;基础数据管理&#xff0c;公告管理 驾驶员账号功能包括&#xff1a;系统首页&#xff0c;学生管理&#xff0c;车辆管理&#xff0c;公告管理 开发系统&a…...

iPhone照片内存怎么清理,参考这些方法

随着拍摄数量的增加&#xff0c;许多iPhone用户常常发现自己的手机存储空间不足&#xff0c;而照片无疑是占用空间的罪魁祸首之一。清理这些照片不仅能释放存储空间&#xff0c;还能提升设备的运行速度。小编将分享一些iPhone照片内存怎么清理的高效策略&#xff0c;助你告别冗…...

【Triton教程】向量相加

Triton 是一种用于并行编程的语言和编译器。它旨在提供一个基于 Python 的编程环境&#xff0c;以高效编写自定义 DNN 计算内核&#xff0c;并能够在现代 GPU 硬件上以最大吞吐量运行。 更多 Triton 中文文档可访问 →https://triton.hyper.ai/ 在本教程中&#xff0c;你将使…...

关于CSS中毛玻璃和滤镜使用总结

【1】毛玻璃 毛玻璃效果&#xff08;也称为磨砂玻璃效果&#xff09;可以通过 CSS 的 backdrop-filter 属性来实现。这个属性允许你在背景上应用各种滤镜效果&#xff0c;从而创建出类似磨砂玻璃的效果。这种效果通常用于创建半透明背景下的模糊效果&#xff0c;使得背景图像或…...

陷入产出危机的我聊聊近况

文章目录 前言我的多重身份作为IT网管作为运维人员作为Web开发人员作为游戏开发人员 总结 前言 在总结文章时&#xff0c;我把自己当做一个内容产出者&#xff0c;当这样一个身份进入每天按部就班的平稳状态时会陷入一种焦虑&#xff0c;产生一种居然没有什么可写的感觉&#…...

HarmonyOS 开发知识总结

1. HarmonyOS 开发知识总结 1.1. resources->base->media中不可以新建文件夹&#xff1f; 项目图片路径resources->base->media中不可以新建文件夹&#xff0c;图片全平级放里面&#xff0c;查找图片不方便&#xff0c;有没有什么其他的办法解决这个难点&#xff…...

[WPF初学到大神] 1. 什么是WPF, MVVM框架, XAML?

什么是WPF? WPF(Windows Presentation Foundation) 包含XAML标记语言和后端代码来开发桌面应用程序的. 用VS新建项目有WPF(.Net Framework和.Net应用程序), 该怎么选? 首选 .NET 应用程序(.NET Core 或 .NET 5/6/7/8新版本)拥有更好的性能、跨平台Windows, Linux, Mac支…...

matlab怎样自动搜索文件夹中的所有txt文件,并将每个txt文件中的数据存放到一个cell数组中——MATLAB批量处理数据

在使用MATLAB批量处理数据时&#xff0c;有时候需要自动搜索文件夹中的所有txt文件&#xff0c;并将每个txt文件中的数据存放到一个以一定规律命名的变量中&#xff0c;以便于后续通过循环处理每个变量数据。 然而&#xff0c;MATLAB并不支持在变量名中直接使用i来动态生成变量…...

LabVIEW智能可变温循环PCT测试系统

随着全球能源危机的加剧和环境保护需求的提升&#xff0c;开发和利用清洁能源已成为全球必然趋势。氢能作为一种高效的替代能源&#xff0c;正逐步受到关注。然而&#xff0c;储氢技术的研究至关重要&#xff0c;尤其是储氢材料的PCT&#xff08;Pressure-Composition-Temperat…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...

Django RBAC项目后端实战 - 03 DRF权限控制实现

项目背景 在上一篇文章中&#xff0c;我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统&#xff0c;为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...