Etcd是go語言開發(fā)的一個(gè)開源的,高可用的分布式key-value存儲(chǔ)系統(tǒng),可以用于配置共享和服務(wù)的注冊和發(fā)現(xiàn)。
Etcd具有以下特點(diǎn):
·? ? 完全復(fù)制:集群中的每個(gè)節(jié)點(diǎn)都可以使用完整的存檔。
·? ? 高可用性:Etcd可用于避免硬件的單點(diǎn)故障或網(wǎng)絡(luò)問題。
·? ? 一致性:每次讀取都會(huì)返回跨多主機(jī)的最新寫入。
·? ? 簡單:包括定義良好,面向用戶的API(gRPC)。
·? ? 安全:實(shí)現(xiàn)了帶有可選的客戶端證書身份驗(yàn)證和自動(dòng)化TLS。
·? ? 快速:每秒10000次寫入的基準(zhǔn)速度。
·? ? 可靠:使用Raft算法實(shí)現(xiàn)了強(qiáng)一致,高可用的服務(wù)存儲(chǔ)目錄。
Etcd應(yīng)用場景:
服務(wù)發(fā)現(xiàn)
? ? ? ? 服務(wù)發(fā)現(xiàn)要解決的也是分布式系統(tǒng)中常見的問題之一,即在同一個(gè)分布式集群中的進(jìn)程或服務(wù),要如何才能找到對(duì)方并建立鏈接。本質(zhì)上來說,服務(wù)發(fā)現(xiàn)就是想要了解集群中是否有監(jiān)聽UDP或者TCP端口,并且通過名字就可以查找和連接。

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

Etcd相對(duì)ZooKeeper的優(yōu)缺點(diǎn):
????????etcd實(shí)現(xiàn)的這些功能,ZooKeeper都可以實(shí)現(xiàn)。那么為什么要使用Etcd而不使用ZooKeeper呢?其實(shí)相比之下
ZooKeeper有如下缺點(diǎn):
? ? ? ? 1.復(fù)雜:ZooKeeper的部署維護(hù)復(fù)雜,管理員需要掌握一系列的只是和技能;而Paxos強(qiáng)一致性算法也是素來以復(fù)雜難懂而聞名于世。另外ZooKeeper的使用也比較復(fù)雜,需要安裝客戶端,官網(wǎng)只提供了Java和C兩種語言的接口。
? ? ? ? 2.Jave編寫。因?yàn)镴ava本身偏向于重型應(yīng)用,它會(huì)引入大量的依賴。而運(yùn)維人員則普遍希望保持強(qiáng)一致性,高可用的機(jī)器集群盡可能的簡單,這樣維護(hù)起來也不易出錯(cuò)。
? ? ? ? 3.發(fā)展緩慢。Apache基金會(huì)項(xiàng)目特有的"Apache Way"在開源界飽受爭議,其中最大的原因是由于基金會(huì)龐大的結(jié)構(gòu)以及松散的管理導(dǎo)致項(xiàng)目發(fā)展緩慢。
Etcd的優(yōu)點(diǎn):
? ? ? ? 1.使用GO語言編寫部署簡單;使用HTTP作為接口使用簡單;使用Raft算法保證強(qiáng)一致性讓用戶易于理解
? ? ? ? 2.數(shù)據(jù)持久化;Etcd默認(rèn)數(shù)據(jù)一更新就進(jìn)行持久化。
? ? ? ? 3.安全。Etcd支持SSL客戶端安全認(rèn)證。
最后Etcd作為一個(gè)年輕的項(xiàng)目,真正告訴迭代和開發(fā)中,這既是一個(gè)優(yōu)點(diǎn)也是一個(gè)缺點(diǎn)。優(yōu)點(diǎn)是它的未來具有無限可能性,缺點(diǎn)是無法得到大項(xiàng)目長時(shí)間使用的檢驗(yàn)。然而,目前CoreOS,Kubernetes和CloudFoundry等一些知名項(xiàng)目均在生產(chǎn)環(huán)境使用了Etcd,所以總的來說,Etcd是一個(gè)不錯(cuò)的選擇。
Etcd架構(gòu)

從上圖中,可以看到,Etcd主要分為四個(gè)部分。
1.HTTP Server:用于處理用戶發(fā)送的API請(qǐng)求以及其他的etcd節(jié)點(diǎn)的同步與心跳信息請(qǐng)求。
2.Store:用于處理Etcd支持各類功能的事務(wù),包括數(shù)據(jù)索引,節(jié)點(diǎn)狀態(tài)變更,監(jiān)控與反饋,事件處理與執(zhí)行等等,是etcd對(duì)用戶大多數(shù)API功能具體的實(shí)現(xiàn)。
3.Raft:Raft強(qiáng)一致性算法的具體實(shí)現(xiàn),是etcd的核心。
4.WAL:Write Ahead Log(預(yù)寫式日志),是etcd的數(shù)據(jù)存儲(chǔ)方式。除了在內(nèi)存中存有所有數(shù)據(jù)的狀態(tài)以及節(jié)點(diǎn)的索引以外,etcd就是通過WAL進(jìn)行持久化數(shù)據(jù)存儲(chǔ)。WAL中,所有的數(shù)據(jù)提交前都會(huì)事先記錄日志。Snapshot是為了防止數(shù)據(jù)過多而進(jìn)行的狀態(tài)快照;Entry表示存儲(chǔ)的具體日志內(nèi)容。
Etcd集群:
? ? ? ? 注:etcd作為一個(gè)高可用的鍵值存儲(chǔ)系統(tǒng),天生就是為了集群化而設(shè)計(jì)的。由于Raft算法在做決策時(shí)需要多數(shù)節(jié)點(diǎn)的投票,所以etcd一般都部署集群推薦奇數(shù)個(gè)節(jié)點(diǎn),推薦數(shù)量為3,5或者7個(gè)節(jié)點(diǎn)構(gòu)成一個(gè)集群。