1.特點(diǎn):??
????????etcd 是云原生架構(gòu)中重要的基礎(chǔ)組件。有如下特點(diǎn):
- 簡(jiǎn)單:安裝配置簡(jiǎn)單,而且提供了 HTTP API 進(jìn)行交互,使用也很簡(jiǎ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 是一個(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í)
2.使用場(chǎng)景:
????????etcd 比較多的應(yīng)用場(chǎng)景是用于服務(wù)注冊(cè)與發(fā)現(xiàn),除此之外,也可以用于鍵值對(duì)存儲(chǔ),應(yīng)用程序可以讀取和寫入 etcd 中的數(shù)據(jù)。
? ? ? ? 2.1 鍵值對(duì)存儲(chǔ)
????????????????歸根結(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)
????????2.2 服務(wù)注冊(cè)與發(fā)現(xiàn)
????????????????服務(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ǔ)目錄。 - 一種注冊(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ù)都能夠互相連接。
? ? ? ? 2.3?消息發(fā)布與訂閱
????????????????在分布式系統(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的接口在外部訪問
? ? ? ? 2.4?分布式通知與協(xié)調(diào)
????????這里說到的分布式通知與協(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)度。
? ? ? ? 2.5?分布式鎖
????????當(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)為是獲得了鎖。文章來源:http://www.zghlxwxcb.cn/news/detail-857002.html
????????控制時(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)文章來源地址http://www.zghlxwxcb.cn/news/detail-857002.html
到了這里,關(guān)于k8s之etcd的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!