ETCD添加刪除集群成員過程


ETCD添加刪除集群成員過程

 

ETCD_INITIAL_CLUSTER_STATE="new/existing"

 

有兩個值new和existing。如果填為existing,則該member啟動時會嘗試與其他member交互。

 

集群初次建立時,要填為new,通過測試發現最后一個節點填existing也正常(因為屬於后加入,不能同時啟動進程,existing要落后前兩個節點一丟丟時間啟動),其他節點不能填為existing。

 

集群運行過程中,一個member故障后恢復時填為existing,如果是new的話需要集群沒有業務數據。

 

概括如下:

 

new適用於無數據集群加入(就是所有節點都沒有業務數據)

 

existing適用於有數據的集群加入(有兩個節點有數據,新節點沒有數據)

 

 

ETCD刪除成員過程

 

先創建環境變量

 

 

export ETCDCTL_ENDPOINTS=https://172.16.98.175:2379,https://172.16.98.176:2379,https://172.16.98.177:2379
export ETCDCTL_CACERT=/opt/etcd/ssl/ca.pem export ETCDCTL_CERT=/opt/etcd/ssl/client.pem export ETCDCTL_KEY=/opt/etcd/ssl/client-key.pem

 

 

 

 

檢查ID

 

[root@master ~]# etcdctl member list --endpoints="https://172.21.130.169:2379,https://172.21.130.168:2379,https://172.28.17.85:2379" --write-out=table +------------------+---------+--------+-----------------------------+-----------------------------+------------+
|        ID        | STATUS  |  NAME  |         PEER ADDRS          |        CLIENT ADDRS         | IS LEARNER |
+------------------+---------+--------+-----------------------------+-----------------------------+------------+
| 418294c668bdb445 | started | etcd-3 |   https://172.28.17.85:2380 | https://172.28.17.85:2379 | false |
| 4c978cbca553cd70 | started | etcd-1 | https://172.21.130.169:2380 | https://172.21.130.169:2379 | false |
| cc0bba643b3d8ce1 | started | etcd-2 | https://172.21.130.168:2380 | https://172.21.130.168:2379 | false |
+------------------+---------+--------+-----------------------------+-----------------------------+------------+

 

根據ID刪除成員

 

[root@master ~]# etcdctl member remove 418294c668bdb445 --endpoints="https://172.21.130.169:2379,https://172.21.130.168:2379" Member 418294c668bdb445 removed from cluster 28d9bab5a0f18219

 

查看刪除后的結果

 

[root@master ~]# etcdctl member list --endpoints="https://172.21.130.169:2379,https://172.21.130.168:2379,https://172.28.17.85:2379" --write-out=table +------------------+---------+--------+-----------------------------+-----------------------------+------------+
|        ID        | STATUS  |  NAME  |         PEER ADDRS          |        CLIENT ADDRS         | IS LEARNER |
+------------------+---------+--------+-----------------------------+-----------------------------+------------+
| 4c978cbca553cd70 | started | etcd-1 | https://172.21.130.169:2380 | https://172.21.130.169:2379 | false |
| cc0bba643b3d8ce1 | started | etcd-2 | https://172.21.130.168:2380 | https://172.21.130.168:2379 | false |
+------------------+---------+--------+-----------------------------+-----------------------------+------------+

 

刪除了那么我們要怎么添加節點?

 

1、在失去的那台節點上查看一下現在的狀態(因為只是服務掛了所以etcdctl請求查看還是可以的)

 

2、刪除現有的數據(不刪除你可以試試,沒有明顯報錯你會很精彩,因為數據內的local-member-id還是之前的)

 

3、在失去的那台節點上添加節點到集群,為什么?

1)因為添加完會臨時在機器上生成新增加的環境變量,重啟服務時會直接調用。

2)還有人說那刪除數據后直接吧state狀態改成new重啟就好了,很不幸的告訴你抱歉不好使。因為在把成員移出集群的時候他會做一個記錄,而且你在用new加入集群的時候用的id通過計算還是之前刪除的那個id。所以直接檢測到那個記錄你被永久移除導致失敗。)

 

May 18 15:49:43 iZuf6h1kfgutxc3el68z2lZ etcd: {"level":"warn","ts":"2021-05-18T15:49:43.599+0800","caller":"etcdserver/server.go:1095","msg":"server error","error":"the member has been permanently removed from the cluster"}

 

3)還有人會認為把主的數據拷貝到新節點或者故障節點不就好了,但是抱歉他會強你拷貝過去數據的節點位置。(如下)

 

[root@master1 ~]# etcdctl member list --endpoints="https://172.21.130.169:2379,https://172.21.130.168:2379,https://172.28.17.85:2379" --write-out=table +------------------+---------+--------+-----------------------------+-----------------------------+------------+
|        ID        | STATUS  |  NAME  |         PEER ADDRS          |        CLIENT ADDRS         | IS LEARNER |
+------------------+---------+--------+-----------------------------+-----------------------------+------------+
| 4c978cbca553cd70 | started | etcd-3 | https://172.21.130.169:2380 | https://172.28.17.85:2379 | false |
| cc0bba643b3d8ce1 | started | etcd-2 | https://172.21.130.168:2380 | https://172.21.130.168:2379 | false |
+------------------+---------+--------+-----------------------------+-----------------------------+------------+

 

正確做法:

 

1、刪除舊數據

2、執行加入命令etcdctl member add etcd-3 --peer-urls="https://172.28.17.85:2380" --endpoints="https://172.21.130.169:2379,https://172.21.130.168:2379"

3、重啟服務即可

 

最后記得如果之間add成員的時候指定了--learner參數

 

在為新添加的學習成員啟動新的etcd進程后,使用etcdctl member promote將學習成員提升為投票成員。

etcdctl member promote 9bf1b35fc7761a23

 

執行上面命令的原因:

添加一個新的學習節點到集群,該learn作為無投票成員加入集群,但仍然從leader接收所有數據。在learn節點趕上leader的日志前。learn節點既不投票也不計算法定人數(無票)。當學習者趕上領導者的進度時,成員API可以將其提升為一個有投票權的成員,然后將其計入法定人數(仲裁)。仲裁大小 3。

 

Etcd服務器驗證提升請求,確保其運行安全。只有在它的日志趕上leader的之后,學習者才能被提升為有投票權的成員。“學習者”在晉升前只能作為備用節點:領導權不能轉移給“學習者”。learn拒絕客戶端讀寫(客戶端quorum(仲裁)不會將請求路由到學習learn)。這意味着learn不需要向leader發出閱讀索引請求。但是允許檢查狀態

 

此外,etcd限制了集群可以擁有的learn的總數,並避免了日志復制使leader過載。learn從不自我推銷。而etcd提供了learn狀態信息和安全檢查,集群管理員必須做出是否提升學習者的最終決定。

 

只設置learn狀態並默認:默認一個新成員狀態給learn將大大提高成員重新配置的安全性,因為learn不會改變quorum的大小。錯誤配置將始終是可逆的,而不會丟失quorum。

 

使投票成員的提升完全自動化:一旦learn趕上了leader的日志,集群就可以自動提升learn。Etcd要求用戶定義一定的閾值,一旦滿足要求,學習者將自己提升為有投票權的成員。

 

從用戶的角度來看,“成員添加”命令將以與今天相同的方式工作,但學習者功能提供了更高的安全性。

 

設置learn為備用故障切換節點:learn作為備用節點加入,當集群可用性受到影響時自動升級。使learn可以作為只讀節點,永遠不會升級。在弱一致性模式下,learn只接收leader發來的數據,不處理寫入。在沒有共識開銷的情況下,在本地提供讀取服務將大大減少leader的工作負載,但可能會提供過時的數據。在強一致性模式下,learn向leader請求讀索引以提供最新數據,但仍然拒絕寫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM