Swarm 添加多個(gè) Manager 節(jié)點(diǎn)實(shí)現(xiàn)容錯(cuò)
Manager 節(jié)點(diǎn)的不可用是未知的,可以在 Swarm 集群中維護(hù)奇數(shù)個(gè) Manager 節(jié)點(diǎn),以防部分 Manger 節(jié)點(diǎn)不可用導(dǎo)致整個(gè) Swarm 集群不能正常工作。
節(jié)點(diǎn)總數(shù) | 正常數(shù)量 | 容錯(cuò)數(shù)量 |
---|---|---|
1 | 1 | 0 |
2 | 2 | 0 |
3 | 2 | 1 |
4 | 3 | 1 |
5 | 3 | 2 |
6 | 4 | 2 |
7 | 4 | 3 |
8 | 5 | 3 |
9 | 5 | 4 |
容錯(cuò)數(shù)量 = (n - 1) / 2
舉個(gè)例子,有 5 個(gè) Manager 節(jié)點(diǎn)的 Swarm 集群,如果其中 3 個(gè)不可用,那么 Manager 節(jié)點(diǎn)的數(shù)量就不合法。因此在恢復(fù)其中一個(gè)不可用的 Manager 節(jié)點(diǎn)或使用災(zāi)難恢復(fù)命令恢復(fù)群集之前,將無法添加或刪除節(jié)點(diǎn)。
災(zāi)難恢復(fù)
災(zāi)難不可控制,如果突發(fā)事件導(dǎo)致 Manager 節(jié)點(diǎn)不可用的數(shù)量超過容錯(cuò)數(shù)量,為了恢復(fù) Swarm 到正常狀態(tài),該如何處理呢?
1、從備份中恢復(fù)
在 備份 Swarm 數(shù)據(jù) 后, 使用如下步驟恢復(fù) Swarm 集群.
- 關(guān)閉要恢復(fù) Swarm 集群目標(biāo)主機(jī)上的 Docker;
- 在新 Swarm 集群下 移除
/var/lib/docker/swarm
目錄內(nèi)容;
- 在新 Swarm 集群下 移除
- 將備份內(nèi)容存儲(chǔ)到
/var/lib/docker/swarm
目錄;
- 將備份內(nèi)容存儲(chǔ)到
注意:新節(jié)點(diǎn)使用與舊的相同的加密密鑰進(jìn)行磁盤存儲(chǔ),此時(shí)不能更改磁盤上的存儲(chǔ)加密密鑰。
在啟用自動(dòng)鎖定的 Swarm 情況下,解鎖密鑰也與舊的 Swarm 相同,并且需要解鎖密鑰來恢復(fù) Swarm。
- 在新節(jié)點(diǎn)上啟動(dòng)docker。使用以下命令重新初始化集群,以便該節(jié)點(diǎn)不嘗試連接到舊集群的一部分的節(jié)點(diǎn),可能舊集群不再存在:
docker swarm init --force-new-cluster
- 校驗(yàn) Swarm 集群的恢復(fù)狀況是不是與預(yù)期的一樣,可以使用
docker service ls
來查看。
- 校驗(yàn) Swarm 集群的恢復(fù)狀況是不是與預(yù)期的一樣,可以使用
- 如果你使用自動(dòng)鎖,參考 rotate the unlock key。
- 向新的 Swarm 集群中添加 manager 和 worker 節(jié)點(diǎn)。
- 向新的 Swarm 集群中添加原來的備份方案。
2、通過重置 Manager 的法定數(shù)量恢復(fù)集群
集群對(duì)故障具有恢復(fù)能力,集群可以從任何數(shù)量的臨時(shí)節(jié)點(diǎn)故障(機(jī)器重啟或重啟時(shí)崩潰)或其他瞬時(shí)錯(cuò)誤中恢復(fù)。然而,如果集群的 Manger 數(shù)量少于法定數(shù)量,集群不能自動(dòng)恢復(fù)。現(xiàn)有 Worker 節(jié)點(diǎn)上的任務(wù)繼續(xù)運(yùn)行,但不能管理任務(wù),包括擴(kuò)展或更新服務(wù)以及從集群中加入或刪除節(jié)點(diǎn)。恢復(fù)的最佳方法是將丟失的 Manager 節(jié)點(diǎn)重新連接。如果故障嚴(yán)重,沒有辦法連接丟失的 Manager 節(jié)點(diǎn),該如何處理?
目前唯一方法是使用 Manager 節(jié)點(diǎn)中的 --force-new-cluster
操作。這個(gè)操作會(huì)刪除當(dāng)前 Manager 節(jié)點(diǎn)以外的所有 Manager 節(jié)點(diǎn)。由于現(xiàn)在只有一個(gè) Manager ,因此達(dá)到法定數(shù)量,Swarm 集群就能正常工作。然后可以提升 Worker 節(jié)點(diǎn)成為 Manager,直到擁有理想的 Manager 數(shù)量。
# 示例
docker swarm init --force-new-cluster --advertise-addr node01:2377
當(dāng)你使用 --force-new-cluster
標(biāo)志運(yùn)行 docker swarm init
命令時(shí),運(yùn)行命令的 Docker 引擎將成為能夠管理和運(yùn)行服務(wù)的集群的 Manager
節(jié)點(diǎn)。它擁有先前關(guān)于服務(wù)和任務(wù)的所有信息,Worker 節(jié)點(diǎn)仍然是集群的一部分,并且服務(wù)仍在運(yùn)行。然后你需要添加 Manager 節(jié)點(diǎn)以實(shí)現(xiàn)以前的任務(wù)分配,并確保擁有足夠的 Manager 來維護(hù)高可用性并防止法定數(shù)量不足。
Manager 節(jié)點(diǎn)的分配
除了維護(hù)奇數(shù)個(gè) Manager 節(jié)點(diǎn)之外,在安置 Manager 時(shí)還要注意數(shù)據(jù)中心的拓?fù)浣Y(jié)構(gòu)。為了獲得最佳的容錯(cuò)性,可以在至少 3 個(gè)可用區(qū)中分配 Manager 節(jié)點(diǎn),以支持整套機(jī)器或常見維護(hù)方案的故障。
Manager 個(gè)數(shù) | 分配 (在 3 個(gè)可用分區(qū)) |
---|---|
3 | 1-1-1 |
5 | 2-2-1 |
7 | 3-2-2 |
9 | 3-3-3 |
相關(guān)問題
1、Manager 節(jié)點(diǎn)為什么推薦使用奇數(shù)個(gè)?
舉例,3 個(gè)節(jié)點(diǎn)和 4 個(gè)節(jié)點(diǎn)的容錯(cuò)數(shù)量都是 1,5 個(gè)節(jié)點(diǎn)和 6 個(gè)節(jié)點(diǎn)的容錯(cuò)數(shù)量都是 2,同樣的效果,選偶數(shù)明顯沒有任何優(yōu)勢(shì),屬于浪費(fèi)資源。
其他問題歡迎討論 ~