当前位置: 首页 > 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…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...