李肖肖 360雲計算html
女主宣言linux
ETCD是一個高可用的分佈式Key/Value存儲系統。它使用Raft算法,經過選舉來保持集羣內各節點狀態的一致性。雖然ETCD具備高可用的特色,可是也沒法避免多個節點宕機,甚至所有宕機的狀況發生。如何快速的恢復集羣,就變得格外重要。本文將介紹在平常工做中,遇到的ETCD集羣常見問題的處理方法。git
PS:豐富的一線技術、多元化的表現形式,盡在「360雲計算」,點關注哦!github
ETCD常見問題算法
因爲ETCD集羣須要選舉產生leader,因此集羣節點數目須要爲奇數來保證正常進行選舉。而集羣節點的數量並非越多越好,過多的節點會致使集羣同步的時間變長,使得leader寫入的效率下降。咱們線上的ETCD集羣由三個節點組成(即宕機一臺,集羣可正常工做),並開啓了認證。如下是平常運維工做中,遇到問題的處理過程。數據庫
1json
集羣一個節點宕機的恢復步驟服務器
一個節點宕機,並不會影響整個集羣的正常工做。此時可經過如下幾步恢復集羣:app
1)在正常節點上查看集羣狀態並摘除異常節點運維
etcdctl endpoint status
2)摘除異常節點
etcdctl member remove $ID
3)從新部署服務後,將節點從新加入集羣
因爲ETCD集羣證書依賴於服務器IP,爲避免從新制做證書,須要保持節點IP不變。在部署好節點上服務後,先不要啓動。
將節點從新加入集羣
etcdctl member add $name --peer-urls=https://x.x.x.x:2380
此時查看集羣狀態,新加入的節點狀態爲unstarted
刪除新增成員的舊數據目錄,更改相關配置
需將原etcd服務的舊數據目錄刪除,不然etcd會沒法正常啓動。新增節點是加入已有集羣,因此須要修改配置ETCD_INITIAL_CLUSTER_STATE="existing"
啓動服務 檢測集羣是否正常
systemctl start etcd
使用etcdctl endpoint status命令查看集羣狀態,若三臺都正常,集羣恢復。
2
集羣超過半數節點宕機的恢復步驟
此時集羣處於沒法正常工做的狀態,須要儘快恢復。若機器宕機重啓,IP保持不變,則證書無需從新生成;若IP更換,則還需從新生成證書。集羣恢復須要使用ETCD的備份數據(使用etcdctl snapshot save命令備份),或者從ETCD數據目錄複製snap/db文件。如下是恢復步驟:
1)將備份數據恢復至集羣
集羣部署完成後,先不啓動ETCD服務,並將原有ETCD數據目錄刪除
依次在三臺節點上執行恢復數據的命令
etcdctl --name=x.x.x.x-name-3 --endpoints="https://x.x.x.x:2379" --cert=/var/lib/etcd/cert/etcd-client.pem --key=/var/lib/etcd/cert/etcd-client-key.pem --cacert=/var/lib/etcd/cert/ca.pem --initial-cluster-token=xxxxxxxxxx --initial-advertise-peer-urls=https://x.x.x.x:2380 --initial-cluster=x.x.x.x-name-1=https://x.x.x.x:2380,x.x.x.x-name-2=https://x.x.x.x:2380,x.x.x.x-name-3=https://x.x.x.x:2380 --data-dir=/var/lib/etcd/data.etcd/ snapshot restore snapshot.db
更改數據目錄的權限
chown -R etcd:etcd data.etcd/
2)啓動ETCD服務,檢查集羣狀態
systemctl start etcd
etcdctl member list 查看節點狀態
3
database space exceeded報錯恢復步驟
從報錯的字面意思來看,是超出數據庫空間致使。執行etcdctl endpoint status,查看集羣此時各節點的狀態,發現DB SIZE爲2.1GB。ETCD官方文檔說明(https://etcd.io/docs/v3.3.12/dev-guide/limit/)提到ETCD默認的存儲大小是2GB。超出後,集羣沒法進行寫入。如下爲恢復步驟:
1)備份數據
使用snapshot save命令備份集羣數據
2)獲取reversion
etcdctl --write-out="json" --cacert /var/lib/etcd/cert/ca.pem --key /var/lib/etcd/cert/etcd-client-key.pem --cert /var/lib/etcd/cert/etcd-client.pem --endpoints='*.*.*.*:2379' endpoint status |grep -o '"revision":[0-9]*'
3)compact
etcdctl --cacert /var/lib/etcd/cert/ca.pem --key /var/lib/etcd/cert/etcd-client-key.pem --cert /var/lib/etcd/cert/etcd-client.pem --endpoints='*.*.*.*:2379' compact $revision
4)defrag
etcdctl --cacert /var/lib/etcd/cert/ca.pem --key /var/lib/etcd/cert/etcd-client-key.pem --cert /var/lib/etcd/cert/etcd-client.pem --endpoints='*.*.*.*:2379' defrag
5)刪除報警(必需刪除,不然集羣仍然沒法使用)
etcdctl --write-out="table" --cacert /var/lib/etcd/cert/ca.pem --key /var/lib/etcd/cert/etcd-client-key.pem --cert /var/lib/etcd/cert/etcd-client.pem --endpoints='*.*.*.*:2379 alarm disarm
以上就是對ETCD集羣平常維護的總結,爲了使服務更加穩定的運行,建議定時備份和壓縮數據,並增長集羣監控(與Prometheus配合使用)。
相關文章
https://github.com/etcd-io/etcd/tree/master/Documentation/dev-guide
http://linux265.com/news/2182.html
https://doc.zhnytech.com/etcd/documentation/op-guide/recovery.html