etcd組件作為一個(gè)高可用強(qiáng)一致性的服務(wù)發(fā)現(xiàn)存儲(chǔ)倉(cāng)庫(kù).
etcd作為一個(gè)受到ZooKeeper與doozer啟發(fā)而催生的項(xiàng)目,除了擁有與之類似的功能外,更專注于以下四點(diǎn)。
簡(jiǎn)單:基于HTTP+JSON的API讓你用curl就可以輕松使用。
安全:可選SSL客戶認(rèn)證機(jī)制。
快速:每個(gè)實(shí)例每秒支持一千次寫操作。
可信:使用Raft算法充分實(shí)現(xiàn)了分布式。
場(chǎng)景一:服務(wù)發(fā)現(xiàn)(Service Discovery)一個(gè)強(qiáng)一致性、高可用的服務(wù)存儲(chǔ)目錄。基于Raft算法的etcd天生就是這樣一個(gè)強(qiáng)一致性高可用的服務(wù)存儲(chǔ)目錄。一種注冊(cè)服務(wù)和監(jiān)控服務(wù)健康狀態(tài)的機(jī)制。用戶可以在etcd中注冊(cè)服務(wù),并且對(duì)注冊(cè)的服務(wù)設(shè)置key TTL
,定時(shí)保持服務(wù)的心跳以達(dá)到監(jiān)控健康狀態(tài)的效果。一種查找和連接服務(wù)的機(jī)制。通過(guò)在etcd指定的主題下注冊(cè)的服務(wù)也能在對(duì)應(yīng)的主題下查找到。為了確保連接,我們可以在每個(gè)服務(wù)機(jī)器上都部署一個(gè)Proxy模式的etcd,這樣就可以確保能訪問(wèn)etcd集群的服務(wù)都能互相連接。

微服務(wù)協(xié)同工作架構(gòu)中,服務(wù)動(dòng)態(tài)添加。隨著Docker容器的流行,多種微服務(wù)共同協(xié)作,構(gòu)成一個(gè)相對(duì)功能強(qiáng)大的架構(gòu)的案例越來(lái)越多。透明化的動(dòng)態(tài)添加這些服務(wù)的需求也日益強(qiáng)烈。通過(guò)服務(wù)發(fā)現(xiàn)機(jī)制,在etcd中注冊(cè)某個(gè)服務(wù)名字的目錄,在該目錄下存儲(chǔ)可用的服務(wù)節(jié)點(diǎn)的IP。在使用服務(wù)的過(guò)程中,只要從服務(wù)目錄下查找可用的服務(wù)節(jié)點(diǎn)去使用即可。

PaaS平臺(tái)中應(yīng)用多實(shí)例與實(shí)例故障重啟透明化。PaaS平臺(tái)中的應(yīng)用一般都有多個(gè)實(shí)例,通過(guò)域名,不僅可以透明的對(duì)這多個(gè)實(shí)例進(jìn)行訪問(wèn),而且還可以做到負(fù)載均衡。但是應(yīng)用的某個(gè)實(shí)例隨時(shí)都有可能故障重啟,這時(shí)就需要?jiǎng)討B(tài)的配置域名解析(路由)中的信息。通過(guò)etcd的服務(wù)發(fā)現(xiàn)功能就可以輕松解決這個(gè)動(dòng)態(tài)配置的問(wèn)題。

場(chǎng)景二:消息發(fā)布與訂閱
在分布式系統(tǒng)中,最適用的一種組件間通信方式就是消息發(fā)布與訂閱。即構(gòu)建一個(gè)配置共享中心,數(shù)據(jù)提供者在這個(gè)配置中心發(fā)布消息,而消息使用者則訂閱他們關(guān)心的主題,一旦主題有消息發(fā)布,就會(huì)實(shí)時(shí)通知訂閱者。通過(guò)這種方式可以做到分布式系統(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)用(或主題)來(lái)分配收集任務(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接口,來(lái)獲取一些運(yùn)行時(shí)的信息。引入etcd之后,就不用自己實(shí)現(xiàn)一套方案了,只要將這些信息存放到指定的etcd目錄中即可,etcd的這些目錄就可以通過(guò)HTTP的接口在外部訪問(wèn)

場(chǎng)景三:負(fù)載均衡
在場(chǎng)景一
中也提到了負(fù)載均衡,本文所指的負(fù)載均衡均為軟負(fù)載均衡。分布式系統(tǒng)中,為了保證服務(wù)的高可用以及數(shù)據(jù)的一致性,通常都會(huì)把數(shù)據(jù)和服務(wù)部署多份,以此達(dá)到對(duì)等服務(wù),即使其中的某一個(gè)服務(wù)失效了,也不影響使用。由此帶來(lái)的壞處是數(shù)據(jù)寫入性能下降,而好處則是數(shù)據(jù)訪問(wèn)時(shí)的負(fù)載均衡。因?yàn)槊總€(gè)對(duì)等服務(wù)節(jié)點(diǎn)上都存有完整的數(shù)據(jù),所以用戶的訪問(wèn)流量就可以分流到不同的機(jī)器上。
etcd本身分布式架構(gòu)存儲(chǔ)的信息訪問(wèn)支持負(fù)載均衡。etcd集群化以后,每個(gè)etcd的核心節(jié)點(diǎn)都可以處理用戶的請(qǐng)求。所以,把數(shù)據(jù)量小但是訪問(wèn)頻繁的消息數(shù)據(jù)直接存儲(chǔ)到etcd中也是個(gè)不錯(cuò)的選擇,如業(yè)務(wù)系統(tǒng)中常用的二級(jí)代碼表(在表中存儲(chǔ)代碼,在etcd中存儲(chǔ)代碼所代表的具體含義,業(yè)務(wù)系統(tǒng)調(diào)用查表的過(guò)程,就需要查找表中代碼的含義)。
利用etcd維護(hù)一個(gè)負(fù)載均衡節(jié)點(diǎn)表。etcd可以監(jiān)控一個(gè)集群中多個(gè)節(jié)點(diǎn)的狀態(tài),當(dāng)有一個(gè)請(qǐng)求發(fā)過(guò)來(lái)后,可以輪詢式的把請(qǐng)求轉(zhuǎn)發(fā)給存活著的多個(gè)狀態(tài)。類似KafkaMQ,通過(guò)ZooKeeper來(lái)維護(hù)生產(chǎn)者和消費(fèi)者的負(fù)載均衡。同樣也可以用etcd來(lái)做ZooKeeper的工作。

場(chǎng)景四:分布式通知與協(xié)調(diào)
這里說(shuō)到的分布式通知與協(xié)調(diào),與消息發(fā)布和訂閱有些相似。都用到了etcd中的Watcher機(jī)制,通過(guò)注冊(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)處理。
通過(guò)etcd進(jìn)行低耦合的心跳檢測(cè)。檢測(cè)系統(tǒng)和被檢測(cè)系統(tǒng)通過(guò)etcd上某個(gè)目錄關(guān)聯(lián)而非直接關(guān)聯(lián)起來(lái),這樣可以大大減少系統(tǒng)的耦合性。
通過(guò)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ù)。
通過(guò)etcd完成工作匯報(bào)。大部分類似的任務(wù)分發(fā)系統(tǒng),子任務(wù)啟動(dòng)后,到etcd來(lái)注冊(cè)一個(gè)臨時(shí)工作目錄,并且定時(shí)將自己的進(jìn)度進(jìn)行匯報(bào)(將進(jìn)度寫入到這個(gè)臨時(shí)目錄),這樣任務(wù)管理者就能夠?qū)崟r(shí)知道任務(wù)進(jìn)度。

場(chǎng)景五:分布式鎖
因?yàn)閑tcd使用Raft算法保持了數(shù)據(jù)的強(qiáng)一致性,某次操作存儲(chǔ)到集群中的值必然是全局一致的,所以很容易實(shí)現(xiàn)分布式鎖。鎖服務(wù)有兩種使用方式,一是保持獨(dú)占,二是控制時(shí)序。
保持獨(dú)占即所有獲取鎖的用戶最終只有一個(gè)可以得到。etcd為此提供了一套實(shí)現(xiàn)分布式鎖原子操作CAS(CompareAndSwap
)的API。通過(guò)設(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)。

場(chǎng)景六:分布式隊(duì)列
分布式隊(duì)列的常規(guī)用法與場(chǎng)景五中所描述的分布式鎖的控制時(shí)序用法類似,即創(chuàng)建一個(gè)先進(jìn)先出的隊(duì)列,保證順序。
另一種比較有意思的實(shí)現(xiàn)是在保證隊(duì)列達(dá)到某個(gè)條件時(shí)再統(tǒng)一按順序執(zhí)行。這種方法的實(shí)現(xiàn)可以在/queue這個(gè)目錄中另外建立一個(gè)/queue/condition節(jié)點(diǎn)。
condition可以表示隊(duì)列大小。比如一個(gè)大的任務(wù)需要很多小任務(wù)就緒的情況下才能執(zhí)行,每次有一個(gè)小任務(wù)就緒,就給這個(gè)condition數(shù)字加1,直到達(dá)到大任務(wù)規(guī)定的數(shù)字,再開始執(zhí)行隊(duì)列里的一系列小任務(wù),最終執(zhí)行大任務(wù)。
condition可以表示某個(gè)任務(wù)在不在隊(duì)列。這個(gè)任務(wù)可以是所有排序任務(wù)的首個(gè)執(zhí)行程序,也可以是拓?fù)浣Y(jié)構(gòu)中沒(méi)有依賴的點(diǎn)。通常,必須執(zhí)行這些任務(wù)后才能執(zhí)行隊(duì)列中的其他任務(wù)。
condition還可以表示其它的一類開始執(zhí)行任務(wù)的通知??梢杂煽刂瞥绦蛑付ǎ?dāng)condition出現(xiàn)變化時(shí),開始執(zhí)行隊(duì)列任務(wù)。

場(chǎng)景七:集群監(jiān)控與Leader競(jìng)選
通過(guò)etcd來(lái)進(jìn)行監(jiān)控實(shí)現(xiàn)起來(lái)非常簡(jiǎn)單并且實(shí)時(shí)性強(qiáng)。
前面幾個(gè)場(chǎng)景已經(jīng)提到Watcher機(jī)制,當(dāng)某個(gè)節(jié)點(diǎn)消失或有變動(dòng)時(shí),Watcher會(huì)第一時(shí)間發(fā)現(xiàn)并告知用戶。
節(jié)點(diǎn)可以設(shè)置TTL key
,比如每隔30s發(fā)送一次心跳使代表該機(jī)器存活的節(jié)點(diǎn)繼續(xù)存在,否則節(jié)點(diǎn)消失。
這樣就可以第一時(shí)間檢測(cè)到各節(jié)點(diǎn)的健康狀態(tài),以完成集群的監(jiān)控要求。
另外,使用分布式鎖,可以完成Leader競(jìng)選。這種場(chǎng)景通常是一些長(zhǎng)時(shí)間CPU計(jì)算或者使用IO操作的機(jī)器,只需要競(jìng)選出的Leader計(jì)算或處理一次,就可以把結(jié)果復(fù)制給其他的Follower。從而避免重復(fù)勞動(dòng),節(jié)省計(jì)算資源。
這個(gè)的經(jīng)典場(chǎng)景是搜索系統(tǒng)中建立全量索引。如果每個(gè)機(jī)器都進(jìn)行一遍索引的建立,不但耗時(shí)而且建立索引的一致性不能保證。通過(guò)在etcd的CAS機(jī)制同時(shí)創(chuàng)建一個(gè)節(jié)點(diǎn),創(chuàng)建成功的機(jī)器作為L(zhǎng)eader,進(jìn)行索引計(jì)算,然后把計(jì)算結(jié)果分發(fā)到其它節(jié)點(diǎn)。

場(chǎng)景八:為什么用etcd而不用ZooKeeper?
ZooKeeper的部署維護(hù)復(fù)雜,管理員需要掌握一系列的知識(shí)和技能;
而etcd其優(yōu)點(diǎn)也很明顯
簡(jiǎn)單。使用Go語(yǔ)言編寫部署簡(jiǎn)單;使用HTTP作為接口使用簡(jiǎn)單;使用Raft算法保證強(qiáng)一致性讓用戶易于理解。
數(shù)據(jù)持久化。etcd默認(rèn)數(shù)據(jù)一更新就進(jìn)行持久化。
安全。etcd支持SSL客戶端安全認(rèn)證
# 安裝etcd master node01 node02執(zhí)行
mkdir -p /opt/kubernetes/{bin,cfg,ssl}
vim /opt/kubernetes/cfg/etcd.conf
復(fù)制代碼
#[menmber]
ETCD_NAME="etcd01" #分別修改為修改為master node01 ndoe02的名稱
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.1.251:2380" #分別修改為修改為master node01 ndoe02的IP
ETCD_LISTEN_CLIENT_URLS="https://192.168.1.251:2379" #分別修改為修改為master node01 ndoe02的IP
#[clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.1.251:2380" #分別修改為修改為master node01 ndoe02的IP
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.1.251:2379" #分別修改為修改為master node01 ndoe02的IP
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.1.251:2380,etcd02=https://192.168.1.252:2380,etcd03=https://192.168.1.253:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
復(fù)制代碼
vim /opt/kubernetes/cfg/etcd.service
復(fù)制代碼
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
EnvironmentFile=-/opt/kubernetes/cfg/etcd.conf
ExecStart=/opt/kubernetes/bin/etcd \
--name=${ETCD_NAME} \
--data-dir=${ETCD_DATA_DIR} \
--listen-client-urls=${ETCD_LISTEN_CLIENT_URLS} \
--listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \
--advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} \
--initial-advertise-peer-urls=${ETCD_INITIAL_ADVERTISE_PEER_URLS} \
--initial-cluster=${ETCD_INITIAL_CLUSTER} \
--initial-cluster-token=${ETCD_INITIAL_CLUSTER} \
--initial-cluster-state=new \
--cert-file=/opt/kubernetes/ssl/server.pem \
--key-file=/opt/kubernetes/ssl/server-key.pem \
--peer-cert-file=/opt/kubernetes/ssl/server.pem \
--peer-key-file=/opt/kubernetes/ssl/server-key.pem \
--trusted-ca-file=/opt/kubernetes/ssl/ca.pem \
--peer-trusted-ca-file=/opt/kubernetes/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
復(fù)制代碼
#添加免密登錄
ssh-keygen -t rsa
ssh-copy-id root@node01
ssh-copy-id root@node02
#添加啟動(dòng)文件
cp /opt/kubernetes/cfg/etcd.service /usr/lib/systemd/system/etcd.service
#安裝etcd
tar zxvf etcd-v3.2.24-linux-amd64.tar.gz
cp etcd-v3.2.24-linux-amd64/etcd* /opt/kubernetes/bin
#復(fù)制證書文件到指定目錄
cp ca-key.pem server.pem ca.pem server-key.pem /opt/kubernetes/ssl
#啟動(dòng)etcd
systemctl start etcd
systemctl enable etcd
#查看日志
tail -f /var/log/messages
#測(cè)試
etcdctl --ca-file=/opt/kubernetes/ssl/ca.pem --cert-file=/opt/kubernetes/ssl/server.pem --key-file=/opt/kubernetes/ssl/server-key.pem --endpoints="https://192.168.1.251:2379,https://192.168.1.252:2379,https://192.168.1.253:2379" cluster-health
總結(jié)
以上所述是小編給大家介紹的利用二進(jìn)制文件安裝etcd的教程詳解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
您可能感興趣的文章:- Node.js Windows Binary二進(jìn)制文件安裝方法
- Linux下MySQL5.7.18二進(jìn)制包安裝教程(無(wú)默認(rèn)配置文件my_default.cnf)