精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Etcd 架構(gòu)與實(shí)現(xiàn)解析

開發(fā) 開發(fā)工具
本文通過分析 Etcd 的架構(gòu)與實(shí)現(xiàn),了解其優(yōu)缺點(diǎn)以及瓶頸點(diǎn),最后介紹 Etcd 周邊的工具和一些使用注意事項(xiàng)。

前一段時間的項(xiàng)目里用到了 Etcd, 所以研究了一下它的源碼以及實(shí)現(xiàn)。網(wǎng)上關(guān)于 Etcd 的使用介紹的文章不少,但分析具體架構(gòu)實(shí)現(xiàn)的文章不多,同時 Etcd v3的文檔也非常稀缺。本文通過分析 Etcd 的架構(gòu)與實(shí)現(xiàn),了解其優(yōu)缺點(diǎn)以及瓶頸點(diǎn),一方面可以學(xué)習(xí)分布式系統(tǒng)的架構(gòu),另外一方面也可以保證在業(yè)務(wù)中正確使用 Etcd,知其然同時知其所以然,避免誤用。***介紹 Etcd 周邊的工具和一些使用注意事項(xiàng)。

架構(gòu)

閱讀對象:分布式系統(tǒng)愛好者,正在或者打算在項(xiàng)目中使用Etcd的開發(fā)人員。

Etcd 按照官方介紹

Etcd is a distributed, consistent key-value store for shared configuration and service discovery

是一個分布式的,一致的 key-value 存儲,主要用途是共享配置和服務(wù)發(fā)現(xiàn)。Etcd 已經(jīng)在很多分布式系統(tǒng)中得到廣泛的使用,本文的架構(gòu)與實(shí)現(xiàn)部分主要解答以下問題:

  1. Etcd是如何實(shí)現(xiàn)一致性的?
  2. Etcd的存儲是如何實(shí)現(xiàn)的?
  3. Etcd的watch機(jī)制是如何實(shí)現(xiàn)的?
  4. Etcd的key過期機(jī)制是如何實(shí)現(xiàn)的?

一、為什么需要 Etcd ?

所有的分布式系統(tǒng),都面臨的一個問題是多個節(jié)點(diǎn)之間的數(shù)據(jù)共享問題,這個和團(tuán)隊(duì)協(xié)作的道理是一樣的,成員可以分頭干活,但總是需要共享一些必須的信息,比如誰是 leader, 都有哪些成員,依賴任務(wù)之間的順序協(xié)調(diào)等。所以分布式系統(tǒng)要么自己實(shí)現(xiàn)一個可靠的共享存儲來同步信息(比如 Elasticsearch ),要么依賴一個可靠的共享存儲服務(wù),而 Etcd 就是這樣一個服務(wù)。

二、Etcd 提供什么能力?

Etcd 主要提供以下能力,已經(jīng)熟悉 Etcd 的讀者可以略過本段。

  1. 提供存儲以及獲取數(shù)據(jù)的接口,它通過協(xié)議保證 Etcd 集群中的多個節(jié)點(diǎn)數(shù)據(jù)的強(qiáng)一致性。用于存儲元信息以及共享配置。
  2. 提供監(jiān)聽機(jī)制,客戶端可以監(jiān)聽某個key或者某些key的變更(v2和v3的機(jī)制不同,參看后面文章)。用于監(jiān)聽和推送變更。
  3. 提供key的過期以及續(xù)約機(jī)制,客戶端通過定時刷新來實(shí)現(xiàn)續(xù)約(v2和v3的實(shí)現(xiàn)機(jī)制也不一樣)。用于集群監(jiān)控以及服務(wù)注冊發(fā)現(xiàn)。
  4. 提供原子的CAS(Compare-and-Swap)和 CAD(Compare-and-Delete)支持(v2通過接口參數(shù)實(shí)現(xiàn),v3通過批量事務(wù)實(shí)現(xiàn))。用于分布式鎖以及l(fā)eader選舉。

更詳細(xì)的使用場景不在這里描述,有興趣的可以參看文末infoq的一篇文章。

三、Etcd 如何實(shí)現(xiàn)一致性的?

說到這個就不得不說起raft協(xié)議。但這篇文章不是專門分析raft的,篇幅所限,不能詳細(xì)分析,有興趣的建議看文末原始論文地址以及raft協(xié)議的一個動畫。便于看后面的文章,我這里簡單做個總結(jié):

  1. raft通過對不同的場景(選主,日志復(fù)制)設(shè)計(jì)不同的機(jī)制,雖然降低了通用性(相對paxos),但同時也降低了復(fù)雜度,便于理解和實(shí)現(xiàn)。
  2. raft內(nèi)置的選主協(xié)議是給自己用的,用于選出主節(jié)點(diǎn),理解raft的選主機(jī)制的關(guān)鍵在于理解raft的時鐘周期以及超時機(jī)制。
  3. 理解 Etcd 的數(shù)據(jù)同步的關(guān)鍵在于理解raft的日志同步機(jī)制。

Etcd 實(shí)現(xiàn)raft的時候,充分利用了go語言CSP并發(fā)模型和chan的魔法,想更進(jìn)行一步了解的可以去看源碼,這里只簡單分析下它的wal日志。

Etcd 實(shí)現(xiàn)raft

wal日志是二進(jìn)制的,解析出來后是以上數(shù)據(jù)結(jié)構(gòu)LogEntry。其中***個字段type,只有兩種,一種是0表示Normal,1表示ConfChange(ConfChange表示 Etcd 本身的配置變更同步,比如有新的節(jié)點(diǎn)加入等)。第二個字段是term,每個term代表一個主節(jié)點(diǎn)的任期,每次主節(jié)點(diǎn)變更term就會變化。第三個字段是index,這個序號是嚴(yán)格有序遞增的,代表變更序號。第四個字段是二進(jìn)制的data,將raft request對象的pb結(jié)構(gòu)整個保存下。Etcd 源碼下有個tools/etcd-dump-logs,可以將wal日志dump成文本查看,可以協(xié)助分析raft協(xié)議。

raft協(xié)議本身不關(guān)心應(yīng)用數(shù)據(jù),也就是data中的部分,一致性都通過同步wal日志來實(shí)現(xiàn),每個節(jié)點(diǎn)將從主節(jié)點(diǎn)收到的data apply到本地的存儲,raft只關(guān)心日志的同步狀態(tài),如果本地存儲實(shí)現(xiàn)的有bug,比如沒有正確的將data apply到本地,也可能會導(dǎo)致數(shù)據(jù)不一致。

四、Etcd v2 與 v3

Etcd v2 和 v3 本質(zhì)上是共享同一套 raft 協(xié)議代碼的兩個獨(dú)立的應(yīng)用,接口不一樣,存儲不一樣,數(shù)據(jù)互相隔離。也就是說如果從 Etcd v2 升級到 Etcd v3,原來v2 的數(shù)據(jù)還是只能用 v2 的接口訪問,v3 的接口創(chuàng)建的數(shù)據(jù)也只能訪問通過 v3 的接口訪問。所以我們按照 v2 和 v3 分別分析。

五、Etcd v2 Watch,以及過期機(jī)制

以下數(shù)據(jù)存儲到 Etcd 中的結(jié)構(gòu)就如圖所示

Etcd v2 是個純內(nèi)存的實(shí)現(xiàn),并未實(shí)時將數(shù)據(jù)寫入到磁盤,持久化機(jī)制很簡單,就是將store整合序列化成json寫入文件。數(shù)據(jù)在內(nèi)存中是一個簡單的樹結(jié)構(gòu)。比如以下數(shù)據(jù)存儲到 Etcd 中的結(jié)構(gòu)就如圖所示。

  1. /nodes/1/name  node1   
  2. /nodes/1/ip    192.168.1.1  

store中有一個全局的currentIndex,每次變更,index會加1.然后每個event都會關(guān)聯(lián)到currentIndex.

當(dāng)客戶端調(diào)用watch接口(參數(shù)中增加 wait參數(shù))時,如果請求參數(shù)中有waitIndex,并且waitIndex 小于 currentIndex,則從 EventHistroy 表中查詢index小于等于waitIndex,并且和watch key 匹配的 event,如果有數(shù)據(jù),則直接返回。如果歷史表中沒有或者請求沒有帶 waitIndex,則放入WatchHub中,每個key會關(guān)聯(lián)一個watcher列表。 當(dāng)有變更操作時,變更生成的event會放入EventHistroy表中,同時通知和該key相關(guān)的watcher。

這里有幾個影響使用的細(xì)節(jié)問題:

  1. EventHistroy 是有長度限制的,最長1000。也就是說,如果你的客戶端停了許久,然后重新watch的時候,可能和該waitIndex相關(guān)的event已經(jīng)被淘汰了,這種情況下會丟失變更。
  2. 如果通知watch的時候,出現(xiàn)了阻塞(每個watch的channel有100個緩沖空間),Etcd 會直接把watcher刪除,也就是會導(dǎo)致wait請求的連接中斷,客戶端需要重新連接。
  3. Etcd store的每個node中都保存了過期時間,通過定時機(jī)制進(jìn)行清理。

從而可以看出,Etcd v2 的一些限制:

  1. 過期時間只能設(shè)置到每個key上,如果多個key要保證生命周期一致則比較困難。
  2. watch只能watch某一個key以及其子節(jié)點(diǎn)(通過參數(shù) recursive),不能進(jìn)行多個watch。
  3. 很難通過watch機(jī)制來實(shí)現(xiàn)完整的數(shù)據(jù)同步(有丟失變更的風(fēng)險),所以當(dāng)前的大多數(shù)使用方式是通過watch得知變更,然后通過get重新獲取數(shù)據(jù),并不完全依賴于watch的變更event。

六、Etcd v3 存儲,Watch,以及過期機(jī)制

Etcd v3 存儲,Watch,以及過期機(jī)制

Etcd v3 將watch和store拆開實(shí)現(xiàn),我們先分析下store的實(shí)現(xiàn)。

Etcd v3 store 分為兩部分,一部分是內(nèi)存中的索引,kvindex,是基于google開源的一個golang的btree實(shí)現(xiàn)的,另外一部分是后端存儲。按照它的設(shè)計(jì),backend可以對接多種存儲,當(dāng)前使用的boltdb。boltdb是一個單機(jī)的支持事務(wù)的kv存儲,Etcd 的事務(wù)是基于boltdb的事務(wù)實(shí)現(xiàn)的。Etcd 在boltdb中存儲的key是reversion,value是 Etcd 自己的key-value組合,也就是說 Etcd 會在boltdb中把每個版本都保存下,從而實(shí)現(xiàn)了多版本機(jī)制。

舉個例子: 用etcdctl通過批量接口寫入兩條記錄:

  1. etcdctl txn <<<'  
  2. put key1 "v1"  
  3. put key2 "v2"  
  4.  
  5. '  

再通過批量接口更新這兩條記錄:

  1. etcdctl txn <<<'  
  2. put key1 "v12"  
  3. put key2 "v22"  
  4.  
  5. '  

boltdb中其實(shí)有了4條數(shù)據(jù):

  1. rev={3 0}, key=key1value="v1"  
  2. rev={3 1}, key=key2value="v2"  
  3. rev={4 0}, key=key1value="v12"  
  4. rev={4 1}, key=key2value="v22"  

reversion主要由兩部分組成,***部分main rev,每次事務(wù)進(jìn)行加一,第二部分sub rev,同一個事務(wù)中的每次操作加一。如上示例,***次操作的main rev是3,第二次是4。當(dāng)然這種機(jī)制大家想到的***個問題就是空間問題,所以 Etcd 提供了命令和設(shè)置選項(xiàng)來控制compact,同時支持put操作的參數(shù)來精確控制某個key的歷史版本數(shù)。

了解了 Etcd 的磁盤存儲,可以看出如果要從boltdb中查詢數(shù)據(jù),必須通過reversion,但客戶端都是通過key來查詢value,所以 Etcd 的內(nèi)存kvindex保存的就是key和reversion之前的映射關(guān)系,用來加速查詢。

然后我們再分析下watch機(jī)制的實(shí)現(xiàn)。Etcd v3 的watch機(jī)制支持watch某個固定的key,也支持watch一個范圍(可以用于模擬目錄的結(jié)構(gòu)的watch),所以 watchGroup 包含兩種watcher,一種是 key watchers,數(shù)據(jù)結(jié)構(gòu)是每個key對應(yīng)一組watcher,另外一種是 range watchers, 數(shù)據(jù)結(jié)構(gòu)是一個 IntervalTree(不熟悉的參看文文末鏈接),方便通過區(qū)間查找到對應(yīng)的watcher。

同時,每個 WatchableStore 包含兩種 watcherGroup,一種是synced,一種是unsynced,前者表示該group的watcher數(shù)據(jù)都已經(jīng)同步完畢,在等待新的變更,后者表示該group的watcher數(shù)據(jù)同步落后于當(dāng)前***變更,還在追趕。

當(dāng) Etcd 收到客戶端的watch請求,如果請求攜帶了revision參數(shù),則比較請求的revision和store當(dāng)前的revision,如果大于當(dāng)前revision,則放入synced組中,否則放入unsynced組。同時 Etcd 會啟動一個后臺的goroutine持續(xù)同步unsynced的watcher,然后將其遷移到synced組。也就是這種機(jī)制下,Etcd v3 支持從任意版本開始watch,沒有v2的1000條歷史event表限制的問題(當(dāng)然這是指沒有compact的情況下)。

另外我們前面提到的,Etcd v2在通知客戶端時,如果網(wǎng)絡(luò)不好或者客戶端讀取比較慢,發(fā)生了阻塞,則會直接關(guān)閉當(dāng)前連接,客戶端需要重新發(fā)起請求。Etcd v3為了解決這個問題,專門維護(hù)了一個推送時阻塞的watcher隊(duì)列,在另外的goroutine里進(jìn)行重試。

Etcd v3 對過期機(jī)制也做了改進(jìn),過期時間設(shè)置在lease上,然后key和lease關(guān)聯(lián)。這樣可以實(shí)現(xiàn)多個key關(guān)聯(lián)同一個lease id,方便設(shè)置統(tǒng)一的過期時間,以及實(shí)現(xiàn)批量續(xù)約。

相比Etcd v2, Etcd v3的一些主要變化:

  1. 接口通過grpc提供rpc接口,放棄了v2的http接口。優(yōu)勢是長連接效率提升明顯,缺點(diǎn)是使用不如以前方便,尤其對不方便維護(hù)長連接的場景。
  2. 廢棄了原來的目錄結(jié)構(gòu),變成了純粹的kv,用戶可以通過前綴匹配模式模擬目錄。
  3. 內(nèi)存中不再保存value,同樣的內(nèi)存可以支持存儲更多的key。
  4. watch機(jī)制更穩(wěn)定,基本上可以通過watch機(jī)制實(shí)現(xiàn)數(shù)據(jù)的完全同步。
  5. 提供了批量操作以及事務(wù)機(jī)制,用戶可以通過批量事務(wù)請求來實(shí)現(xiàn)Etcd v2的CAS機(jī)制(批量事務(wù)支持if條件判斷)。

七、Etcd,Zookeeper,Consul 比較

這三個產(chǎn)品是經(jīng)常被人拿來做選型比較的。 Etcd 和 Zookeeper 提供的能力非常相似,都是通用的一致性元信息存儲,都提供watch機(jī)制用于變更通知和分發(fā),也都被分布式系統(tǒng)用來作為共享信息存儲,在軟件生態(tài)中所處的位置也幾乎是一樣的,可以互相替代的。二者除了實(shí)現(xiàn)細(xì)節(jié),語言,一致性協(xié)議上的區(qū)別,***的區(qū)別在周邊生態(tài)圈。Zookeeper 是apache下的,用java寫的,提供rpc接口,最早從hadoop項(xiàng)目中孵化出來,在分布式系統(tǒng)中得到廣泛使用(hadoop, solr, kafka, mesos 等)。Etcd 是coreos公司旗下的開源產(chǎn)品,比較新,以其簡單好用的rest接口以及活躍的社區(qū)俘獲了一批用戶,在新的一些集群中得到使用(比如kubernetes)。雖然v3為了性能也改成二進(jìn)制rpc接口了,但其易用性上比 Zookeeper 還是好一些。 而 Consul 的目標(biāo)則更為具體一些,Etcd 和 Zookeeper 提供的是分布式一致性存儲能力,具體的業(yè)務(wù)場景需要用戶自己實(shí)現(xiàn),比如服務(wù)發(fā)現(xiàn),比如配置變更。而Consul 則以服務(wù)發(fā)現(xiàn)和配置變更為主要目標(biāo),同時附帶了kv存儲。 在軟件生態(tài)中,越抽象的組件適用范圍越廣,但同時對具體業(yè)務(wù)場景需求的滿足上肯定有不足之處。

八、Etcd 的周邊工具

1. Confd

在分布式系統(tǒng)中,理想情況下是應(yīng)用程序直接和 Etcd 這樣的服務(wù)發(fā)現(xiàn)/配置中心交互,通過監(jiān)聽 Etcd 進(jìn)行服務(wù)發(fā)現(xiàn)以及配置變更。但我們還有許多歷史遺留的程序,服務(wù)發(fā)現(xiàn)以及配置大多都是通過變更配置文件進(jìn)行的。Etcd 自己的定位是通用的kv存儲,所以并沒有像 Consul 那樣提供實(shí)現(xiàn)配置變更的機(jī)制和工具,而 Confd 就是用來實(shí)現(xiàn)這個目標(biāo)的工具。

Confd 通過watch機(jī)制監(jiān)聽 Etcd 的變更,然后將數(shù)據(jù)同步到自己的一個本地存儲。用戶可以通過配置定義自己關(guān)注那些key的變更,同時提供一個配置文件模板。Confd 一旦發(fā)現(xiàn)數(shù)據(jù)變更就使用***數(shù)據(jù)渲染模板生成配置文件,如果新舊配置文件有變化,則進(jìn)行替換,同時觸發(fā)用戶提供的reload腳本,讓應(yīng)用程序重新加載配置。

Confd 相當(dāng)于實(shí)現(xiàn)了部分 Consul 的agent以及consul-template的功能,作者是kubernetes的Kelsey Hightower,但大神貌似很忙,沒太多時間關(guān)注這個項(xiàng)目了,很久沒有發(fā)布版本,我們著急用,所以fork了一份自己更新維護(hù),主要增加了一些新的模板函數(shù)以及對metad后端的支持。

2. Metad

服務(wù)注冊的實(shí)現(xiàn)模式一般分為兩種,一種是調(diào)度系統(tǒng)代為注冊,一種是應(yīng)用程序自己注冊。調(diào)度系統(tǒng)代為注冊的情況下,應(yīng)用程序啟動后需要有一種機(jī)制讓應(yīng)用程序知道『我是誰』,然后發(fā)現(xiàn)自己所在的集群以及自己的配置。Metad 提供這樣一種機(jī)制,客戶端請求 Metad 的一個固定的接口 /self,由 Metad 告知應(yīng)用程序其所屬的元信息,簡化了客戶端的服務(wù)發(fā)現(xiàn)和配置變更邏輯。

Metad 通過保存一個ip到元信息路徑的映射關(guān)系來做到這一點(diǎn),當(dāng)前后端支持Etcd v3,提供簡單好用的 http rest 接口。 它會把 Etcd 的數(shù)據(jù)通過watch機(jī)制同步到本地內(nèi)存中,相當(dāng)于 Etcd 的一個代理。所以也可以把它當(dāng)做Etcd 的代理來使用,適用于不方便使用 Etcd v3的rpc接口或者想降低 Etcd 壓力的場景。

3. Etcd 集群一鍵搭建腳本

Etcd 官方那個一鍵搭建腳本有bug,我自己整理了一個腳本,通過docker的network功能,一鍵搭建一個本地的 Etcd 集群便于測試和試驗(yàn)。一鍵搭建腳本

九、Etcd 使用注意事項(xiàng)

1. Etcd cluster 初始化的問題

如果集群***次初始化啟動的時候,有一臺節(jié)點(diǎn)未啟動,通過v3的接口訪問的時候,會報(bào)告Error: Etcdserver: not capable 錯誤。這是為兼容性考慮,集群啟動時默認(rèn)的API版本是2.3,只有當(dāng)集群中的所有節(jié)點(diǎn)都加入了,確認(rèn)所有節(jié)點(diǎn)都支持v3接口時,才提升集群版本到v3。這個只有***次初始化集群的時候會遇到,如果集群已經(jīng)初始化完畢,再掛掉節(jié)點(diǎn),或者集群關(guān)閉重啟(關(guān)閉重啟的時候會從持久化數(shù)據(jù)中加載集群API版本),都不會有影響。

2. Etcd 讀請求的機(jī)制

v2 quorum=true 的時候,讀取是通過raft進(jìn)行的,通過cli請求,該參數(shù)默認(rèn)為true。 v3 –consistency=“l” 的時候(默認(rèn))通過raft讀取,否則讀取本地?cái)?shù)據(jù)。sdk 代碼里則是通過是否打開:WithSerializable option 來控制。

一致性讀取的情況下,每次讀取也需要走一次raft協(xié)議,能保證一致性,但性能有損失,如果出現(xiàn)網(wǎng)絡(luò)分區(qū),集群的少數(shù)節(jié)點(diǎn)是不能提供一致性讀取的。但如果不設(shè)置該參數(shù),則是直接從本地的store里讀取,這樣就損失了一致性。使用的時候需要注意根據(jù)應(yīng)用場景設(shè)置這個參數(shù),在一致性和可用性之間進(jìn)行取舍。

3. Etcd 的compact機(jī)制

Etcd 默認(rèn)不會自動compact,需要設(shè)置啟動參數(shù),或者通過命令進(jìn)行compcat,如果變更頻繁建議設(shè)置,否則會導(dǎo)致空間和內(nèi)存的浪費(fèi)。

十、腦洞時間

自動上次 Elasticsearch 的文章之后,給自己安排了一個作業(yè),每次分析源碼后需要提出幾個發(fā)散思維的想法,開個腦洞。

1. 并發(fā)代碼調(diào)用分析追蹤工具

當(dāng)前IDE的代碼調(diào)用分析追蹤都是通過靜態(tài)的代碼分析來追蹤方法調(diào)用鏈實(shí)現(xiàn)的,對閱讀分析代碼非常有用。但程序如果充分使用CSP或者Actor模型后,都通過消息進(jìn)行調(diào)用,沒有了明確的方法調(diào)用鏈,給閱讀和理解代碼帶來了困難。如果語言或者IDE能支持這樣的消息投遞追蹤分析,那應(yīng)該非常有用。當(dāng)然我這個只是腦洞,不考慮實(shí)現(xiàn)的可能性和復(fù)雜度。

2. 實(shí)現(xiàn)一個通用的 multiple group raft庫

當(dāng)前 Etcd 的raft實(shí)現(xiàn)保證了多個節(jié)點(diǎn)數(shù)據(jù)之間的同步,但明顯的一個問題就是擴(kuò)充節(jié)點(diǎn)不能解決容量問題。要想解決容量問題,只能進(jìn)行分片,但分片后如何使用raft同步數(shù)據(jù)?只能實(shí)現(xiàn)一個 multiple group raft,每個分片的多個副本組成一個虛擬的raft group,通過raft實(shí)現(xiàn)數(shù)據(jù)同步。當(dāng)前實(shí)現(xiàn)了multiple group raft的有 TiKV 和 Cockroachdb,但尚未一個獨(dú)立通用的。理論上來說,如果有了這套 multiple group raft,后面掛個持久化的kv就是一個分布式kv存儲,掛個內(nèi)存kv就是分布式緩存,掛個lucene就是分布式搜索引擎。當(dāng)然這只是理論上,要真實(shí)現(xiàn)復(fù)雜度還是不小。

十一、Etcd 的開源產(chǎn)品啟示

Etcd在Zookeeper已經(jīng)奠定江湖地位的情況下,硬是重新造了一個輪子,并且在生態(tài)圈中取得了一席之地。一方面可以看出是社區(qū)的形態(tài)在變化,溝通機(jī)制和對用戶反饋的響應(yīng)越來越重要,另外一方面也可以看出一個項(xiàng)目的易用的重要性有時候甚至高于穩(wěn)定性和功能。新的算法,新的語言都會給重新制造輪子帶來了機(jī)會。

十二、gitchat交流群的問答

1. 問:業(yè)務(wù)使用的etcd v2 升級到 v3 會有什么問題呢,如何平滑過渡?


答:v2的大多數(shù)功能,用v3都能實(shí)現(xiàn),比如用prefix模擬原來的目錄結(jié)構(gòu),用txn模擬CAS,一般不會有什么問題。但因?yàn)関2和v3的數(shù)據(jù)是互相隔離的,所以遷移起來略麻煩。建議先在業(yè)務(wù)中封裝一層,將etcd v2,v3的差異封裝起來,然后通過開關(guān)切換。

2. 問:metad的watch是怎么實(shí)現(xiàn)的?

答:metad的watch實(shí)現(xiàn)的比較簡單,因?yàn)閙etad的watch返回的不是變更事件,而是***的結(jié)果。所以metad只維護(hù)了一個全局版本號,只要發(fā)現(xiàn)客戶端watch的版本小于等于全局版本號,就直接返回***結(jié)果。

3. 問:etcd和zk都是作為分布式配置管理的組件。均提供了watch功能,選主。作為初使用者,這兩個之間的選取該如何?

etcd和zk二者大多數(shù)情況下可以互相替代,都是通用的分布式一致性kv存儲。二者之間選擇建議選擇自己的開發(fā)棧比較接近并且團(tuán)隊(duì)成員比較熟悉的,比如一種是按語言選擇,go語言的項(xiàng)目用etcd,java的用zk,出問題要看源碼也容易些。如果是新項(xiàng)目,糾結(jié)于二者,那可以分裝一層lib,類似于docker/libkv,同時支持兩種,有需要可以切換。

4. 問:etcd和eureka、consul 的異同,以及各自的適用場景,以及選型原則。這個問題其實(shí)可以把zk也包括進(jìn)來,這些都有相同之處。

答:etcd和zk的選型前面講到了,二者的定位都是通用的一致性kv存儲,而eureka和consul的定位則是專做服務(wù)注冊和發(fā)現(xiàn)。前二者的優(yōu)勢當(dāng)然是通用性,應(yīng)用廣泛,部署運(yùn)維的時候容易和已有的服務(wù)一起共用,而同時缺點(diǎn)也是太通用了,每個應(yīng)用的服務(wù)注冊都有自己的一套元數(shù)據(jù)格式,互相整合起來就比較麻煩了,比如想做個通用的api gateway就會遇到元數(shù)據(jù)格式兼容問題。這也成為后二者的優(yōu)勢。同時因?yàn)楹蠖叩哪繕?biāo)比較具體,所以可以做一些更高級的功能,比如consul的DNS支持,consul-template工具,eureka的事件訂閱過濾機(jī)制。Eureka本身的實(shí)現(xiàn)是一個AP系統(tǒng),也就是說犧牲了一致性,它認(rèn)為在服務(wù)發(fā)現(xiàn)和配置中心這個場景下,可用性和分區(qū)容錯比一致性更重要。 我個人其實(shí)更期待后二者的這種專門的解決方案,要是能形成服務(wù)注冊標(biāo)準(zhǔn),那以后應(yīng)用之間互相交互就容易了。但也有個可能是這種標(biāo)準(zhǔn)由集群調(diào)度系統(tǒng)來形成事實(shí)標(biāo)準(zhǔn)。

后二者我了解的也不深入,感覺可以另起一篇文章了。

5. 問:接上面,etcd和zk各自都有哪些坑可能會被踩到,都有多坑。掉進(jìn)去了如何爬起來?

答:這個坑的概念比較太廣泛了,更詳細(xì)的可以翻bug列表。但使用中的大多數(shù)坑一般有幾種:

誤用導(dǎo)致的坑。要先認(rèn)識清楚etcd,zk的定位,它需要保存的是整個集群共享的信息,不能當(dāng)存儲用。比如有人在某個zk的某個數(shù)據(jù)節(jié)點(diǎn)下創(chuàng)建了大量的子節(jié)點(diǎn),然后獲取,導(dǎo)致zk報(bào)錯,zk的buffer有個4mb的限制,超過就會報(bào)錯。

運(yùn)維方面的坑。etcd,zk這種服務(wù),一般都比較穩(wěn)定,搭建好后都不用管,但萬一某些節(jié)點(diǎn)出問題了,要增加節(jié)點(diǎn)恢復(fù)系統(tǒng)的時候,可能沒有預(yù)案或者操作經(jīng)驗(yàn),導(dǎo)致弄壞集群。

網(wǎng)絡(luò)分區(qū)以及可用性設(shè)計(jì)的坑。設(shè)計(jì)系統(tǒng)的時候,要想清楚如果etcd或zk整個掛了,或者出現(xiàn)網(wǎng)絡(luò)分區(qū),應(yīng)用的一部分節(jié)點(diǎn)只能連接到少數(shù)派的etcd/zk(少數(shù)派不可用)的時候,應(yīng)用會有什么表現(xiàn)。這種情況下,應(yīng)用的正確表現(xiàn)應(yīng)該是服務(wù)正常運(yùn)作,但不支持變更,等etcd/zk集群恢復(fù)后就自動恢復(fù)了。但如果設(shè)計(jì)不當(dāng),有自動化的一些行為,可能帶來的故障就大了。

想要少踩坑,一個辦法就是我文中提到的,研究原理知其然同時知其所以然,另外一個問題就是多試驗(yàn),出了問題有預(yù)案。

6. 問:一個實(shí)驗(yàn)性質(zhì)的硬件集群項(xiàng)目的幾個問題

我們實(shí)現(xiàn)了基于Arm的分布式互聯(lián)的硬件集群(方法參考的是https://edcashin.wordpress.com/2013/12/29/trying-etcd-on-android-mac-and-raspberry-pi/comment-page-1/ 將etcd跑在Arm開發(fā)板上),將Etcd當(dāng)作一個分布式的數(shù)據(jù)庫使用(但是Etcd本身運(yùn)行在這些硬件之上),然后參考go-rpiohttps://github.com/stianeikeland/go-rpio 實(shí)現(xiàn)基于etcd的key-value同步硬件的信息,控制某些GPIO。

問題1:目前已知Etcd可以為別的服務(wù)提供服務(wù)發(fā)現(xiàn),在這個場景下假設(shè)已經(jīng)存在5個運(yùn)行Etcd節(jié)點(diǎn)的硬件,當(dāng)一個新的Etcd硬件節(jié)點(diǎn)被安裝時,Etcd能否為自己提供服務(wù)發(fā)現(xiàn)服務(wù),實(shí)現(xiàn)Etcd節(jié)點(diǎn)的自動發(fā)現(xiàn)與加入?

問題2:隨著硬件安裝規(guī)模的增加,Etcd的極限是多少,raft是否會因?yàn)楣?jié)點(diǎn)的變多,心跳包的往返而導(dǎo)致同步一次的等待時間變長?

問題3:當(dāng)規(guī)模足夠大,發(fā)生網(wǎng)絡(luò)分區(qū)時,是否分區(qū)較小的一批硬件之間的數(shù)據(jù)是無法完成同步的?

答:這個案例挺有意思,我一個一個回答。

etcd本來是做服務(wù)發(fā)現(xiàn)的,如果etcd集群也需要服務(wù)發(fā)現(xiàn),那就再來一個etcd集群 :)。你可以自己搭建一個etcd cluster或者用etcd官方提供的 discovery.etcd.io。詳細(xì)參看:etcd 官方的 op-guide/clustering

etcd的機(jī)制是多節(jié)點(diǎn)一致的,所以它的極限有兩部分,一是單機(jī)的容量限制,內(nèi)存和磁盤。二是網(wǎng)絡(luò)開銷,每次raft操作需要所有節(jié)點(diǎn)參與,節(jié)點(diǎn)越多性能越低。所以擴(kuò)展很多etcd節(jié)點(diǎn)是沒有意義的,一般是 3,5,7,9。再多感覺就沒意義了。如果你們不太在意一致性,建議讀請求可以不通過一致性協(xié)議,直接讀取節(jié)點(diǎn)本地?cái)?shù)據(jù)。具體方式文中有說明。

etcd網(wǎng)絡(luò)分區(qū)時,少數(shù)派是不可用狀態(tài),不支持raft請求,但支持非一致性讀請求。

7. 問:如果跨機(jī)房部署服務(wù),是部署兩套ETCD嗎?如果跨機(jī)房部署,如何部署及配置?

答:這個要看跨機(jī)房的場景。如果是完全無關(guān)聯(lián)需要公網(wǎng)連接的兩個機(jī)房,服務(wù)之間一般也不需要共享數(shù)據(jù)吧?部署兩套互不相干的etcd,各用各的比較合適。但如果是類似于aws的可用區(qū)的概念,兩個機(jī)房內(nèi)網(wǎng)互通,搭建兩套集群為了避免機(jī)房故障,可以隨時切換。這個etcd當(dāng)前沒有太好的解決辦法,建議的辦法是跨可用區(qū)部署一個etcd cluster,調(diào)整心跳以及選舉超時時間,這個辦法如果有3個可用區(qū)機(jī)房,每個機(jī)房3個節(jié)點(diǎn),掛任何一個機(jī)房都不影響整個集群,但兩個機(jī)房就比較尷尬。還有個辦法是兩個集群之間同步,這個etcdv3提供了一個mirror的工具,但還是不太完善,不過感覺用etcd的watch機(jī)制做一個同步工具也不難。這個機(jī)制consul倒是提供了,多數(shù)據(jù)中心的集群數(shù)據(jù)同步,互相不影響可用性。

【本文是51CTO專欄作者“王淵命”的原創(chuàng)文章,轉(zhuǎn)載請聯(lián)系作者本人獲取授權(quán)】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2020-05-19 21:40:35

Tomcat架構(gòu)Connector

2013-04-07 17:57:16

SDN網(wǎng)絡(luò)架構(gòu)

2024-08-15 08:03:52

2024-09-29 08:00:00

動態(tài)代理RPC架構(gòu)微服務(wù)架構(gòu)

2023-08-21 08:31:40

LinuxNFSD架構(gòu)

2025-03-27 04:10:00

2019-01-16 16:46:49

Go存儲etcd

2019-12-16 15:39:48

Etcd存儲Go

2017-01-13 10:51:13

RPC模型解析

2023-12-22 13:58:00

C++鏈表開發(fā)

2009-03-03 09:13:36

工作流BPM業(yè)務(wù)流程

2023-07-06 12:39:14

RedisLRULFU

2018-11-09 10:09:38

RAC硬件軟件

2023-11-26 13:36:20

協(xié)議Raft

2021-07-01 11:56:04

etcd-wal模塊解析數(shù)據(jù)庫

2023-08-08 09:52:13

系統(tǒng)端架構(gòu)NFS

2011-06-13 16:20:25

網(wǎng)站信息架構(gòu)收錄流量

2017-07-07 14:30:27

Flink架構(gòu)拓?fù)?/a>

2022-03-25 10:48:40

NBF架構(gòu)設(shè)計(jì)

2025-08-04 06:05:00

RAG大型語言模型語言模型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

日韩成人av免费| 亚洲欧洲免费无码| 国产精品白浆一区二小说| 天堂成人娱乐在线视频免费播放网站| 色欧美日韩亚洲| 在线视频不卡一区二区| www.热久久| 快she精品国产999| 久久国产精彩视频| 9.1成人看片免费版| 国产精品美女久久久久人| 亚洲成av人片一区二区| 亚洲精品国产精品国自产| 亚洲av永久纯肉无码精品动漫| 中文高清一区| 精品国偷自产在线| 亚洲av无码国产精品久久| 日韩成人免费av| 精品国产91久久久久久老师| 中文字幕一区二区三区四区五区六区 | 国产视频一视频二| 免费黄色网页在线观看| 国产传媒欧美日韩成人| 国产精品69久久久久| 青青草激情视频| 日韩激情在线| 亚洲国产精品国自产拍av秋霞| 性chinese极品按摩| 自拍视频在线看| 一区二区三区在线免费播放| 日本不卡在线观看| 日韩一级片免费在线观看| 韩国一区二区在线观看| 国产成人福利网站| 国产成人无码精品久久久久| 欧美91精品| 日韩综合中文字幕| 中文字幕在线观看免费高清 | 日本电影一区二区三区| 亚洲男人天堂久久| 国产一区亚洲一区| 国产精自产拍久久久久久蜜| 欧美在线观看不卡| 亚洲经典自拍| 欧美精品福利在线| 中国一级片在线观看| 日韩理论电影| 在线播放精品一区二区三区| 国产ts丝袜人妖系列视频| 成人av地址| 欧美大片一区二区| 超碰人人cao| 国产一区二区在线观| 欧美裸体bbwbbwbbw| 狠狠操狠狠干视频| 国产精品亚洲成在人线| 欧美日韩一区二区三区免费看| 熟女人妇 成熟妇女系列视频| 樱花草涩涩www在线播放| 婷婷开心激情综合| 中国丰满人妻videoshd| 成人欧美magnet| 色婷婷激情久久| 国产精品免费成人| 羞羞影院欧美| 欧洲精品在线观看| 国产精品区在线| 白嫩亚洲一区二区三区| 日韩视频免费观看高清完整版在线观看 | 久草视频手机在线观看| 欧美激情视频一区二区三区在线播放| 久久影院资源网| 久久久www成人免费毛片| 国产精品成人一区二区网站软件| 欧美—级高清免费播放| 国产 日韩 欧美 在线| 美女精品网站| 国产精品丝袜白浆摸在线| 国产又黄又粗又猛又爽| 国产ts人妖一区二区| 精品久久一区二区三区蜜桃| 人成在线免费视频| 国产精品人成在线观看免费| 欧美少妇一级片| 黄色大片在线| 91精品福利在线| 97超碰人人看| 日韩中出av| 日韩视频免费看| 久久精品国产亚洲av高清色欲| 国产精品综合色区在线观看| 国产精品观看在线亚洲人成网| 国产免费黄色片| 久久综合九色综合97婷婷女人| 视频一区视频二区视频三区高| 成年人网站在线| 激情av一区二区| 日本在线一二三区| 久久草在线视频| 深夜精品寂寞黄网站在线观看| 久久久久久激情| 石原莉奈在线亚洲三区| 亚洲a区在线视频| 免费av在线电影| 成人欧美一区二区三区白人 | 欧美日韩视频网站| 日韩亚洲欧美在线| 亚洲精品国产91| 欧美日韩视频一区二区三区| 国产激情视频一区| 亚洲精品911| 亚洲欧美在线aaa| 国产肥臀一区二区福利视频| 久久的色偷偷| 一区二区亚洲精品国产| 国产无遮挡又黄又爽在线观看| 久久福利视频一区二区| 久久久久久久久久久久久久久久av| 888av在线| 欧美日韩中国免费专区在线看| 久久艹这里只有精品| 国产精品一国产精品| 韩国精品久久久999| 97人妻精品一区二区三区| 久久精品亚洲一区二区三区浴池| 黄色一级大片免费| 欧美91在线|欧美| 亚洲欧美制服综合另类| 日本三级网站在线观看| 国产高清亚洲一区| 26uuu成人| 成人精品国产亚洲| 亚洲精品自在久久| 日本一区二区网站| 国产成人精品亚洲777人妖| 中国成人在线视频| 成人全视频在线观看在线播放高清| 国产视频久久网| 亚洲一区欧美在线| 不卡的av网站| 全黄性性激高免费视频| 99久久人爽人人添人人澡| 欧美成aaa人片免费看| 亚洲天堂网在线观看视频| 国产欧美视频在线观看| 免费在线观看的毛片| 宅男在线一区| 国产精品aaaa| av在线之家电影网站| 日本精品免费观看高清观看| 美国黄色一级毛片| 免播放器亚洲| 欧美在线3区| 成人在线观看免费视频| 中文在线不卡视频| 一区二区三区亚洲视频| 亚洲欧美色图小说| 韩国三级hd中文字幕有哪些| 欧美精品18| 国产精品theporn88| sm久久捆绑调教精品一区| 日韩大陆毛片av| 在线永久看片免费的视频| 国产香蕉久久精品综合网| 日本美女高潮视频| 小小影院久久| 97人人干人人| 九色porny丨入口在线| 精品亚洲男同gayvideo网站| 波多野结衣绝顶大高潮| 中文字幕不卡在线观看| 夜夜爽久久精品91| 亚洲经典三级| 亚洲高清在线观看一区| 韩国一区二区三区视频| 久久久亚洲网站| 欧美女子与性| 91麻豆精品91久久久久同性| 精品深夜av无码一区二区老年| 91在线视频网址| 国产理论在线播放| 欧美成人一区二免费视频软件| 国产美女在线精品免费观看| 88xx成人永久免费观看| 久久久av一区| 天天射天天色天天干| 在线观看成人免费视频| 青娱乐国产盛宴| 久久久久久麻豆| 久久久久久蜜桃一区二区| 国产精品大片| 日韩一区免费观看| 97成人在线| 国产精品欧美亚洲777777| 视频在线观看入口黄最新永久免费国产| 亚洲精品黄网在线观看| 中文天堂在线资源| 亚洲成人一区在线| 2017亚洲天堂| 91丨九色丨尤物| 亚洲精品在线网址| 性欧美长视频| 99久热在线精品视频| 教室别恋欧美无删减版| 国产精品日韩欧美一区二区三区| 123成人网| 55夜色66夜色国产精品视频| 成人在线app| 亚洲视频免费一区| 天堂在线视频网站| 欧美精品v日韩精品v韩国精品v| 毛片基地在线观看| 亚洲精品你懂的| 手机免费看av| 成人sese在线| 国产xxxxhd| 精品一区二区三区视频在线观看| av免费中文字幕| 激情欧美国产欧美| 国产精品jizz在线观看老狼| 久久超碰99| 久久国产手机看片| gogo人体一区| 97免费高清电视剧观看| 91亚洲精品在看在线观看高清| 国产精品免费久久久久久| 在线天堂资源| 9.1国产丝袜在线观看| 日韩精品卡一| 欧美激情第99页| 成人免费视屏| 久久久999成人| 色影院视频在线| 最近2019年好看中文字幕视频 | 国产一区二区波多野结衣| 日本久久一区二区三区| 中文字幕亚洲精品一区| 精品美女永久免费视频| 日本一级淫片色费放| 亚洲国产成人高清精品| 久久久综合久久久| 亚洲永久精品国产| 久久久久久久久97| 亚洲制服丝袜在线| 国产亚洲精品成人| 亚洲图片有声小说| 日本a在线观看| 欧美日韩加勒比精品一区| 福利一区二区三区四区| 亚洲国产精品天堂| 男女视频免费看| 欧美色道久久88综合亚洲精品| 免费在线不卡视频| 狠狠躁天天躁日日躁欧美| 欧美亚洲天堂网| 精品久久久免费| 国产精品第5页| 欧美在线视频日韩| 在线观看国产一区二区三区| 欧美日本一区二区在线观看| 91在线观看喷潮| 日韩欧美色电影| 日批视频免费播放| 亚洲精品视频中文字幕| 国产三区四区在线观看| 色一区av在线| 污的网站在线观看| 国内精品一区二区三区| 国产精品av一区二区三区| 国产精品久久激情| 成人在线精品| 国产一区不卡在线观看| 久久av超碰| 中文字幕日韩一区二区三区不卡| 欧美视频一区| 免费在线激情视频| 久久99蜜桃精品| 午夜视频在线观看国产| 国产午夜亚洲精品理论片色戒| 蜜桃av.com| 午夜精彩视频在线观看不卡| 超碰在线观看91| 日韩一区二区三区av| 无套内谢的新婚少妇国语播放| 亚洲国产精品嫩草影院久久| 国产高清美女一级毛片久久| 久久国产精品网站| 69久成人做爰电影| 亚洲一区二区三区成人在线视频精品 | 777色狠狠一区二区三区| 成人乱码一区二区三区| 亚洲深夜福利在线| 在线不卡日本v二区707| 日本久久久久久久| 无码国模国产在线观看| 欧美日韩精品免费观看 | 日韩精品 欧美| 久久国产精品无码网站| av无码一区二区三区| 中文字幕在线一区二区三区| 日本在线免费观看| 91精品蜜臀在线一区尤物| 亚洲欧美日本在线观看| 久久中文字幕在线视频| 黑人巨大精品| 国产成人亚洲欧美| 97在线精品| 久久久久久久久久久久久国产精品| 国产在线视频一区二区三区| 欧美黄色一级生活片| 亚洲图片欧美综合| 国产精品久久久久久无人区 | 97se亚洲综合| 青青草国产免费一区二区下载 | 亚洲视频精品一区| 中文亚洲字幕| 91丨porny丨九色| 国产精品第一页第二页第三页| 久久一区二区三区视频| 日韩三级电影网址| 欧美成年黄网站色视频| 日本一区二区三区四区视频| 国产精品xxxav免费视频| 在线观看欧美亚洲| 日本不卡一区二区三区高清视频| 亚洲一区二区在线免费| 亚洲一区二区三区三| 国产精品国产三级国产普通话对白| 亚洲午夜国产成人av电影男同| 国产欧洲在线| 国产日韩欧美亚洲一区| 欧美日韩国产在线一区| 97超碰人人看| 一区二区三区在线视频免费| 国产男女无套免费网站| xxx欧美精品| 国产电影一区二区| 宅男噜噜99国产精品观看免费| 琪琪一区二区三区| 久久丫精品忘忧草西安产品| 一本久久综合亚洲鲁鲁五月天| 天堂在线中文资源| 欧美一区二区.| 日韩在线黄色| 久久久久久久久久福利| 国产色一区二区| 日韩欧美国产另类| 国产一区二区久久精品| 国产经典一区| 一区二区三区av| 国产一区二区三区四区五区入口 | 午夜国产不卡在线观看视频| 免费观看黄色一级视频| 久久露脸国产精品| 欧美色图婷婷| 无码无遮挡又大又爽又黄的视频| 久久蜜桃av一区二区天堂| 黄色免费av网站| 一区二区三区四区精品| 四虎国产精品免费久久5151| 红桃一区二区三区| 处破女av一区二区| 久久久久久久黄色片| 亚洲色图欧美制服丝袜另类第一页| 自拍偷自拍亚洲精品被多人伦好爽| 日韩欧美三级电影| 精品一区二区免费在线观看| 劲爆欧美第一页| 日韩av中文字幕在线| 台湾佬成人网| 永久久久久久| 懂色av一区二区三区免费观看 | 91破解版在线观看| 欧美日韩亚洲一区二区三区在线观看 | 137大胆人体在线观看| 91美女片黄在线观看游戏| 国内精品99| ass精品国模裸体欣赏pics| 欧美视频中文字幕| 丝袜美女在线观看| 免费观看国产成人| 久久av中文字幕片| 久久激情免费视频| 亚洲欧美中文日韩在线v日本| 亚洲老司机网| 女性女同性aⅴ免费观女性恋| 国产欧美一区二区精品性| 99热精品在线播放| 欧美在线视频免费播放| 91久久高清国语自产拍| www.男人天堂| 欧美二区乱c少妇| 蜜桃视频动漫在线播放| 在线国产伦理一区| 久久综合狠狠综合久久综合88 | 精品欧美视频| 国产黄色特级片| 亚洲制服欧美中文字幕中文字幕| 免费在线视频你懂得| 999在线观看免费大全电视剧|