etcd

從零開始搭建etcd分佈式存儲系統+web管理界面



什麼是ETCD

隨着CoreOS和Kubernetes等項目在開源社區日益火熱,它們項目中都用到的etcd組件作爲一個高可用、強一致性的服務發現存儲倉庫,漸漸爲開發人員所關注。
在雲計算時代,如何讓服務快速透明地接入到計算集羣中,如何讓共享配置信息快速被集羣中的所有機器發現,
更爲重要的是,如何構建這樣一套高可用、安全、易於部署以及響應快速的服務集羣,已經成爲了迫切需要解決的問題。
etcd爲解決這類問題帶來了福音,它是一個高可用的 Key/Value 存儲系統,內部採用raft協議作爲一致性算法。

內容簡介

  • 1.etcd的安裝
  • 2.搭建單機版
  • 3.搭建集羣版
  • 4.使用監聽功能watch(服務發現)
  • 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
## 將啓動文件和命令管理文件拷貝到 PATH找到的路徑中
cp etcd /usr/local/bin
cp etcdctl /usr/local/bin

啓動參數解釋

--name
etcd集羣中的節點名,這裏可以隨意,可區分且不重複就行  
--listen-peer-urls
監聽的用於節點之間通信的url,可監聽多個,集羣內部將通過這些url進行數據交互(如選舉,數據同步等)
--initial-advertise-peer-urls 
建議用於節點之間通信的url,節點間將以該值進行通信。
--listen-client-urls
監聽的用於客戶端通信的url,同樣可以監聽多個。
--advertise-client-urls
建議使用的客戶端通信url,該值用於etcd代理或etcd成員與etcd節點通信。
--initial-cluster-token etcd-cluster-1
節點的token值,設置該值後集羣將生成唯一id,併爲每個節點也生成唯一id,當使用相同配置文件再啓動一個集羣時,只要該token值不一樣,etcd集羣就不會相互影響。
--initial-cluster
也就是集羣中所有的initial-advertise-peer-urls 的合集
--initial-cluster-state new
新建集羣的標誌


二.搭建單機版

直接啓動

etcd

etcd默認監聽的是localhost的2379端口,既只監聽了lo設備,這樣會導致啓動後集羣中的其他機器無法訪問
因此我們可以在啓動的時候將默認的localhost改成0.0.0.0,確保etcd監聽了所有網卡。

etcd -listen-client-urls="http://0.0.0.0:2379" --advertise-client-urls="http://0.0.0.0:2379"

注意:etcd有要求,如果--listen-client-urls被設置了,那麼就必須同時設置--advertise-client-urls,所以即使設置和默認相同,也必須顯式設置

我們來使用curl來測試一下,是否可以遠程訪問,這裏我的機器IP是10.211.55.25

➜  ~ curl -L  http://10.211.55.25:2379/version
{"etcdserver":"3.3.12","etcdcluster":"3.3.0"}

如果不想使用2379和2380端口,也可以

#etcd 啓動 指定端口2280 2279
/usr/local/bin/etcd \
--data-dir=/etcd-data --name node1 \
--initial-advertise-peer-urls http://0.0.0.0:2280 --listen-peer-urls http://0.0.0.0:2280 \
--advertise-client-urls http://0.0.0.0:2279 --listen-client-urls http://0.0.0.0:2279 \
--initial-cluster node1=http://0.0.0.0:2280
#連接
etcdctl --endpoints=http://127.0.0.1:2279 set cqh chenqionghe
etcdctl --endpoints=http://127.0.0.1:2279 get cqh
 

當然,我們也可以通過docker運行,這裏給出啓動腳本

#!/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構建自身高可用集羣主要有三種形式:

  • 靜態發現: 預先已知 Etcd 集羣中有哪些節點,在啓動時直接指定好Etcd的各個node節點地址
  • Etcd動態發現: 通過已有的Etcd集羣作爲數據交互點,然後在擴展新的集羣時實現通過已有集羣進行服務發現的機制
  • DNS動態發現: 通過DNS查詢方式獲取其他節點地址信息

這裏我們採用Static方式,準備三臺機器,ip如下(都已經安裝etcd)

node1 10.211.55.2
node2 10.211.55.25
node3 10.211.55.26

進入node1,創建並運行run.sh,腳本內容如下

#!/usr/bin/env bash
#節點名稱
ETCD_NAME=node-1
#本機IP地址
LOCAL_IP=10.211.55.2
#ETCD存儲目錄
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"
#初始化狀態
INITIAL_CLUSTER_STATE=new
#開始運行
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}

進入node2,創建並運行run.sh,腳本內容和node1差不多(只修改了ETCD_NAME和LOCAL_IP)

#!/usr/bin/env bash
#節點名稱
ETCD_NAME=node-2
#本機IP地址
LOCAL_IP=10.211.55.25
#ETCD存儲目錄
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"
#初始化狀態
INITIAL_CLUSTER_STATE=new
#開始運行
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}

進入node3,創建並運行run.sh

#!/usr/bin/env bash
#節點名稱
ETCD_NAME=node-3
#本機IP地址
LOCAL_IP=10.211.55.26
#ETCD存儲目錄
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"
#初始化狀態
INITIAL_CLUSTER_STATE=new
#開始運行
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臺都啓動成功了

然後我們在node2上面執行操作

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

可以看到集羣已經生效了,我們再來測試一下,在ndoe2上執行操作

etcdctl set /cqh muscle

看看node1和node3是否能保持數據一致

可以看到在node1和node3中都能能夠正確的獲取/cqh的值



四.監聽功能watch演示

  • etcdctl watch key
    觀察一個值的變化,觀察到變化後,打印值並watch退出

  • etcdctl watch key -f
    永久觀察值的變化,觀察到變化後,打印直到Ctrl+C退出
  • etcdctl exec-watch key -- sh -c 'pwd'
    監聽到值有變化,就執行指定的命令(且不退出執行的可以是shell命令)



五.使用rest api

  • 創建鍵值
➜  ~ 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}}
  • 創建目錄
➜  ~ 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}}
  • 創建鍵值帶ttl
➜  ~ curl http://10.211.55.25:2379/v2/keys/hero -XPUT -d value="超人" -d ttl=5
  • 創建有序鍵值
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"

獲取剛創建的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
  • 統計信息-查看leader
curl http://10.211.55.25:2379/v2/stats/leader
  • 節點自身信息
curl http://10.211.55.26:2379/v2/stats/self
  • 查看集羣運行狀態
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

運行後訪問http://10.211.55.25:8000/
看到如下界面,可以看到上面添加的所有數據,這裏我使用界面添加了漫威和DC的英雄

2.搭建etcdkeeper

docker run -it -d --name etcdkeeper \
-p 8080:8080 \
deltaprojects/etcdkeeper

訪問http://10.211.55.25:8080/etcdkeeper/,輸入etcd的地址,看到如下界面

到這裏,etcd的單機版搭建、集羣版、客戶端使用、rest api、web管理界面等功能都介紹了



搭建:etcd-browser 注意

防火牆
在node服務器開放23792380端口,命令:

iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 2379 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 2380 -j ACCEPT


搭建etcdkeeper 問題未解決

https://www.itread01.com/content/1534399341.html



轉載至: [https://www.cnblogs.com/chenqionghe/p/10503840.html](https://www.cnblogs.com/chenqionghe/p/10503840.html)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章