(WJW)etcd v3 集羣最佳操作指南 頂 原 薦

(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

向集羣中添加一臺機器

登錄需要加入到集羣的那個節點機器

  1. 先執行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

  1. 啓動新加入的節點
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

  1. 檢查集羣正常後,停止新加入的節點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. 逐一按照新建集羣的步驟,把新的節點加入到集羣

開啓訪問控制

  1. auth enable 之前必須添加root用戶,添加時設置密碼:
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" user add root
  1. 開啓認證:
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" auth enable
  1. 添加一個非特權賬號:(注意,這時候就需要有權限的用戶來操作了)
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" --username root:root user add wjw
  1. 查看有哪些賬號:
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" --username root:root user list
  1. 添加角色:
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" --username root:root role add test1
  1. 給角色添加能力:
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" --username root:root role grant --rw --path "/*" test1
  1. 查看有哪些角色了:
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" --username root:root role list
  1. 查看指定角色的權限:
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" --username root:root role get test1
  1. 將用戶添加到角色:
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" --username root:root user grant --roles test1 wjw
  1. 查看用戶擁有哪些角色:
/opt/app/etcd/bin/etcdctl --endpoints "http://192.168.68.17:2379" --username root:root user get wjw
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章