etcd 的安装与使用

介绍

Etcd 是一个 golang 编写的分布式、高可用的一致性键值存储系统,用于配置共享和服 务发现等。它使用 Raft 一致性算法来保持集群数据的一致性,且客户端通过长连接 watch 功能,能够及时收到数据变化通知,相较于 Zookeeper 框架更加轻量化。以下 是关于 etcd 的安装与使用方法的详细介绍。

安装

Etcd 首先,需要在你的系统中安装 Etcd。Etcd 是一个分布式键值存储,通常用于服务发现 和配置管理。以下是在 Linux 系统上安装 Etcd 的基本步骤:

1. 安装 Etcd:

sudo apt-get install etcd

1. 启动 Etcd 服务:

sudo systemctl start etcd

1. 设置 Etcd 开机自启:

sudo systemctl enable etcd

节点配置

如果是单节点集群其实就可以不用进行配置,默认 etcd 的集群节点通信端口为 2380, 客户端访问端口为 2379.

若需要修改,则可以配置:/etc/default/etcd

 #节点名称,默认为 "default"

ETCD_NAME="etcd1"

#数据目录,默认为 "${name}.etcd"

ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

#用于客户端连接的 URL。 ETCD_LISTEN_CLIENT_URLS="http://192.168.65.132:2379,http://127.0.0 .1:2379"

#用于客户端访问的公开,也就是提供服务的 URL ETCD_ADVERTISE_CLIENT_URLS="http://192.168.65.132:2379,http://127. 0.0.1:2379"

#用于集群节点间通信的 URL。 ETCD_LISTEN_PEER_URLS="http://192.168.65.132:2380" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.65.132:2380"

#心跳间隔时间-毫秒

ETCD_HEARTBEAT_INTERVAL=100

#选举超时时间-毫秒

ETCD_ELECTION_TIMEOUT=1000

#以下为集群配置,若无集群则需要注销

#初始集群状态和配置--集群中所有节点 #ETCD_INITIAL_CLUSTER="etcd1=http://192.168.65.132:2380,etcd2=http ://192.168.65.132:2381,etcd3=http://192.168.65.132:2382"

#初始集群令牌-集群的 ID

#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" #ETCD_INITIAL_CLUSTER_STATE="new"

#以下为安全配置,如果要求 SSL 连接 etcd 的话,把下面的配置启用,并修改文件路径 #ETCD_CERT_FILE="/etc/ssl/client.pem"

#ETCD_KEY_FILE="/etc/ssl/client-key.pem"

#ETCD_CLIENT_CERT_AUTH="true"

#ETCD_TRUSTED_CA_FILE="/etc/ssl/ca.pem"

#ETCD_AUTO_TLS="true"

#ETCD_PEER_CERT_FILE="/etc/ssl/member.pem" #ETCD_PEER_KEY_FILE="/etc/ssl/member-key.pem" #ETCD_PEER_CLIENT_CERT_AUTH="false" #ETCD_PEER_TRUSTED_CA_FILE="/etc/ssl/ca.pem" #ETCD_PEER_AUTO_TLS="true"

单节点运行示例

etcd --name etcd1 --initial-advertise-peer-urls

http://192.168.65.132:2380 \

--listen-peer-urls http://192.168.65.132:2380 \

--listen-client-urls http://192.168.65.132:2379 \

--advertise-client-urls http://192.168.65.132:2379 \

--initial-cluster-token etcd-cluster \

--initial-cluster

etcd1=http://192.168.65.132:2380,etcd2=http://192.168.65.132:2381, etcd3=http://192.168.65.132:2382 \

--initial-cluster-state new &> nohup1.out &

运行验证

etcdctl put mykey "this is awesome"

如果出现报错:

etcdctl put mykey "this is awesome" No help topic for 'put'

则 sudo vi /etc/profile 在末尾声明环境变量 ETCDCTL_API=3 以确定 etcd 版本。

Bash export ETCDCTL_API=3 完毕后,加载配置文件,并重新执行测试指令

source /etc/profile

etcdctl put mykey "this is awesome" OK

etcdctl get mykey mykey this is awesome

etcdctl del mykey

搭建服务注册发现中心

使用 Etcd 作为服务注册发现中心,你需要定义服务的注册和发现逻辑。这通常涉及到 以下几个操作:

  1. 服务注册:服务启动时,向 Etcd 注册自己的地址和端口。
  2. 服务发现:客户端通过 Etcd 获取服务的地址和端口,用于远程调用。
  3. 健康检查:服务定期向 Etcd 发送心跳,以维持其注册信息的有效性。

etcd 采用 golang 编写,v3 版本通信采用 grpc API,即(HTTP2+protobuf); 官方只维护了 go 语言版本的 client 库, 因此需要找到 C/C++ 非官方的 client 开发库:

etcd-cpp-apiv3

etcd-cpp-apiv3 是一个 etcd 的 C++版本客户端 API。它依赖于 mipsasm, boost, protobuf, gRPC, cpprestsdk 等库。

etcd-cpp-apiv3 的 GitHub 地址是:https://github.com/etcd-cpp-apiv3/etcd-cpp-apiv3

依赖安装:

sudo apt-get install libboost-all-dev libssl-dev

sudo apt-get install libprotobuf-dev protobuf-compiler-grpc

sudo apt-get install libgrpc-dev libgrpc++-dev

sudo apt-get install libcpprest-dev

api 框架安装

git clone https://github.com/etcd-cpp-apiv3/etcd-cpp-apiv3.git cd etcd-cpp-apiv3

mkdir build && cd build

cmake .. -DCMAKE_INSTALL_PREFIX=/usr

make -j$(nproc) && sudo make install

客户端类与接口介绍:

//pplx::task 并行库异步结果对象 
//阻塞方式 get(): 阻塞直到任务执行完成,并获取任务结果 
//非阻塞方式 wait(): 等待任务到达终止状态,然后返回任务状态 

namespace etcd {
    class Value {
        bool is_dir();//判断是否是一个目录 
            std::string const& key() //键值对的 key 值 
            std::string const& as_string()//键值对的 val 值 

            int64_t lease() //用于创建租约的响应中,返回租约 ID 
    }
    //etcd 会监控所管理的数据的变化,一旦数据产生变化会通知客户端 
    //在通知客户端的时候,会返回改变前的数据和改变后的数据 
    class Event {
        enum class EventType {
            PUT, //键值对新增或数据发生改变 
            DELETE_,//键值对被删除 
            INVALID,
        };
        enum EventType event_type()
            const Value& kv()
            const Value& prev_kv()
    }
    class Response {
        bool is_ok()
            std::string const& error_message()
            Value const& value()//当前的数值 或者 一个请求的处理结果 
            Value const& prev_value()//之前的数值 
            Value const& value(int index)// 
            std::vector<Event> const& events();//触发的事件 
    }

    class KeepAlive {
        KeepAlive(Client const& client, int ttl, int64_t lease_id =
            0);
        //返回租约 ID 
        int64_t Lease();
        //停止保活动作 
        void Cancel();
    }

    class Client {
        // etcd_url: "http://127.0.0.1:2379" 
        Client(std::string const& etcd_url,
            std::string const& load_balancer = "round_robin");
        //Put a new key-value pair 新增一个键值对 
        pplx::task<Response> put(std::string const& key,
            std::string const& value);
        //新增带有租约的键值对 (一定时间后,如果没有续租,数据自动删除) 
        pplx::task<Response> put(std::string const& key,
            std::string const& value,
            const int64_t leaseId);
        //获取一个指定 key 目录下的数据列表 
        pplx::task<Response> ls(std::string const& key);
        //创建并获取一个存活 ttl 时间的租约 
        pplx::task<Response> leasegrant(int ttl);
        //获取一个租约保活对象,其参数 ttl 表示租约有效时间 
        pplx::task<std::shared_ptr<KeepAlive>> leasekeepalive(int
            ttl);
        //撤销一个指定的租约 
        pplx::task<Response> leaserevoke(int64_t lease_id);
        //数据锁 
        pplx::task<Response> lock(std::string const& key);
    }

    class Watcher {
        Watcher(Client const& client,
            std::string const& key, //要监控的键值对 key 
            std::function<void(Response)> callback, //发生改变后的回调 
            bool recursive = false); //是否递归监控目录下的所有数据改变 
        Watcher(std::string const& address,
            std::string const& key,
            std::function<void(Response)> callback,
            bool recursive = false);
        //阻塞等待,直到监控任务被停止 
        bool Wait();
        bool Cancel();
    }
    //........
}

 封装服务发现与注册功能:

在服务的注册与发现中,主要基于 etcd 所提供的可以设置有效时间的键值对存储来实现。

服务注册

主要是在 etcd 服务器上存储一个租期 ns 的保活键值对,表示所能提供指定服务的节 点主机,比如 /service/user/instance-1 的 key,且对应的 val 为提供服务的主机节点地址:

<key, val>-- < /service/user/instance-1, 127.0.0.1:9000>

  • /service 是主目录,其下会有不同服务的键值对存储
  • /user 是服务名称,表示该键值对是一个用户服务的节点
  • /instance-1 是节点实例名称,提供用户服务可能会有很多节点,每个节点都应该有自己独立且唯一的实例名称

当这个键值对注册之后,服务发现方可以基于目录进行键值对的发现。 且一旦注册节点退出,保活失败,则 3s 后租约失效,键值对被删除,etcd 会通知发现 方数据的失效,进而实现服务下线通知的功能。

服务发现

服务发现分为两个过程:

  • 刚启动客户端的时候,进行 ls 目录浏览,进行/service 路径下所有键值对的获取
  • 对关心的服务进行 watcher 观测,一旦数值发生变化(新增/删除),收到通知进行节点的管理

如果 ls 的路径为/service,则会获取到 /service/user, /service/firend, ...等其路径下的 所有能够提供服务的实例节点数据。

如果 ls 的路径为 /service/user, 则会获取到 /service/user/instancd-1, /service/user/instance-2,....等所有提供用户服务的实例节点数据。

客户端可以将发现的所有<实例 - 地址>管理起来,以便于进行节点的管理:

  • 收到新增数据通知,则向本地管理添加新增的节点地址 -- 服务上线
  • 收到删除数据通知,则从本地管理删除对应的节点地址 -- 服务下线

因为管理了所有的能够提供服务的节点主机的地址,因此当需要进行 rpc 调用的时候, 则根据服务名称,获取一个能够提供服务的主机节点地址进行访问就可以了,而这里 的获取策略,我们采用 RR 轮转策略。

封装思想:

将 etcd 的操作全部封装起来,也不需要管理数据,只需要向外四个基础操作接口:

  • 进行服务注册,也就是向 etcd 添加 服务-主机地址>的数据
  • 进行服务发现,获取当前所有能提供服务的信息
  • 设置服务上线的处理回调接口 • 设置服务下线的处理回调接口

这样封装之后,外部的 rpc 调用模块,可以先获取所有的当前服务信息,建立通信连接进行 rpc 调用,也能在有新服务上线的时候新增连接,以及下线的时候移除连接。

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

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

相关文章

conda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正

详细问题 PS C:\Users\wh109> conda init powershell conda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正 确&#xff0c;然后再试一次。 所在位置 行:1 字符: 1conda init pow…

HQChart实战教程58:K线主图仿TradingView实现

本文将详细介绍如何使用HQChart实现类似TradingView风格的K线主图,包含完整的代码实现和详细注释,适合金融图表开发者和量化交易爱好者阅读。 一、TradingView风格特点分析 在开始实现前,我们先分析TradingView的K线主图核心特点: 简洁现代的UI设计:深色背景、清晰的网格…

GitPython08-源码解读

GitPython08-源码解读 1-核心知识 1&#xff09;gitPython核心代码很多都是对git命令返回的结果进行解析&#xff0c;在此补充git命令的返回内容2&#xff09;git ls-tree -> 查看某个提交或分支所对应的目录树3&#xff09;源码中Tree对应的业务逻辑 -> 获取git ls-tre…

中科院开源HYPIR图像复原大模型:1.7秒,老照片变8K画质

目录 前言 一、告别“龟速”艺术家&#xff0c;拥抱“闪电”打印机 二、不止是高清&#xff1a;它看得懂文字&#xff0c;更能理解你的心意 2.1 首先&#xff0c;它是位“文字保卫者” 2.2 其次&#xff0c;它还是个“细节创造家” 2.3 最后&#xff0c;它是一个能“听懂…

设计Mock华为昇腾GPU的MindSpore和CANN的库的流程与实现

在没有华为昇腾GPU可用的情况下用C库写一个Mock MindSpore和CANN的库&#xff0c;调用多核CPU和内存的资源来模拟GPU的算力&#xff0c;调试MindSpore和CANN的C代码&#xff0c;做这个库的基本流程步骤和详细设计是什么&#xff1f; 要创建一个Mock库来模拟华为昇腾GPU&#xf…

【AI问答记录】grafana接收query请求中未携带step参数,后端基于intervalMs和maxDataPoints等参数计算step的逻辑

让我详细分析Grafana源码中计算step的完整逻辑&#xff0c;它确实比简单的intervalMs/1000复杂得多。 完整的Step计算流程 1. 入口点&#xff1a;[models.Parse](file://F:\JavaProject\grafana-release-11.2.0\pkg\promlib\models\query.go#L190-L274)函数 在pkg/promlib/mode…

再谈亚马逊云科技(AWS)上海AI研究院7月22日关闭事件

【科技明说 &#xff5c; 科技热点关注】亚马逊云科技&#xff08;AWS&#xff09;上海AI研究院已于2025年7月22日正式解散&#xff0c;这是亚马逊在全球范围内的最后一个海外研究中心的关闭。这个消息是否是真的&#xff0c;目前得到的印证来自其研发中心的首席科学家王敏捷在…

Python中的决策树机器学习模型简要介绍和代码示例(基于sklearn)

一、决策树定义 决策树是一种监督学习算法&#xff0c;可用于**分类&#xff08;Classification&#xff09;和回归&#xff08;Regression&#xff09;**任务。 它的结构类似树状结构&#xff1a; 内部节点&#xff1a;特征条件&#xff08;如X > 2&#xff09;叶子节点&am…

Redis集群分布式(Redis Cluster)底层实现原理详细介绍

文章目录一、Redis集群概念二、集群节点1. 节点如何启动2. 节点的集群数据结构2.1 clusterNode结构2.2 clusterLink结构2.3 clusterState结构3. 节点如何加入集群三、数据分片机制1. 记录节点的槽指派信息2. 传播节点的槽指派信息3. 记录集群所有槽的指派信息4. 节点的槽指派命…

【走遍美国精讲笔记】第 1 课:林登大街 46 号

ACT 1-1 “我可以给您和您的小男孩拍张照吗&#xff1f;” 【故事梗概】 自由摄影艺术家 Richard Stewart&#xff0c;正在为编出自己的影集《走遍美国》到处拍照。今天他在由纽约市曼哈顿区到斯塔滕岛的渡船上工 作&#xff0c;回程中遇到了来自加州的一位黑人妇女 Martha Van…

Java中Lambda 表达式的解释

从 Java 8 开始&#xff0c;Lambda 表达式成为 Java 的一等公民。它不仅让代码更简洁&#xff0c;还为函数式编程打开了大门。如果你还没真正理解或使用过 Lambda&#xff0c;这篇文章就是为你写的。一、什么是 Lambda 表达式&#xff1f;Lambda 表达式是 Java 中的一种匿名函数…

Spring AI调用Embedding模型返回HTTP 400:Invalid HTTP request received分析处理

调用Embedding模型失败 Spring AI项目使用的Embedding模型是公司平台部署的&#xff0c;请求模型服务的时候报错&#xff0c;返回了HTTP 400 - Invalid HTTP request received错误。然后换成云厂商在线Embedding模型地址&#xff0c;正常调通。我用Apifox直接调用公司的模型服务…

Pytorch-02数据集和数据加载器的基本原理和基本操作

1. 为什么要有数据集类和数据加载器类&#xff1f; 一万个人会有一万种获取并处理原始数据样本的代码&#xff0c;这会导致对数据的操作代码标准不一&#xff0c;并且很难复用。为了解决这个问题&#xff0c;Pytorch提供了两种最基本的数据相关类&#xff1a; torch.utils.data…

无图形界面的CentOS 7网络如何配置

进入虚拟机输入ip addr命令&#xff1a;从 ip addr命令的输出可以明确看出 ​​lo和 ens33是两个不同的网络接口&#xff08;网卡&#xff09;lo&#xff08;回环接口&#xff09;​​​​作用​​&#xff1a;虚拟的本地回环网卡&#xff0c;用于本机内部通信&#xff08;如 1…

机器学习之线性回归的入门学习

线性回归是一种监督学习算法&#xff0c;用于解决回归问题。它的目标是找到一个线性关系&#xff08;一条直线或一个超平面&#xff09;&#xff0c;能够最好地描述一个或多个自变量&#xff08;特征&#xff09;与一个因变量&#xff08;目标&#xff09;之间的关系。利用回归…

2-5 Dify案例实践—利用RAG技术构建企业私有知识库

目录 一、RAG技术的定义与作用 二、RAG技术的关键组件 三、RAG技术解决的问题 四、RAG技术的核心价值与应用场景 五、如何实现利用RAG技术构建企业私有知识库 六、Dify知识库实现详解 七、创建知识库 1、创建知识库 2、上传文档 3、文本分段与清洗 4、索引方式 5、…

断路器瞬时跳闸曲线数据获取方式

断路器瞬时短路电流时&#xff0c;时间是在60ms内的&#xff0c;仿真器去直接捕获电流有效值很难。按照电流互感器的电流曲线特性&#xff0c;电流越大&#xff0c;由于互感器饱和&#xff0c;到达一定电流值的时候&#xff0c;电流会趋于平稳不再上升&#xff0c;ADC-I曲线由线…

技巧|SwanLab记录混淆矩阵攻略

绘制混淆矩阵&#xff08;Confusion Matrix&#xff09;&#xff0c;用于评估分类模型的性能。混淆矩阵展示了模型预测结果与真实标签之间的对应关系&#xff0c;能够直观地显示各类别的预测准确性和错误类型。 混淆矩阵是评估分类模型性能的基础工具&#xff0c;特别适用于多…

HTTPS的工作原理

文章目录HTTP有什么问题&#xff1f;1. 明文传输&#xff0c;容易被窃听2. 无法验证通信方身份3. 数据完整性无法保证HTTPS是如何解决这些问题的&#xff1f;HTTPS的工作原理1. SSL/TLS握手2. 数据加密传输3. 完整性保护4. 连接关闭总结HTTP有什么问题&#xff1f; 1. 明文传输…

ECMAScript2020(ES11)新特性

概述 ECMAScript2020于2020年6月正式发布&#xff0c; 本文会介绍ECMAScript2020(ES11)&#xff0c;即ECMAScript的第11个版本的新特性。 以下摘自官网&#xff1a;ecma-262 ECMAScript 2020, the 11th edition, introduced the matchAll method for Strings, to produce an …