(2023.07.30 Sun @KLN)
計算高可用的設計目標是當出現硬件損壞,計算軟任務仍然能夠正常運行。其本質是通過冗余來規(guī)避部分故障的風險,而單臺服務器無論如何都打不到這個目標,所以其設計思想課簡單歸結為:通過增加更多服務器來達到計算高可用。
計算高可用的架構和數據高可用的架構相似,差別在于不需要在后臺做數據同步。
該架構設計的關鍵點:
- 任務在服務器上的執(zhí)行
- 方式一:每個服務器都可以執(zhí)行任務
- 方式二:特定服務器執(zhí)行任務(“主機”),當該服務器出現故障,由系統(tǒng)挑選其他服務器執(zhí)行任務
- 任務的重新執(zhí)行
- 策略一:已經分配和執(zhí)行并且執(zhí)行失敗的任務不做任何處理,系統(tǒng)只需要保證新的任務能夠分配到其他非故障服務器上執(zhí)行即可
- 策略二:設計任務管理器來管理計算任務,服務器執(zhí)行完成任務后,需要向任務管理器反饋任務執(zhí)行結果,管理器根據結果來決定是否需要將任務重新分配到另外的服務器上執(zhí)行
主備架構 master-replica

計算高可用中最簡單的架構。設計如下:
- 主機執(zhí)行所有計算任務,如,讀寫數據、執(zhí)行操作等
- 當主機故障,任務分配器不會自動將計算任務發(fā)送給備用機replica
- 如果主機恢復,則任務分配器繼續(xù)將任務發(fā)送給主機
- 如果主機不能恢復,則人工干預,將replica升為主機,由任務分配器將任務發(fā)送給新主機;同時,需要人工增加新的機器作為備機
根據備機replica的狀態(tài)不同,又可細分為冷備架構和溫備架構:
- 冷備:replica服務器已經啟動,業(yè)務系統(tǒng)沒有啟動,程序包和配置文件已經準備完畢。主機故障后,需要人工將備機的業(yè)務系統(tǒng)啟動,將任務分配器的任務請求切換為發(fā)送給備機
- 溫備:replica服務器已經啟動,業(yè)務系統(tǒng)已經啟動,只是不對外提供服務。主機故障后,人工只需要將任務分配器的任務請求切換為發(fā)送到備機即可。
一般情況下采用溫備方案,盡管比冷備架構更耗費能源。
該架構適合適用人數不多的場景,內部管理系統(tǒng)、后臺管理系統(tǒng)扥,或使用頻率不高的業(yè)務,不適合在線的業(yè)務。
主從main-secondary

與主備架構不同,主從架構中的服務器都在工作,區(qū)別在于執(zhí)行的任務不同,由任務分配器決定不同的服務器執(zhí)行何種工作。
優(yōu)點:
- 從機也執(zhí)行任務,發(fā)揮了其硬件性能
缺點:
- 需要將任務分類,任務分配器的設計略復雜
集群:對稱
前面介紹的兩種架構,存在的主要問題是人工操作效率低、容易出湊、不能及時處理故障。在可用性要求嚴格的場景中,我們需要系統(tǒng)能夠自動完成切換操作,于是引出高可用集群方案。
對稱集群中每個服務器的角色都是一樣的,可以執(zhí)行所有任務。對稱集群更通俗的叫法是負載均衡集群.

設計如下:
- 一般來說,任務分配器采用某種冊頁(隨機、輪詢等)將計算任務分配給集群中的不同服務器
- 集群中某臺服務器故障后,任務分配器不再將任務分配給它,而分配給其他服務器執(zhí)行
- 服務器恢復后,重新被分批任務
設計關鍵點:
- 任務分配器檢測服務器工作狀態(tài)
- 任務分配器選取分配策略
檢測工作狀態(tài),常用的做法是在任務分配器和服務器之間通過心跳來傳遞信息,根據實際情況確定狀態(tài)判斷條件。
分配策略以隨機和輪詢?yōu)橹鳌?/p>
集群:非對稱

與對稱集群不同,非對稱集群中每個服務器的角色是不同的,承擔不同的職責,以main-secondary為例,部分任務main執(zhí)行,而部分任務secondary執(zhí)行。
設計如下:
- 集群區(qū)分不同服務器的角色。例如通過Paxos算法選舉,或者簡單的選取當前存活服務器中節(jié)點ID最小的服務器作為main服務器
- 將不同任務發(fā)送給不同服務器
- 指定類型的服務器故障,則重新分配角色
對比對稱集群,其設計復雜度體現在:
- 任務分配策略更復雜,將任務劃分為不同類型并分配給不同角色的集群節(jié)點
- 服務器的角色分配策略更復雜,可能需要Paxos這類復雜算法實現Leader的選取
可參考ZooKeeper。
Reference
1 從零開始學架構-照著做,你也能成為架構師,李運華著,電子工業(yè)出版社
2 excalidraw