etcd之etcd简介和安装(一)

news2024/11/13 9:24:54

1、etcd简介

1.1 etcd简介

etcd 是开源的、高可用的分布式key-value存储系统,可用于配置共享和服务的注册和发现,它专注于:

  • 简单:定义清晰、面向用户的API(gRPC)

  • 安全:可选的客户端TLS证书自动认证

  • 快速:支持每秒10,000次写入

  • 可靠:基于Raft算法确保强一致性

etcd地址:https://github.com/etcd-io/etcd

etcd官方文档:https://etcd.io/docs/v3.4/dev-guide/interacting_v3/

etcd官方文档中文版:https://doczhcn.gitbook.io/etcd/

1.2 etcd与redis差异

etcd和redis都支持键值存储,也支持分布式特性,redis支持的数据格式更加丰富,但是他们两个定位和应用场景

不一样,关键差异如下:

  • redis在分布式环境下不是强一致性的,可能会丢失数据,或者读取不到最新数据

  • redis的数据变化监听机制没有etcd完善

  • etcd强一致性保证数据可靠性,导致性能上要低于redis

  • etcd和ZooKeeper是定位类似的项目,跟redis定位不一样

1.3 为什么用 etcd 而不用ZooKeeper?

相较之下,ZooKeeper有如下缺点:

  • 复杂:ZooKeeper的部署维护复杂,管理员需要掌握一系列的知识和技能;而 Paxos 强一致性算法也是素来

    以复杂难懂而闻名于世;另外,ZooKeeper的使用也比较复杂,需要安装客户端,官方只提供了 Java 和 C 两

    种语言的接口。

  • 难以维护:Java 编写。这里不是对 Java 有偏见,而是 Java 本身就偏向于重型应用,它会引入大量的依赖。而

    运维人员则普遍希望保持强一致、高可用的机器集群尽可能简单,维护起来也不易出错。

  • 发展缓慢:Apache 基金会项目特有的“Apache Way”在开源界饱受争议,其中一大原因就是由于基金会庞大的

    结构以及松散的管理导致项目发展缓慢。

而 etcd 作为一个后起之秀,其优点也很明显。

  • 简单:使用 Go 语言编写部署简单;使用 HTTP 作为接口使用简单;使用 Raft 算法保证强一致性让用户易于

    理解。

  • 数据持久化:etcd 默认数据一更新就进行持久化。

  • 安全:etcd 支持 SSL 客户端安全认证。

1.4 应用场景

根据以上特性和API,etcd有应用场景以下应用场景:

1.4.1 场景一:服务发现

服务发现要解决的也是分布式系统中最常见的问题之一,即在同一个分布式集群中的进程或服务,要如何才能找到

对方并建立连接。本质上来说,服务发现就是想要了解集群中是否有进程在监听 udp 或 tcp 端口,并且通过名字

就可以查找和连接。

1.4.2 场景二:配置中心

etcd的应用场景优化都是围绕存储的东西是"配置"来设定的。

  • 配置的数据量通常都不大,所以默认etcd的存储上限是1GB

  • 配置通常对历史版本信息是比较关心的,所以etcd会保存版本(revision) 信息

  • 配置变更是比较常见的,并且业务程序会需要实时知道,所以etcd提供了watch机制,基本就是实时通知配置

    变化

  • 配置的准确性一致性极其重要,所以etcd采用raft算法,保证系统的CP

  • 同一份配置通常会被大量客户端同时访问,针对这个做了grpc proxy对同一个key的watcher做了优化

  • 配置会被不同的业务部门使用,提供了权限控制和namespace机制

1.4.3 场景三:负载均衡

此处指的负载均衡均为软负载均衡,分布式系统中,为了保证服务的高可用以及数据的一致性,通常都会把数据和

服务部署多份,以此达到对等服务,即使其中的某一个服务失效了,也不影响使用。由此带来的坏处是数据写入性

能下降,而好处则是数据访问时的负载均衡。因为每个对等服务节点上都存有完整的数据,所以用户的访问流量就

可以分流到不同的机器上。

1.4.4 场景四:分布式锁

因为 etcd 使用 Raft 算法保持了数据的强一致性,某次操作存储到集群中的值必然是全局一致的,所以很容易实现

分布式锁。

1.4.5 场景五:集群监控与 Leader 竞选

通过 etcd 来进行监控实现起来非常简单并且实时性强。

  • 前面几个场景已经提到 Watcher 机制,当某个节点消失或有变动时,Watcher 会第一时间发现并告知用户。

  • 节点可以设置TTL key,比如每隔 30s 发送一次心跳使代表该机器存活的节点继续存在,否则节点消失。

这样就可以第一时间检测到各节点的健康状态,以完成集群的监控要求。

另外,使用分布式锁,可以完成Leader竞选。这种场景通常是一些长时间CPU计算或者使用IO操作的机器,只需

要竞选出的 Leader 计算或处理一次,就可以把结果复制给其他的 Follower。从而避免重复劳动,节省计算资源。

1.4.6 场景六:消息发布与订阅

在分布式系统中,最适用的一种组件间通信方式就是消息发布与订阅。即构建一个配置共享中心,数据提供者在这

个配置中心发布消息,而消息使用者则订阅他们关心的主题,一旦主题有消息发布,就会实时通知订阅者。通过这

种方式可以做到分布式系统配置的集中式管理与动态更新。

1.4.7 场景七:分布式通知与协调

用到了 etcd 中的 Watcher 机制,通过注册与异步通知机制,实现分布式环境下不同系统之间的通知与协调,从而

对数据变更做到实时处理。实现方式通常是这样:不同系统都在 etcd 上对同一个目录进行注册,同时设置

Watcher 观测该目录的变化(如果对子目录的变化也有需要,可以设置递归模式),当某个系统更新了 etcd 的目

录,那么设置了 Watcher 的系统就会收到通知,并作出相应处理。

1.4.8 场景八:分布式队列

分布式队列的常规用法与场景五中所描述的分布式锁的控制时序用法类似,即创建一个先进先出的队列,保证顺

序。

2、etcd安装

2.1 windows下安装

2.1.1 下载安装包

下载地址:https://github.com/etcd-io/etcd/releases/

这里下载 etcd-v3.5.5-windows-amd64

2.1.2 解压缩

将下载的安装包进行解压:

在这里插入图片描述

2.1.3 环境变量配置

D:\DecompressionSoftwareInstall\etcd-v3.5.5-windows-amd64添加到Path环境变量中。

2.1.4 测试
$ etcd  -version
etcd Version: 3.5.5
Git SHA: 19002cfc6
Go Version: go1.16.15
Go OS/Arch: windows/amd64

正常显示etcd版本信息,则证明安装成功。

2.2 Linux下安装

2.2.1 下载安装包

下载地址:https://github.com/etcd-io/etcd/releases/

这里下载 etcd-v3.5.5-linux-amd64.tar.gz

2.2.2 解压压缩包
$ tar -zxvf etcd-v3.5.5-linux-amd64.tar.gz
[root@zsx etcd-v3.5.5-linux-amd64]# ll
total 56472
drwxr-xr-x. 3 528287 89939       40 Sep 15 20:03 Documentation
-rwxr-xr-x. 1 528287 89939 23760896 Sep 15 20:03 etcd
-rwxr-xr-x. 1 528287 89939 17960960 Sep 15 20:03 etcdctl
-rwxr-xr-x. 1 528287 89939 16031744 Sep 15 20:03 etcdutl
-rw-r--r--. 1 528287 89939    42066 Sep 15 20:03 README-etcdctl.md
-rw-r--r--. 1 528287 89939     7359 Sep 15 20:03 README-etcdutl.md
-rw-r--r--. 1 528287 89939     9394 Sep 15 20:03 README.md
-rw-r--r--. 1 528287 89939     7896 Sep 15 20:03 READMEv2-etcdctl.md
2.2.3 环境变量配置

etcdetcdctl文件复制到已经配置了环境变量的目录中:

  • 方法一:把etcdetcdctl文件复制到GOBIN目录下。
  • 方法二:在环境变量里添加etcdetcdctl文件所在的目录。
  • 方法三:将etcdetcdctl二进制文件复制到/usr/local/bin目录。
$ cp etcd etcdctl /usr/local/bin
2.2.4 测试
[root@zsx ~]# etcd --version
etcd Version: 3.5.5
Git SHA: 19002cfc6
Go Version: go1.16.15
Go OS/Arch: linux/amd64

正常显示etcd版本信息,则证明安装成功。

2.3 将etcd部署为服务

1、创建数据存储目录:

$ mkdir -p /usr/local/etcd/data

2、创建配置文件/usr/local/etcd/conf.yml

name: etcd01
data-dir: /usr/local/etcd/data
initial-advertise-peer-urls: http://192.168.165.195:2380
listen-peer-urls: http://192.168.165.195:2380
listen-client-urls: http://192.168.165.195:2379,http://127.0.0.1:2379
advertise-client-urls: http://192.168.165.195:2379
initial-cluster-token: etcd01
initial-cluster: etcd01=http://192.168.165.195:2380
initial-cluster-state: new

配置参数解析:

  • name:当前etcd节点名称。

  • data-dir:数据存储目录。

  • initial-advertise-peer-urls:集群的其他节点通过该地址与当前节点通信。

  • listen-peer-urls:当前节点通过该地址监听集群其他节点发送的信息。

  • listen-client-urls:当前节点通过该地址监听客户端发送的信息。

  • advertise-client-urls:客户端通过该地址与当前节点通信

  • initial-cluster-token:用于区分不同的集群,同一集群的所有节点配置相同的值。

  • initial-cluster:当前集群的所有节点信息,当前节点根据此信息与其他节点取得联系。

  • initial-cluster-state: 本次是否为新建集群,有两个取值:new和existing。

3、创建服务配置文件/usr/lib/systemd/system/etcd.service

[Unit]
Description=etcd
After=network.target
 
[Service]
Type=notify
ExecStart=/usr/local/bin/etcd --config-file=/usr/local/etcd/conf.yml
 
[Install]
WantedBy=multi-user.target

4、启动服务:

$ systemctl daemon-reload
$ systemctl start etcd.service

5、查看服务是否启动成功:

[root@zsx demo]# systemctl status etcd.service
● etcd.service - etcd
   Loaded: loaded (/usr/lib/systemd/system/etcd.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2023-02-16 21:09:24 CST; 23s ago
 Main PID: 106654 (etcd)
    Tasks: 7
   Memory: 7.3M
   CGroup: /system.slice/etcd.service
           └─106654 /usr/local/bin/etcd --config-file=/usr/local/etcd/conf.yml
......

6、设置服务为开机自启动:

$ systemctl enable etcd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/etcd.service to /usr/lib/systemd/system/etcd.service.

7、测试:

$ etcd --version
etcd Version: 3.5.5
Git SHA: 19002cfc6
Go Version: go1.16.15
Go OS/Arch: linux/amd64
$ etcdctl member list
7c30ae572716ee16, started, etcd01, http://192.168.165.195:2380, http://192.168.165.195:2379, false
$ etcdctl --endpoints=http://192.168.165.195:2380 endpoint health
http://192.168.165.195:2380 is healthy: successfully committed proposal: took = 3.097752ms

8、开启鉴权

添加root用户:

在开启鉴权之前必须先创建root用户,否则无法启用身份认证功能。etcd默认创建root用户时即创建了root角色,

并为其绑定了该角色,该角色拥有所有权限。

$ etcdctl user add root
Password of root:root
Type password of root again for confirmation:root
User root created

开启鉴权:

$ etcdctl auth enable
{"level":"warn","ts":"2023-02-16T21:16:58.919+0800","logger":"etcd-client","caller":"v3/retry_interceptor.go:62","msg":"retrying of unary invoker failed","target":"etcd-endpoints://0xc0002dca80/127.0.0.1:2379","attempt":0,"error":"rpc error: code = FailedPrecondition desc = etcdserver: root user does not have root role"}
Authentication Enabled

验证:

开启鉴权后,客户端请求etcd server需要使用选项--user带上用户名和密码,否则会报错。

$ etcdctl --endpoints=http://192.168.165.195:2380 endpoint health
{"level":"warn","ts":"2023-02-16T21:18:46.005+0800","logger":"client","caller":"v3/retry_interceptor.go:62","msg":"retrying of unary invoker failed","target":"etcd-endpoints://0xc0002dca80/192.168.165.195:2380","attempt":0,"error":"rpc error: code = InvalidArgument desc = etcdserver: user name is empty"}
http://192.168.165.195:2380 is unhealthy: failed to commit proposal: etcdserver: user name is empty
Error: unhealthy cluster
$ etcdctl --endpoints=http://192.168.165.195:2380 endpoint health --user=root:root
http://192.168.165.195:2380 is healthy: successfully committed proposal: took = 416.916µs

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

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

相关文章

uni-app功能 1. 实现点击置顶,滚动吸顶2.swiper一个轮播显示一个半内容且实现无缝滚动3.穿透修改uni-ui的样式

uni-app项目中遇到的功能 文章目录 uni-app项目中遇到的功能一、实现点击置顶,滚动吸顶、1.1、scroll-view设置不生效的原因和解决办法1.2 功能代码 二、swiper一个轮播显示一个半内容且实现无缝滚动三、穿透修改uni-ui的样式 一、实现点击置顶,滚动吸顶…

PMP--二模--解题--1-10

文章目录 4.整合管理--商业文件--商业论证(是否值得所需投资、高管们决策的依据)反映了:1、 [单选] 收到新项目的客户请求之后,项目经理首先应该做什么? 14.敏捷--角色--产品负责人PO–职责–1.创建待办列表并排序;2.确…

EmguCV学习笔记 VB.Net 12.3 OCR

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

MATLAB给一段数据加宽频噪声的方法(随机噪声+带通滤波器)

文章目录 引言方法概述完整代码:结果分析结论参考文献引言 在信号处理领域,添加噪声是模拟实际环境中信号传输时常见的操作。宽频噪声可以用于测试系统的鲁棒性和信号处理算法的有效性。本文将介绍如何使用 M A T L A B MATLAB MATLAB给一段数据添加宽频噪声,具体方法是结合…

漏洞挖掘 | Selenium Grid 中的 SSRF

Selenium 网格框架上的基本服务器端请求伪造 最近,我正在阅读漏洞文章看到Peter Jaric写的一篇 Selenium Grid 文章;他解释了 Selenium Grid 框架上缺乏身份验证和安全措施强化的问题。 在网上进行了更多搜索,我发现 Selenium Grid 开箱即用…

古诗词四首鉴赏

1、出自蓟北门行 唐李白 虏阵横北荒,胡星曜精芒。 羽书速惊电,烽火昼连光。 虎竹救边急,戎车森已行。 明主不安席,按剑心飞扬。 推毂出猛将,连旗登战场。 兵威冲绝漠,杀气凌穹苍。…

打开C嘎嘎的大门:你好,C嘎嘎!(1)

前言: 小编在学习完一些数据结构以后,终于,我还是来到了这一步,开始学习我小学就听说过的C,至于为什么标题写的C嘎嘎,因为小编觉着这样好念而且有意思,今天是小编学习C嘎嘎的第一天,…

零信任安全架构--最小权限原则

最小权限原则(Principle of Least Privilege, PoLP)是零信任安全架构中的核心理念之一,旨在确保用户、设备、应用等系统实体只拥有完成其任务所必需的最低权限,避免不必要的权限扩展,从而降低安全风险。 1. 概念 最小…

LabVIEW闪退

LabVIEW闪退或无法启动可能由多个原因引起,特别是在使用了一段时间后突然发生的问题。重启电脑后 LabVIEW 和所有 NI 软件都无法打开,甚至在卸载和重装时也没有反应。这种情况通常与系统环境、软件冲突或 NI 软件组件的损坏有关。 1. 检查系统和软件冲突…

Arthas dashboard(当前系统的实时数据面板)

文章目录 二、命令列表2.1 jvm相关命令2.1.1 dashboard(当前系统的实时数据面板) 二、命令列表 2.1 jvm相关命令 2.1.1 dashboard(当前系统的实时数据面板) 使用场景: 在 Arthas 中,dashboard 命令用于提…

echarts实现地图下钻并解决海南群岛显示缩略图

一、准备工作 1、echarts版本: ^5.5.1 2、去掉海南数据的json文件 二、获取删除过后的json文件 1、DataV.GeoAtlas地理小工具系列 (aliyun.com) 在网站输入这个复制的,新建一个json文件粘贴进去。 接下来需要删除两个地方,不要删错&…

前端vue-关于标签切换的实现

首先是循环,使用v-for“(item,index) in list” :key“item.id” 然后当点击哪个的时候再切换,使用v-bind:class" "或者是:class" ",如果都是用active的话,那么每一个标签都是被选中的状态,…

[C高手编程] C语言宏、内置宏与预处理:深入理解与应用

💖💖⚡️⚡️专栏:C高手编程-面试宝典/技术手册/高手进阶⚡️⚡️💖💖 「C高手编程」专栏融合了作者十多年的C语言开发经验,汇集了从基础到进阶的关键知识点,是不可多得的知识宝典。如果你是即将…

TypeScript异常处理

1.异常的概念 程序运行中意外发生的情况就成为异常 例子: //除法运算function chu(num1:number,num2:number){if(num20){//throw 抛出异常throw new Error(除数不能为零)}let num:numbernum1/num2console.log(num) }//程序出现异常后会停止运行// 捕获异常try{ /…

《黑神话悟空》开发框架与战斗系统解析

本文主要围绕《黑神话悟空》的开发框架与战斗系统解析展开 主要内容 《黑神话悟空》采用的技术栈 《黑神话悟空》战斗系统的实现方式 四种攻击模式 连招系统的创建 如何实现高扩展性的战斗系统 包括角色属性系统、技能配置文件和逻辑节点的抽象等关键技术点 版权声明 本…

【他山之石】Humanize AI 简介

Humanize AI 简介 Humanize AI 官方首页截图 文章目录 Humanize AI 简介1 Humanize AI 是什么2 Humanize AI 能做什么3 Humanize AI 怎么用4 Humanize AI 怎么收费5 结论 1 Humanize AI 是什么 数字时代的当下,AI 人工智能已成为内容创作不可或缺的一部分。从生成文…

poi-tl的详细教程(动态表格、单元格合并)

前提了解poi-tl 链接: springboot整合poi-tl 创建word模板 实现效果 代码实现 ServerTableData import com.deepoove.poi.data.RowRenderData;import java.util.List;public class ServerTableData {/*** 携带表格中真实数据*/private List<RowRenderData> serverDat…

【Python常用模块】_PyMySQL模块详解

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)教程合集 👈👈…

window.open()地址栏隐藏问题解决方案

问题 使用window.open打开一个页面时&#xff0c;想要隐藏地址栏&#xff0c;但是无效。 window.open (test.html,newwindow,height100,width400,top0,left0,toolbarno,menubarno,scrollbarsno, resizableno,locationno, statusno)由于浏览器区别和安全问题&#xff0c;浏览器…

最新动态一致的文生视频大模型FancyVideo部署

FancyVideo是一个由360AI团队和中山大学联合开发并开源的视频生成模型。 FancyVideo的创新之处在于它能够实现帧特定的文本指导&#xff0c;使得生成的视频既动态又具有一致性。 FancyVideo模型通过精心设计的跨帧文本引导模块&#xff08;Cross-frame Textual Guidance Modu…