(WJW)etcd v3 集羣最佳操作指南
etcd參數簡單解釋
--name #etcd集羣中的節點名,這裏可以隨意,可區分且不重複就行
--initial-cluster-token #節點的token值,設置該值後集羣將生成唯一id,併爲每個節點也生成唯一id,當使用相同配置文件再啓動一個集羣時,只要該token值不一樣,etcd集羣就不會相互影響.
--initial-cluster #集羣自舉時的url
--initial-advertise-peer-urls #建議用於節點之間通信的url,節點間將以該值進行通信.
--listen-peer-urls #監聽的用於節點之間通信的url,可監聽多個,集羣內部將通過這些url進行數據交互(如選舉,數據同步等)
--listen-client-urls #監聽的用於客戶端通信的url,同樣可以監聽多個.
--advertise-client-urls #建議使用的客戶端通信url,該值用於etcd代理或etcd成員與etcd節點通信.
etcd所在目錄解釋
/opt/app #etcd的根目錄
/opt/app/etcd/create_etcd_first_node.sh #初始化集羣時,第一個節點首次執行的腳本
/opt/app/etcd/run_etcd.sh #以後正常啓動的腳本
/opt/app/etcd/bin/etcd #etcd的server程序
/opt/app/etcd/bin/etcdctl #etcd的管理程序
/opt/app/etcd/data/ #etcd的數據目錄
初始化第一個節點
export NODE_IP="192.168.68.17"
export ETCD_INITIAL_CLUSTER_TOKEN="token-01"
export ETCD_NAME="node1"
export ETCD_DATA_DIR="/opt/app/etcd/data"
/opt/app/etcd/bin/etcd \
--initial-cluster-token "${ETCD_INITIAL_CLUSTER_TOKEN}" --initial-cluster "${ETCD_NAME}=http://${NODE_IP}:2380" \
--initial-advertise-peer-urls "http://${NODE_IP}:2380" \
--listen-peer-urls="http://${NODE_IP}:2380" \
--listen-client-urls "http://${NODE_IP}:2379" \
--advertise-client-urls "http://${NODE_IP}:2379"
根據實際情況替換變量
NODE_IP
,ETCD_INITIAL_CLUSTER_TOKEN
,ETCD_NAME
查看到當前集羣
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" member list
檢查集羣健康狀態
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" cluster-health
停止第一個節點pkill etcd
,然後使用/opt/app/etcd/run_etcd.sh
腳本正常啓動第一個節點的etcd
向集羣中添加一臺機器
登錄需要加入到集羣的那個節點機器
- 先執行
etcdctl
命令把節點加入集羣
export NODE_IP="192.168.68.18"
export ETCD_NAME="node2"
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" member add ${ETCD_NAME} http://${NODE_IP}:2380
根據實際情況替換變量
NODE_IP
,ETCD_NAME
然後根據屏幕提示把環境變量保存下來:ETCD_NAME
,ETCD_INITIAL_CLUSTER
,ETCD_INITIAL_CLUSTER_STATE
- 啓動新加入的節點
export NODE_IP="192.168.68.18"
export ETCD_NAME="node2"
export ETCD_DATA_DIR="/opt/app/etcd/data"
export ETCD_INITIAL_CLUSTER="node1=http://192.168.68.17:2380,node2=http://192.168.68.18:2380"
export ETCD_INITIAL_CLUSTER_STATE="existing"
/opt/app/etcd/bin/etcd \
--initial-advertise-peer-urls "http://${NODE_IP}:2380" \
--listen-peer-urls="http://${NODE_IP}:2380" \
--listen-client-urls "http://${NODE_IP}:2379" \
--advertise-client-urls "http://${NODE_IP}:2379"
注意:
ETCD_NAME
,ETCD_INITIAL_CLUSTER
,ETCD_INITIAL_CLUSTER_STATE
必須使用上面的etcdctl member add
命令產生的輸出! 根據實際情況替換變量NODE_IP
,ETCD_NAME
- 檢查集羣正常後,停止新加入的節點
pkill etcd
,然後執行/opt/app/etcd/run_etcd.sh
命令正常啓動新加入的節點,再次檢查集羣狀態! 以下是/opt/app/etcd/run_etcd.sh
文件內容
#! /bin/sh
basedir=`dirname $0`
echo "BASE DIR:$basedir"
cd $basedir
export NODE_IP="192.168.68.18"
export ETCD_NAME="node2"
export ETCD_DATA_DIR="/opt/app/etcd/data"
/opt/app/etcd/bin/etcd \
--initial-advertise-peer-urls "http://${NODE_IP}:2380" \
--listen-peer-urls="http://${NODE_IP}:2380" \
--listen-client-urls "http://${NODE_IP}:2379" \
--advertise-client-urls "http://${NODE_IP}:2379"
注意根據實際情況替換變量
NODE_IP
,ETCD_NAME
附錄:
運行階段member異常恢復
假設一個節點node2
異常重啓,可以執行/opt/app/etcd/run_etcd.sh
腳本命令正常起來
測試讀寫數據
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" set /message hello
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" get /message
移除節點
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" member remove ${NODE_ID}
${NODE_ID}
可以從/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" member list
的輸出來查找!
節點遷移和替換
當你節點所在的機器出現硬件故障,或者節點出現如數據目錄損壞等問題,導致節點永久性的不可恢復時,就需要對節點進行遷移或者替換.當一個節點失效以後,必須儘快修復,因爲etcd集羣正常運行的必要條件是集羣中多數節點都正常工作.
遷移一個節點需要進行四步操作:
- 暫停正在運行着的節點程序進程
- 把數據目錄從現有機器拷貝到新機器
- 使用api更新etcd中對應節點指向機器的url記錄更新爲新機器的ip
- 使用同樣的配置項和數據目錄,在新的機器上啓動etcd.
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" member update ${NODE_ID} ${LISTEN_PEER_URLS}
${NODE_ID}
可以從/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" member list
的輸出來查找!
集羣損壞後,強制性重啓集羣
當集羣超過半數的節點都失效時,就需要通過手動的方式,強制性讓某個節點以自己爲Leader,利用原有數據啓動一個新集羣.
此時你需要進行一下操作.
1. 備份原有數據到新機器.
export ETCD_DATA_DIR="/opt/app/etcd/data"
/opt/app/etcd/bin/etcdctl \
backup \
--data-dir "${ETCD_DATA_DIR}" \
--backup-dir /tmp/etcd_backup
它首先將節點的源信息寫入到備份區,但是節點的id,集羣的id等將會被重寫,這就意味着節點之前的集羣信息就被抹掉.
2. 使用--force-new-cluster加備份的數據啓動第一個節點
export NODE_IP="192.168.68.17"
export ETCD_INITIAL_CLUSTER_TOKEN="token-01"
export ETCD_NAME="node1"
export ETCD_DATA_DIR="/tmp/etcd_backup"
/opt/app/etcd/bin/etcd \
--force-new-cluster \
--initial-cluster-token "${ETCD_INITIAL_CLUSTER_TOKEN}" --initial-cluster "${ETCD_NAME}=http://${NODE_IP}:2380" \
--initial-advertise-peer-urls "http://${NODE_IP}:2380" \
--listen-peer-urls="http://${NODE_IP}:2380" \
--listen-client-urls "http://${NODE_IP}:2379" \
--advertise-client-urls "http://${NODE_IP}:2379"
注意:強制性重啓是一個迫不得已的選擇,它會破壞一致性協議保證的安全性(如果操作時集羣中尚有其它節點在正常工作,就會出錯),所以在操作前請務必要保存好數據.
3. 檢查第一個節點運行正常後,停止etcd
pkill etcd
4. 使用/opt/app/etcd/create_etcd_first_node.sh
腳本,啓動第一個節點的etcd
5. 檢查第一個節點運行正常後,再次停止etcd
pkill etcd
6. 使用/opt/app/etcd/run_etcd.sh
腳本正常啓動etcd
檢查第一個節點是否運行正常!
7. 逐一按照新建集羣的步驟,把新的節點加入到集羣
開啓訪問控制
- auth enable 之前必須添加root用戶,添加時設置密碼:
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" user add root
- 開啓認證:
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" auth enable
- 添加一個非特權賬號:(注意,這時候就需要有權限的用戶來操作了)
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" --username root:root user add wjw
- 查看有哪些賬號:
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" --username root:root user list
- 添加角色:
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" --username root:root role add test1
- 給角色添加能力:
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" --username root:root role grant --rw --path "/*" test1
- 查看有哪些角色了:
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" --username root:root role list
- 查看指定角色的權限:
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" --username root:root role get test1
- 將用戶添加到角色:
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" --username root:root user grant --roles test1 wjw
- 查看用戶擁有哪些角色:
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" --username root:root user get wjw