徹底搞懂 etcd 系列文章(一):初識(shí) etcd

      網(wǎng)友投稿 994 2022-05-29

      0 專輯概述

      ETCD 是云原生架構(gòu)中重要的基礎(chǔ)組件,由 CNCF 孵化托管。etcd 在微服務(wù)和 Kubernates 集群中不僅可以作為服務(wù)注冊(cè)與發(fā)現(xiàn),還可以作為 key-value 存儲(chǔ)的中間件。

      《徹底搞懂 etcd 系列文章》將會(huì)從 etcd 的基本功能實(shí)踐、API 接口、實(shí)現(xiàn)原理、源碼分析,以及實(shí)現(xiàn)中的踩坑經(jīng)驗(yàn)等幾方面具體展開介紹 etcd。預(yù)計(jì)會(huì)有 20 篇左右的文章,筆者將會(huì)每周持續(xù)更新,歡迎關(guān)注。

      1 etcd 介紹

      etcd 是 CoreOS 團(tuán)隊(duì)于 2013 年 6 月發(fā)起的開源項(xiàng)目,它的目標(biāo)是構(gòu)建一個(gè)高可用的分布式鍵值(key-value)數(shù)據(jù)庫。具有以下特點(diǎn):

      簡單:安裝配置簡單,而且提供了 HTTP API 進(jìn)行交互,使用也很簡單

      鍵值對(duì)存儲(chǔ):將數(shù)據(jù)存儲(chǔ)在分層組織的目錄中,如同在標(biāo)準(zhǔn)文件系統(tǒng)中

      監(jiān)測(cè)變更:監(jiān)測(cè)特定的鍵或目錄以進(jìn)行更改,并對(duì)值的更改做出反應(yīng)

      安全:支持 SSL 證書驗(yàn)證

      快速:根據(jù)官方提供的 benchmark 數(shù)據(jù),單實(shí)例支持每秒 2k+ 讀操作

      可靠:采用 raft 算法,實(shí)現(xiàn)分布式系統(tǒng)數(shù)據(jù)的可用性和一致性

      0 專輯概述

      etcd 是云原生架構(gòu)中重要的基礎(chǔ)組件,由 CNCF 孵化托管。etcd 在微服務(wù)和 Kubernates 集群中不僅可以作為服務(wù)注冊(cè)與發(fā)現(xiàn),還可以作為 key-value 存儲(chǔ)的中間件。

      《徹底搞懂 etcd 系列文章》將會(huì)從 etcd 的基本功能實(shí)踐、API 接口、實(shí)現(xiàn)原理、源碼分析,以及實(shí)現(xiàn)中的踩坑經(jīng)驗(yàn)等幾方面具體展開介紹 etcd。預(yù)計(jì)會(huì)有 20 篇左右的文章,筆者將會(huì)每周持續(xù)更新,歡迎關(guān)注。

      1 etcd 介紹

      徹底搞懂 etcd 系列文章(一):初識(shí) etcd

      etcd 是 CoreOS 團(tuán)隊(duì)于 2013 年 6 月發(fā)起的開源項(xiàng)目,它的目標(biāo)是構(gòu)建一個(gè)高可用的分布式鍵值(key-value)數(shù)據(jù)庫。具有以下特點(diǎn):

      簡單:安裝配置簡單,而且提供了 HTTP API 進(jìn)行交互,使用也很簡單

      鍵值對(duì)存儲(chǔ):將數(shù)據(jù)存儲(chǔ)在分層組織的目錄中,如同在標(biāo)準(zhǔn)文件系統(tǒng)中

      監(jiān)測(cè)變更:監(jiān)測(cè)特定的鍵或目錄以進(jìn)行更改,并對(duì)值的更改做出反應(yīng)

      安全:支持 SSL 證書驗(yàn)證

      快速:根據(jù)官方提供的 benchmark 數(shù)據(jù),單實(shí)例支持每秒 2k+ 讀操作

      可靠:采用 raft 算法,實(shí)現(xiàn)分布式系統(tǒng)數(shù)據(jù)的可用性和一致性

      etcd 采用 Go 語言編寫,它具有出色的跨平臺(tái)支持,很小的二進(jìn)制文件和強(qiáng)大的社區(qū)。 etcd 機(jī)器之間的通信通過 Raft 算法處理。

      etcd 是一個(gè)高度一致的分布式鍵值存儲(chǔ),它提供了一種可靠的方式來存儲(chǔ)需要由分布式系統(tǒng)或機(jī)器集群訪問的數(shù)據(jù)。它可以優(yōu)雅地處理網(wǎng)絡(luò)分區(qū)期間的 leader 選舉,以應(yīng)對(duì)機(jī)器的故障,即使是在 leader 節(jié)點(diǎn)發(fā)生故障時(shí)。

      從簡單的 Web 應(yīng)用程序到 Kubernetes 集群,任何復(fù)雜的應(yīng)用程序都可以從 etcd 中讀取數(shù)據(jù)或?qū)?shù)據(jù)寫入 etcd。

      etcd 于 2018 年 12 月正式加入云原生計(jì)算基金會(huì)(CNCF,全稱 Cloud Native Computing Foundation),并由 CNCF 支持。CNCF 是一個(gè)廠商中立的基金會(huì)、云原生技術(shù)推廣和普及的領(lǐng)導(dǎo)者。

      2 使用場(chǎng)景

      etcd 比較多的應(yīng)用場(chǎng)景是用于服務(wù)注冊(cè)與發(fā)現(xiàn),除此之外,也可以用于鍵值對(duì)存儲(chǔ),應(yīng)用程序可以讀取和寫入 etcd 中的數(shù)據(jù)。

      一個(gè)簡單的用例是將數(shù)據(jù)庫連接詳細(xì)信息或功能標(biāo)志存儲(chǔ)在 etcd 中作為鍵值對(duì)。 可以觀察這些值,使我們的應(yīng)用在更改時(shí)可以重新配置自己。高級(jí)用法是利用 etcd 的一致性保證來實(shí)施數(shù)據(jù)庫 leader 選舉或在一組 follower 之間執(zhí)行分布式鎖定。

      A highly-available key value store for shared configuration and service discovery.

      一個(gè)用于配置共享和服務(wù)發(fā)現(xiàn)的鍵值存儲(chǔ)系統(tǒng)。

      歸根結(jié)底,etcd 是一個(gè)鍵值存儲(chǔ)的組件,其他的應(yīng)用都是基于其鍵值存儲(chǔ)的功能展開。etcd 的存儲(chǔ)有如下特點(diǎn):

      采用kv型數(shù)據(jù)存儲(chǔ),一般情況下比關(guān)系型數(shù)據(jù)庫快。

      支持動(dòng)態(tài)存儲(chǔ)(內(nèi)存)以及靜態(tài)存儲(chǔ)(磁盤)。

      分布式存儲(chǔ),可集成為多節(jié)點(diǎn)集群。

      存儲(chǔ)方式,采用類似目錄結(jié)構(gòu)。

      只有葉子節(jié)點(diǎn)才能真正存儲(chǔ)數(shù)據(jù),相當(dāng)于文件。

      葉子節(jié)點(diǎn)的父節(jié)點(diǎn)一定是目錄,目錄不能存儲(chǔ)數(shù)據(jù)。

      etcd leader 的延遲是要跟蹤的最重要的指標(biāo),并且內(nèi)置儀表板具有專用于此的視圖。在我們的測(cè)試中,嚴(yán)重的延遲會(huì)在群集內(nèi)造成不穩(wěn)定,因?yàn)?Raft 的速度僅與大多數(shù)機(jī)器中最慢的機(jī)器一樣快。我們可以通過適當(dāng)?shù)卣{(diào)整群集來緩解此問題。etcd 已在具有高度可變網(wǎng)絡(luò)的云提供商上進(jìn)行了預(yù)調(diào)。

      服務(wù)注冊(cè)與發(fā)現(xiàn)(Service Discovery)要解決的是分布式系統(tǒng)中最常見的問題之一,即在同一個(gè)分布式集群中的進(jìn)程或服務(wù)如何才能找到對(duì)方并建立連接。從本質(zhì)上說,服務(wù)發(fā)現(xiàn)就是要了解集群中是否有進(jìn)程在監(jiān)聽 UDP 或者 TCP 端口,并且通過名字就可以進(jìn)行查找和鏈接。

      要解決服務(wù)發(fā)現(xiàn)的問題,需要下面三大支柱,缺一不可。

      強(qiáng)一致性、高可用的服務(wù)存儲(chǔ)目錄。 基于 Raft 算法的 etcd 天生就是這樣一個(gè)強(qiáng)一致性、高可用的服務(wù)存儲(chǔ)目錄。

      強(qiáng)一致性、高可用的服務(wù)存儲(chǔ)目錄。 基于 Raft 算法的 etcd 天生就是這樣一個(gè)強(qiáng)一致性、高可用的服務(wù)存儲(chǔ)目錄。

      一種注冊(cè)服務(wù)和服務(wù)健康狀況的機(jī)制。 用戶可以在 etcd 中注冊(cè)服務(wù),并且對(duì)注冊(cè)的服務(wù)配置 key TTL,定時(shí)保持服務(wù)的心跳以達(dá)到監(jiān)控健康狀態(tài)的效果。

      一種注冊(cè)服務(wù)和服務(wù)健康狀況的機(jī)制。 用戶可以在 etcd 中注冊(cè)服務(wù),并且對(duì)注冊(cè)的服務(wù)配置 key TTL,定時(shí)保持服務(wù)的心跳以達(dá)到監(jiān)控健康狀態(tài)的效果。

      一種查找和連接服務(wù)的機(jī)制。通過在 etcd 指定的主題下注冊(cè)的服務(wù)也能在對(duì)應(yīng)的主題下查找到。為了確保連接,我們可以在每個(gè)服務(wù)機(jī)器上都部署一個(gè) Proxy 模式的 etcd,這樣就可以確保訪問 etcd 集群的服務(wù)都能夠互相連接。

      一種查找和連接服務(wù)的機(jī)制。通過在 etcd 指定的主題下注冊(cè)的服務(wù)也能在對(duì)應(yīng)的主題下查找到。為了確保連接,我們可以在每個(gè)服務(wù)機(jī)器上都部署一個(gè) Proxy 模式的 etcd,這樣就可以確保訪問 etcd 集群的服務(wù)都能夠互相連接。

      etcd2 中引入的 etcd/raft 庫,是目前最穩(wěn)定、功能豐富的開源一致性協(xié)議之一。作為 etcd、TiKV、CockcorachDB、Dgraph 等知名分布式數(shù)據(jù)庫的核心數(shù)據(jù)復(fù)制引擎,etcd/raft 驅(qū)動(dòng)了超過十萬個(gè)集群,是被最為廣泛采用一致性協(xié)議實(shí)現(xiàn)之一。etcd3 中引入的多版本控制、事務(wù)等功能,大大的簡化了分布式應(yīng)用的開發(fā)流程,提高了效率和穩(wěn)定性。經(jīng)過 5 年的演進(jìn),etcd 也已經(jīng)成為了各種容器編排系統(tǒng)的默認(rèn)存儲(chǔ)選項(xiàng)。Kubernetes 是流行的容器平臺(tái),運(yùn)行在任何環(huán)境的 Kubernetes 集群都依賴 etcd 來提供穩(wěn)定而可靠的存儲(chǔ)服務(wù)。

      在分布式系統(tǒng)中,最適用的一種組件間通信方式就是消息發(fā)布與訂閱。即構(gòu)建一個(gè)配置共享中心,數(shù)據(jù)提供者在這個(gè)配置中心發(fā)布消息,而消息使用者則訂閱他們關(guān)心的主題,一旦主題有消息發(fā)布,就會(huì)實(shí)時(shí)通知訂閱者。通過這種方式可以做到分布式系統(tǒng)配置的集中式管理與動(dòng)態(tài)更新。

      應(yīng)用中用到的一些配置信息放到etcd上進(jìn)行集中管理。這類場(chǎng)景的使用方式通常是這樣:應(yīng)用在啟動(dòng)的時(shí)候主動(dòng)從etcd獲取一次配置信息,同時(shí),在etcd節(jié)點(diǎn)上注冊(cè)一個(gè)Watcher并等待,以后每次配置有更新的時(shí)候,etcd都會(huì)實(shí)時(shí)通知訂閱者,以此達(dá)到獲取最新配置信息的目的。

      分布式搜索服務(wù)中,索引的元信息和服務(wù)器集群機(jī)器的節(jié)點(diǎn)狀態(tài)存放在etcd中,供各個(gè)客戶端訂閱使用。使用etcd的key TTL功能可以確保機(jī)器狀態(tài)是實(shí)時(shí)更新的。

      分布式日志收集系統(tǒng)。這個(gè)系統(tǒng)的核心工作是收集分布在不同機(jī)器的日志。收集器通常是按照應(yīng)用(或主題)來分配收集任務(wù)單元,因此可以在etcd上創(chuàng)建一個(gè)以應(yīng)用(主題)命名的目錄P,并將這個(gè)應(yīng)用(主題相關(guān))的所有機(jī)器ip,以子目錄的形式存儲(chǔ)到目錄P上,然后設(shè)置一個(gè) etcd 遞歸的Watcher,遞歸式的監(jiān)控應(yīng)用(主題)目錄下所有信息的變動(dòng)。這樣就實(shí)現(xiàn)了機(jī)器IP(消息)變動(dòng)的時(shí)候,能夠?qū)崟r(shí)通知到收集器調(diào)整任務(wù)分配。

      系統(tǒng)中信息需要?jiǎng)討B(tài)自動(dòng)獲取與人工干預(yù)修改信息請(qǐng)求內(nèi)容的情況。通常是暴露出接口,例如JMX接口,來獲取一些運(yùn)行時(shí)的信息。引入etcd之后,就不用自己實(shí)現(xiàn)一套方案了,只要將這些信息存放到指定的etcd目錄中即可,etcd的這些目錄就可以通過HTTP的接口在外部訪問。

      這里說到的分布式通知與協(xié)調(diào),與消息發(fā)布和訂閱有些相似。在分布式系統(tǒng)中,最適用的一種組件間通信方式就是消息發(fā)布與訂閱。即構(gòu)建一個(gè)配置共享中心,數(shù)據(jù)提供者在這個(gè)配置中心發(fā)布消息,而消息使用者則訂閱他們關(guān)心的主題,一旦主題有消息發(fā)布,就會(huì)實(shí)時(shí)通知訂閱者。通過這種方式可以做到分布式系統(tǒng)配置的集中式管理與動(dòng)態(tài)更新。

      這里用到了etcd中的Watcher機(jī)制,通過注冊(cè)與異步通知機(jī)制,實(shí)現(xiàn)分布式環(huán)境下不同系統(tǒng)之間的通知與協(xié)調(diào),從而對(duì)數(shù)據(jù)變更做到實(shí)時(shí)處理。實(shí)現(xiàn)方式通常是這樣:不同系統(tǒng)都在etcd上對(duì)同一個(gè)目錄進(jìn)行注冊(cè),同時(shí)設(shè)置Watcher觀測(cè)該目錄的變化(如果對(duì)子目錄的變化也有需要,可以設(shè)置遞歸模式),當(dāng)某個(gè)系統(tǒng)更新了etcd的目錄,那么設(shè)置了Watcher的系統(tǒng)就會(huì)收到通知,并作出相應(yīng)處理。

      通過etcd進(jìn)行低耦合的心跳檢測(cè)。檢測(cè)系統(tǒng)和被檢測(cè)系統(tǒng)通過etcd上某個(gè)目錄關(guān)聯(lián)而非直接關(guān)聯(lián)起來,這樣可以大大減少系統(tǒng)的耦合性。

      通過etcd完成系統(tǒng)調(diào)度。某系統(tǒng)有控制臺(tái)和推送系統(tǒng)兩部分組成,控制臺(tái)的職責(zé)是控制推送系統(tǒng)進(jìn)行相應(yīng)的推送工作。管理人員在控制臺(tái)作的一些操作,實(shí)際上是修改了etcd上某些目錄節(jié)點(diǎn)的狀態(tài),而etcd就把這些變化通知給注冊(cè)了Watcher的推送系統(tǒng)客戶端,推送系統(tǒng)再作出相應(yīng)的推送任務(wù)。

      通過etcd完成工作匯報(bào)。大部分類似的任務(wù)分發(fā)系統(tǒng),子任務(wù)啟動(dòng)后,到etcd來注冊(cè)一個(gè)臨時(shí)工作目錄,并且定時(shí)將自己的進(jìn)度進(jìn)行匯報(bào)(將進(jìn)度寫入到這個(gè)臨時(shí)目錄),這樣任務(wù)管理者就能夠?qū)崟r(shí)知道任務(wù)進(jìn)度。

      當(dāng)在分布式系統(tǒng)中,數(shù)據(jù)只有一份(或有限制),此時(shí)需要利用鎖的技術(shù)控制某一時(shí)刻修改數(shù)據(jù)的進(jìn)程數(shù)。與單機(jī)模式下的鎖不僅需要保證進(jìn)程可見,分布式環(huán)境下還需要考慮進(jìn)程與鎖之間的網(wǎng)絡(luò)問題。

      分布式鎖可以將標(biāo)記存在內(nèi)存,只是該內(nèi)存不是某個(gè)進(jìn)程分配的內(nèi)存而是公共內(nèi)存如 Redis、Memcache。至于利用數(shù)據(jù)庫、文件等做鎖與單機(jī)的實(shí)現(xiàn)是一樣的,只要保證標(biāo)記能互斥就行。

      因?yàn)閑tcd使用Raft算法保持了數(shù)據(jù)的強(qiáng)一致性,某次操作存儲(chǔ)到集群中的值必然是全局一致的,所以很容易實(shí)現(xiàn)分布式鎖。鎖服務(wù)有兩種使用方式,一是保持獨(dú)占,二是控制時(shí)序。

      保持獨(dú)占即所有獲取鎖的用戶最終只有一個(gè)可以得到。etcd為此提供了一套實(shí)現(xiàn)分布式鎖原子操作CAS(CompareAndSwap)的API。通過設(shè)置prevExist值,可以保證在多個(gè)節(jié)點(diǎn)同時(shí)去創(chuàng)建某個(gè)目錄時(shí),只有一個(gè)成功。而創(chuàng)建成功的用戶就可以認(rèn)為是獲得了鎖。

      控制時(shí)序,即所有想要獲得鎖的用戶都會(huì)被安排執(zhí)行,但是獲得鎖的順序也是全局唯一的,同時(shí)決定了執(zhí)行順序。etcd為此也提供了一套API(自動(dòng)創(chuàng)建有序鍵),對(duì)一個(gè)目錄建值時(shí)指定為POST動(dòng)作,這樣etcd會(huì)自動(dòng)在目錄下生成一個(gè)當(dāng)前最大的值為鍵,存儲(chǔ)這個(gè)新的值(客戶端編號(hào))。同時(shí)還可以使用API按順序列出所有當(dāng)前目錄下的鍵值。此時(shí)這些鍵的值就是客戶端的時(shí)序,而這些鍵中存儲(chǔ)的值可以是代表客戶端的編號(hào)。

      3. 小結(jié)

      本章主要介紹了 etcd 的相關(guān)概念,以及 etcd 主要的使用場(chǎng)景。etcd 在分布式環(huán)境中是一個(gè)利器,在一致性存儲(chǔ)方面有廣泛的應(yīng)用。下一篇將會(huì)具體介紹 etcd 的安裝以及使用的實(shí)踐。

      etcd

      微服務(wù) 分布式

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:HBase快速入門系列(10) | HBase知識(shí)點(diǎn)總結(jié)(建議收藏!)
      下一篇:一網(wǎng)打盡 Java 并發(fā)模型
      相關(guān)文章
      精品久久香蕉国产线看观看亚洲| 国产亚洲A∨片在线观看| 91亚洲导航深夜福利| 亚洲国产人成精品| 亚洲日产2021三区| 911精品国产亚洲日本美国韩国 | 亚洲综合无码无在线观看| 亚洲欧洲日韩在线电影| 77777_亚洲午夜久久多人| 婷婷久久久亚洲欧洲日产国码AV| 亚洲av综合avav中文| 久久精品亚洲中文字幕无码网站| 亚洲av无码片在线播放| 亚洲αv久久久噜噜噜噜噜| 亚洲AV人无码综合在线观看| 亚洲一区二区影院| 亚洲精品自在线拍| 亚洲一区二区三区在线网站| 国产午夜亚洲精品| 亚洲AⅤ男人的天堂在线观看| 日韩精品亚洲专区在线影视| 亚洲精品tv久久久久| 浮力影院亚洲国产第一页| 亚洲精品无码国产| 亚洲国产精品国自产电影| 亚洲精品视频在线观看视频| 亚洲天堂福利视频| 亚洲午夜无码久久| www.91亚洲| 国产性爱在线观看亚洲黄色一级片 | 蜜芽亚洲av无码精品色午夜| 亚洲精品视频在线免费| 亚洲AV无码无限在线观看不卡 | 亚洲熟妇成人精品一区| 亚洲精品无码一区二区| 亚洲国产中文字幕在线观看| 亚洲女同成av人片在线观看| 亚洲一区二区电影| 亚洲a级成人片在线观看| 亚洲JLZZJLZZ少妇| 国产亚洲美女精品久久久|