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請求讀索引以提供最新數據,但仍然拒絕寫。