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
英文地址,請注明出處:http://en.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 …