什么是ETCD
隨著CoreOS和Kubernetes等項(xiàng)目在開源社區(qū)日益火熱,它們項(xiàng)目中都用到的etcd組件作為一個(gè)高可用、強(qiáng)一致性的服務(wù)發(fā)現(xiàn)存儲(chǔ)倉庫,漸漸為開發(fā)人員所關(guān)注。
在云計(jì)算時(shí)代,如何讓服務(wù)快速透明地接入到計(jì)算集群中,如何讓共享配置信息快速被集群中的所有機(jī)器發(fā)現(xiàn),更為重要的是,如何構(gòu)建這樣一套高可用、安全、易于部署以及響應(yīng)快速的服務(wù)集群,已經(jīng)成為了迫切需要解決的問題。
etcd為解決這類問題帶來了福音,它是一個(gè)高可用的 Key/Value 存儲(chǔ)系統(tǒng),內(nèi)部采用raft協(xié)議作為一致性算法。
準(zhǔn)備好了嗎,干貨要來了,are you ok ?
本飛豬教程內(nèi)容簡介
- 1.etcd的安裝
- 2.搭建單機(jī)版
- 3.搭建集群版
- 4.使用監(jiān)聽功能watch(服務(wù)發(fā)現(xiàn))
- 5.使用rest api
- 6.搭建WEB界面并使用
一.安裝
下載地址:https://github.com/coreos/etcd/releases/
mkdir -p /home/chenqionghe/test/etcd/ cd !$ # 下載 wget https://github.com/etcd-io/etcd/releases/download/v3.3.12/etcd-v3.3.12-linux-amd64.tar.gz # 解壓安裝 tar zxvf etcd-v3.3.12-linux-amd64.tar.gz cd etcd-v3.3.12-linux-amd64 ## 將啟動(dòng)文件和命令管理文件拷貝到 PATH找到的路徑中 cp etcd /usr/local/bin cp etcdctl /usr/local/bin cp -r etcd-v3.2.5-linux-amd64 /usr/local/etcd #將軟件放置到常用目錄下
啟動(dòng)參數(shù)解釋
--name etcd集群中的節(jié)點(diǎn)名,這里可以隨意,可區(qū)分且不重復(fù)就行 --listen-peer-urls 監(jiān)聽的用于節(jié)點(diǎn)之間通信的url,可監(jiān)聽多個(gè),集群內(nèi)部將通過這些url進(jìn)行數(shù)據(jù)交互(如選舉,數(shù)據(jù)同步等) --initial-advertise-peer-urls 建議用于節(jié)點(diǎn)之間通信的url,節(jié)點(diǎn)間將以該值進(jìn)行通信。 --listen-client-urls 監(jiān)聽的用于客戶端通信的url,同樣可以監(jiān)聽多個(gè)。 --advertise-client-urls 建議使用的客戶端通信url,該值用于etcd代理或etcd成員與etcd節(jié)點(diǎn)通信。 --initial-cluster-token etcd-cluster-1 節(jié)點(diǎn)的token值,設(shè)置該值后集群將生成唯一id,并為每個(gè)節(jié)點(diǎn)也生成唯一id,當(dāng)使用相同配置文件再啟動(dòng)一個(gè)集群時(shí),只要該token值不一樣,etcd集群就不會(huì)相互影響。 --initial-cluster 也就是集群中所有的initial-advertise-peer-urls 的合集 --initial-cluster-state new 新建集群的標(biāo)志
二.搭建單機(jī)版
直接啟動(dòng)
etcd
etcd默認(rèn)監(jiān)聽的是localhost的2379端口,既只監(jiān)聽了lo設(shè)備,這樣會(huì)導(dǎo)致啟動(dòng)后集群中的其他機(jī)器無法訪問
因此我們可以在啟動(dòng)的時(shí)候?qū)⒛J(rèn)的localhost改成0.0.0.0,確保etcd監(jiān)聽了所有網(wǎng)卡。
etcd -listen-client-urls="http://0.0.0.0:2379" --advertise-client-urls="http://0.0.0.0:2379"
注意:etcd有要求,如果–listen-client-urls被設(shè)置了,那么就必須同時(shí)設(shè)置–advertise-client-urls,所以即使設(shè)置和默認(rèn)相同,也必須顯式設(shè)置
我們來使用curl來測試一下,是否可以遠(yuǎn)程訪問,這里我的機(jī)器IP是10.211.55.25
? ~ curl -L http://10.211.55.25:2379/version {"etcdserver":"3.3.12","etcdcluster":"3.3.0"}
當(dāng)然,我們也可以通過docker運(yùn)行,這里給出啟動(dòng)腳本
#!/usr/bin/env bash ETCD_NAME="etcd" ETCD_VERSION="v3.3.1" ETCD_PORT_CLIENT=2379 ETCD_PORT_NODE=2380 docker run -d -p ${ETCD_PORT_CLIENT}:2379 -p ${ETCD_PORT_NODE}:2380 --name ${ETCD_NAME} quay.io/coreos/etcd:${ETCD_VERSION} /usr/local/bin/etcd --data-dir=/etcd-data --name node1 --initial-advertise-peer-urls http://0.0.0.0:2380 --listen-peer-urls http://0.0.0.0:2380 --advertise-client-urls http://0.0.0.0:2379 --listen-client-urls http://0.0.0.0:2379 --initial-cluster node1=http://0.0.0.0:2380
三.搭建集群版
Etcd構(gòu)建自身高可用集群主要有三種形式:
- 靜態(tài)發(fā)現(xiàn): 預(yù)先已知 Etcd 集群中有哪些節(jié)點(diǎn),在啟動(dòng)時(shí)直接指定好Etcd的各個(gè)node節(jié)點(diǎn)地址
- Etcd動(dòng)態(tài)發(fā)現(xiàn): 通過已有的Etcd集群作為數(shù)據(jù)交互點(diǎn),然后在擴(kuò)展新的集群時(shí)實(shí)現(xiàn)通過已有集群進(jìn)行服務(wù)發(fā)現(xiàn)的機(jī)制
- DNS動(dòng)態(tài)發(fā)現(xiàn): 通過DNS查詢方式獲取其他節(jié)點(diǎn)地址信息
這里我們采用Static方式,準(zhǔn)備三臺(tái)機(jī)器,ip如下(都已經(jīng)安裝etcd)
node1 10.211.55.2 node2 10.211.55.25 node3 10.211.55.26
進(jìn)入node1,創(chuàng)建并運(yùn)行run.sh,腳本內(nèi)容如下
#!/usr/bin/env bash #節(jié)點(diǎn)名稱 ETCD_NAME=node-1 #本機(jī)IP地址 LOCAL_IP=10.211.55.2 #ETCD存儲(chǔ)目錄 ETCD_DATA_DIR=/usr/local/etcd/data #初始化名稱 INITIAL_CLUSTER_TOKEN=cqh-test-cluster #初始化群集列表 INITIAL_CLUSTER="node-1=http://10.211.55.2:2380,node-2=http://10.211.55.25:2380,node-3=http://10.211.55.26:2380" #初始化狀態(tài) INITIAL_CLUSTER_STATE=new #開始運(yùn)行 etcd --name ${ETCD_NAME} --data-dir ${ETCD_DATA_DIR} --initial-advertise-peer-urls http://${LOCAL_IP}:2380 --listen-peer-urls http://${LOCAL_IP}:2380 --listen-client-urls http://${LOCAL_IP}:2379,http://127.0.0.1:2379 --advertise-client-urls http://${LOCAL_IP}:2379 --initial-cluster-token ${INITIAL_CLUSTER_TOKEN} --initial-cluster ${INITIAL_CLUSTER} --initial-cluster-state ${INITIAL_CLUSTER_STATE}
進(jìn)入node2,創(chuàng)建并運(yùn)行run.sh,腳本內(nèi)容和node1差不多(只修改了ETCD_NAME和LOCAL_IP)
#!/usr/bin/env bash #節(jié)點(diǎn)名稱 ETCD_NAME=node-2 #本機(jī)IP地址 LOCAL_IP=10.211.55.25 #ETCD存儲(chǔ)目錄 ETCD_DATA_DIR=/usr/local/etcd/data #初始化名稱 INITIAL_CLUSTER_TOKEN=cqh-test-cluster #初始化群集列表 INITIAL_CLUSTER="node-1=http://10.211.55.2:2380,node-2=http://10.211.55.25:2380,node-3=http://10.211.55.26:2380" #初始化狀態(tài) INITIAL_CLUSTER_STATE=new #開始運(yùn)行 etcd --name ${ETCD_NAME} --data-dir ${ETCD_DATA_DIR} --initial-advertise-peer-urls http://${LOCAL_IP}:2380 --listen-peer-urls http://${LOCAL_IP}:2380 --listen-client-urls http://${LOCAL_IP}:2379,http://127.0.0.1:2379 --advertise-client-urls http://${LOCAL_IP}:2379 --initial-cluster-token ${INITIAL_CLUSTER_TOKEN} --initial-cluster ${INITIAL_CLUSTER} --initial-cluster-state ${INITIAL_CLUSTER_STATE}
進(jìn)入node3,創(chuàng)建并運(yùn)行run.sh
#!/usr/bin/env bash #節(jié)點(diǎn)名稱 ETCD_NAME=node-3 #本機(jī)IP地址 LOCAL_IP=10.211.55.26 #ETCD存儲(chǔ)目錄 ETCD_DATA_DIR=/usr/local/etcd/data #初始化名稱 INITIAL_CLUSTER_TOKEN=cqh-test-cluster #初始化群集列表 INITIAL_CLUSTER="node-1=http://10.211.55.2:2380,node-2=http://10.211.55.25:2380,node-3=http://10.211.55.26:2380" #初始化狀態(tài) INITIAL_CLUSTER_STATE=new #開始運(yùn)行 etcd --name ${ETCD_NAME} --data-dir ${ETCD_DATA_DIR} --initial-advertise-peer-urls http://${LOCAL_IP}:2380 --listen-peer-urls http://${LOCAL_IP}:2380 --listen-client-urls http://${LOCAL_IP}:2379,http://127.0.0.1:2379 --advertise-client-urls http://${LOCAL_IP}:2379 --initial-cluster-token ${INITIAL_CLUSTER_TOKEN} --initial-cluster ${INITIAL_CLUSTER} --initial-cluster-state ${INITIAL_CLUSTER_STATE}
我們看到3臺(tái)都啟動(dòng)成功了
然后我們在node2上面執(zhí)行操作
root@Ubuntu:~# etcdctl member list 2033c1336b929ca7: name=node-3 peerURLs=http://10.211.55.26:2380 clientURLs=http://10.211.55.26:2379 isLeader=true edc51d36208cfbcf: name=node-2 peerURLs=http://10.211.55.25:2380 clientURLs=http://10.211.55.25:2379 isLeader=false f09a9dba19a725e2: name=node-1 peerURLs=http://10.211.55.2:2380 clientURLs=http://10.211.55.2:2379 isLeader=false
可以看到集群已經(jīng)生效了,我們再來測試一下,在ndoe2上執(zhí)行操作
etcdctl set /cqh muscle
看看node1和node3是否能保持?jǐn)?shù)據(jù)一致
可以看到在node1和node3中都能能夠正確的獲取/cqh的值
四.監(jiān)聽功能watch演示
-
etcdctl watch key
觀察一個(gè)值的變化,觀察到變化后,打印值并watch退出 - etcdctl watch key -f
永久觀察值的變化,觀察到變化后,打印直到Ctrl+C退出 -
etcdctl exec-watch key — sh -c ‘pwd’
監(jiān)聽到值有變化,就執(zhí)行指定的命令(且不退出執(zhí)行的可以是shell命令)
五.使用rest api
- 創(chuàng)建鍵值
? ~ curl http://10.211.55.25:2379/v2/keys/cqh -XPUT -d value="陳瓊和1" {"action":"set","node":{"key":"/cqh","value":"陳瓊和","modifiedIndex":14,"createdIndex":14},"prevNode":{"key":"/cqh","value":"陳瓊和","modifiedIndex":13,"createdIndex":13}}
- 創(chuàng)建目錄
? ~ curl http://10.211.55.25:2379/v2/keys/gym -XPUT -d dir=true {"action":"set","node":{"key":"/gym","dir":true,"modifiedIndex":12,"createdIndex":12}}
- 獲取鍵值
? ~ curl http://10.211.55.25:2379/v2/keys/cqh {"action":"get","node":{"key":"/cqh","value":"陳瓊和","modifiedIndex":14,"createdIndex":14}}
- 創(chuàng)建鍵值帶ttl
? ~ curl http://10.211.55.25:2379/v2/keys/hero -XPUT -d value="超人" -d ttl=5
- 創(chuàng)建有序鍵值
curl http://10.211.55.25:2379/v2/keys/fitness -XPOST -d value="bench_press" curl http://10.211.55.25:2379/v2/keys/fitness -XPOST -d value="dead_lift" curl http://10.211.55.25:2379/v2/keys/fitness -XPOST -d value="deep_squat"
獲取剛創(chuàng)建的fitness
curl http://10.211.55.25:2379/v2/keys/fitness {"action":"create","node":{"key":"/fitness/00000000000000000020","value":"bench_press","modifiedIndex":20,"createdIndex":20}} {"action":"create","node":{"key":"/fitness/00000000000000000021","value":"dead_lift","modifiedIndex":21,"createdIndex":21}} {"action":"create","node":{"key":"/fitness/00000000000000000022","value":"deep_squat","modifiedIndex":22,"createdIndex":22}} {"action":"get","node":{"key":"/fitness","dir":true,"nodes":[{"key":"/fitness/00000000000000000022","value":"deep_squat","modifiedIndex":22,"createdIndex":22},{"key":"/fitness/00000000000000000020","value":"bench_press","modifiedIndex":20,"createdIndex":20},{"key":"/fitness/00000000000000000021","value":"dead_lift","modifiedIndex":21,"createdIndex":21}],"modifiedIndex":20,"createdIndex":20}}
- 刪除鍵
curl http://10.211.55.25:2379/v2/keys/cqh -XDELETE
- 列出所有集群成員
curl http://10.211.55.25:2379/v2/members
- 統(tǒng)計(jì)信息-查看leader
curl http://10.211.55.25:2379/v2/stats/leader
- 節(jié)點(diǎn)自身信息
curl http://10.211.55.26:2379/v2/stats/self
- 查看集群運(yùn)行狀態(tài)
curl http://10.211.55.26:2379/v2/stats/store
六.搭建WEB界面并使用
這里分別演示搭建etcd-browser和etcdkeeper,兩者功能大同小異,不同的是etcdkeeper支持v3的api
1.搭建etcd-browser
docker run --rm -d --name etcd-browser -p 8000:8000 --env ETCD_HOST=10.211.55.25 --env ETCD_PORT=2379 buddho/etcd-browser
運(yùn)行后訪問http://10.211.55.25:8000/
看到如下界面,可以看到上面添加的所有數(shù)據(jù),這里我使用界面添加了漫威和DC的英雄
2.搭建etcdkeeper
docker run -it -d --name etcdkeeper -p 8080:8080 deltaprojects/etcdkeeper
訪問http://10.211.55.25:8080/etcdkeeper/,輸入etcd的地址,看到如下界面
到這里,etcd的單機(jī)版搭建、集群版、客戶端使用、rest api web管理界面等功能都介紹了,你還在等什么,趕緊high起來