Docker Swarm - 集群容錯(cuò)

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 集群.

    1. 關(guān)閉要恢復(fù) Swarm 集群目標(biāo)主機(jī)上的 Docker;
    1. 在新 Swarm 集群下 移除 /var/lib/docker/swarm 目錄內(nèi)容;
    1. 將備份內(nèi)容存儲(chǔ)到 /var/lib/docker/swarm 目錄;

注意:新節(jié)點(diǎn)使用與舊的相同的加密密鑰進(jìn)行磁盤存儲(chǔ),此時(shí)不能更改磁盤上的存儲(chǔ)加密密鑰。
在啟用自動(dòng)鎖定的 Swarm 情況下,解鎖密鑰也與舊的 Swarm 相同,并且需要解鎖密鑰來恢復(fù) Swarm。

    1. 在新節(jié)點(diǎn)上啟動(dòng)docker。使用以下命令重新初始化集群,以便該節(jié)點(diǎn)不嘗試連接到舊集群的一部分的節(jié)點(diǎn),可能舊集群不再存在:
docker swarm init --force-new-cluster
    1. 校驗(yàn) Swarm 集群的恢復(fù)狀況是不是與預(yù)期的一樣,可以使用 docker service ls 來查看。
    1. 如果你使用自動(dòng)鎖,參考 rotate the unlock key
    1. 向新的 Swarm 集群中添加 manager 和 worker 節(jié)點(diǎn)。
    1. 向新的 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)資源。

其他問題歡迎討論 ~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。