etcd簡介及集群安裝部署使用
1. 簡介
etcd是一個鍵值存儲倉庫,用於配置共享和服務發現。etcd在使用中可作為一個高可用強一致性的服務發現存儲倉庫。
etcd作為一個高可用鍵值存儲系統,天生就是為集群化而設計的。由於Raft演算法在做決策時需要多數節點的投票,所以etcd一般部署集群推薦奇數個節點,推薦的數量為3、5或者7個節點構成一個集群。
etcd包含以下特點:
- 簡單:基於HTTP+JSON的API讓你用curl就可以輕鬆使用。
- 安全:可選SSL客戶認證機制。
- 快速:每個實例每秒支援2k+次寫操作。
- 可信:使用Raft演算法充分實現了分散式。
- 數據持久化:默認數據一更新就進行持久化。
Raft演算法:工程上使用較為廣泛的強一致性、去中心化、高可用的分散式協議。Raft是一個共識演算法(consensus algorithm),所謂共識,就是多個節點對某個事情達成一致的看法,即使是在部分節點故障、網路延時、網路分割的情況下。
2. Linux下載安裝
兩種下載方法:
wget //github.com/etcd-io/etcd/releases/download/v3.2.32/etcd-v3.2.32-linux-amd64.tar.gz
或
curl -L //github.com/etcd-io/etcd/releases/download/v3.2.32/etcd-v3.2.32-linux-amd64.tar.gz -o /opt/etcd-v3.2.32-linux-amd64.tar.gz
解壓
tar -zxvf etcd-v3.2.32-linux-amd64.tar.gz
etcd 為服務端執行文件
etcdctl 為客戶端執行文件
3. 單機模式啟動
# 啟動
/opt/etcd-v3.2.32-linux-amd64/etcd --data-dir=default.etcd --name default \
--initial-advertise-peer-urls //ip:2380 --listen-peer-urls //ip:2380 \
--advertise-client-urls //ip:2379 --listen-client-urls //ip:2379
etcd啟動後在埠2379上監聽客戶端通訊,在埠2380上監聽服器到服務之間的通訊。
執行命令測試
執行客戶端命令前需要指定使用哪個版本的api
export ETCDCTL_API=3
./etcdctl put mykey "this is a test"
./etcdctl get mykey
4. 指定各集群成員的方式配置集群
創建執行文件
touch etcd-static.sh
在每個etcd節點上,指定集群成員。
# 指定集群token
# 如果你所在的網路環境配置了多個etcd集群,為了避免意外發生,最好使用-initial-cluster-token參數為每個集群單獨配置一個token認證。這樣就可以確保每個集群和集群的成員都擁有獨特的ID。
TOKEN=token-01
CLUSTER_STATE=new
NAME_1=machine-1
NAME_2=machine-2
NAME_3=machine-3
HOST_1=192.168.199.140
HOST_2=192.168.199.141
HOST_3=192.168.199.142
CLUSTER=${NAME_1}=//${HOST_1}:2380,${NAME_2}=//${HOST_2}:2380,${NAME_3}=//${HOST_3}:2380
每個節點添加一下各節點對應啟動命令行
THIS_NAME=${NAME_1}
THIS_IP=${HOST_1}
/opt/etcd-v3.2.32-linux-amd64/etcd --data-dir=data.etcd --name ${THIS_NAME} \
--initial-advertise-peer-urls //${THIS_IP}:2380 --listen-peer-urls //${THIS_IP}:2380 \
--advertise-client-urls //${THIS_IP}:2379 --listen-client-urls //${THIS_IP}:2379 \
--initial-cluster ${CLUSTER} \
--initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}
THIS_NAME=${NAME_2}
THIS_IP=${HOST_2}
/opt/etcd-v3.2.32-linux-amd64/etcd --data-dir=data.etcd --name ${THIS_NAME} \
--initial-advertise-peer-urls //${THIS_IP}:2380 --listen-peer-urls //${THIS_IP}:2380 \
--advertise-client-urls //${THIS_IP}:2379 --listen-client-urls //${THIS_IP}:2379 \
--initial-cluster ${CLUSTER} \
--initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}
THIS_NAME=${NAME_3}
THIS_IP=${HOST_3}
/opt/etcd-v3.2.32-linux-amd64/etcd --data-dir=data.etcd --name ${THIS_NAME} \
--initial-advertise-peer-urls //${THIS_IP}:2380 --listen-peer-urls //${THIS_IP}:2380 \
--advertise-client-urls //${THIS_IP}:2379 --listen-client-urls //${THIS_IP}:2379 \
--initial-cluster ${CLUSTER} \
--initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}
後台啟動服務:
nohup sh etcd-static.sh &
5. 使用discovery service的方式配置集群
如果你本地沒有可用的etcd集群,etcd官網提供了一個可以公網訪問的etcd存儲地址。你可以通過如下命令得到etcd服務的目錄,並把它作為–discovery參數使用。
執行:curl '//discovery.etcd.io/new?size=3'
輸出://discovery.etcd.io/d343fbdbc42552549ec02c2710cdca2c
執行得到的輸出內容作為-discovery參數使用
同樣的,當你完成了集群的初始化後,這些資訊就失去了作用。當你需要增加節點時,需要使用etcdctl來進行操作。為了安全,請務必每次啟動新etcd集群時,都使用新的discovery token進行註冊。
另外,如果你初始化時啟動的節點超過了指定的數量,多餘的節點會自動轉化為Proxy模式的etcd。
創建執行文件
touch etcd-dynamic.sh
每個節點如下配置
# 指定集群token
# 如果你所在的網路環境配置了多個etcd集群,為了避免意外發生,最好使用-initial-cluster-token參數為每個集群單獨配置一個token認證。這樣就可以確保每個集群和集群的成員都擁有獨特的ID。
TOKEN=token-01
CLUSTER_STATE=new
DISCOVERY=//discovery.etcd.io/d343fbdbc42552549ec02c2710cdca2c
THIS_NAME=節點自己的名稱
THIS_IP=節點自己的host
/opt/etcd-v3.2.32-linux-amd64/etcd --data-dir=data.etcd --name ${THIS_NAME} \
--initial-advertise-peer-urls //${THIS_IP}:2380 --listen-peer-urls //${THIS_IP}:2380 \
--advertise-client-urls //${THIS_IP}:2379 --listen-client-urls //${THIS_IP}:2379 \
--discovery ${DISCOVERY} \
--initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}
後台啟動服務:
nohup sh etcd-dynamic.sh &
6. 集群模式下客戶端命令行
執行客戶端命令前需要指定使用哪個版本的api
export ETCDCTL_API=3
- 獲取集群節點
./etcdctl --endpoints=192.168.199.140:2379,192.168.199.141:2379,192.168.199.142:2379 member list
加上參數:--write-out=table,可以以表的形式輸出
- 查看節點狀態
./etcdctl --endpoints=192.168.199.140:2379,192.168.199.141:2379,192.168.199.142:2379 endpoint status --write-out=table
- 向集群中設置值
./etcdctl --endpoints=192.168.199.140:2379,192.168.199.141:2379,192.168.199.142:2379 put key "value"
- 獲取集群中的值
./etcdctl --endpoints=192.168.199.140:2379,192.168.199.141:2379,192.168.199.142:2379 get key
可以跟參數:--prefix,獲取所有有相同前綴的數據
- 刪除集群中數據
./etcdctl --endpoints=192.168.199.140:2379,192.168.199.141:2379,192.168.199.142:2379 del key
可以跟參數:--prefix,刪除所有有相同前綴的數據
7. etcd-manager安裝
官網下載安裝包安裝
//etcdmanager.io/