作者:莊宇
在設計系統架構時,我們必須假設任何元件和任何基礎設施可能會在任何時間失效,例如:自然災害,電力中斷,網路中斷,錯誤的系統變更等。為了應對挑戰,我們必須設計合適的容災架構。
本文介紹如何以 K8s 叢集(包括:ACK 叢集,他雲叢集和本地 IDC K8s 叢集)為基礎,結合阿里云云產品(網路,資料庫,中介軟體,可觀測),設計容災架構,構建一個“韌性”系統。
容災目標
Recovery time objective(RTO):
服務中斷與服務恢復之間可接受的最大延遲時間。決定服務停機的可接受時長。
Recovery point objective(RPO):
自上一個資料恢復點以來可接受的最大時間量。決定可接受的資料丟失或重建。
對於 RTO 和 RPO,數值越低代表停機時間和資料丟失越少,但是越低的 RTO 和 RPO 會導致資源成本和運維複雜性越高。因此,您需要根據工作負載的重要性,指定適當的 RTO 和 RPO。
容災策略
上圖中,描述的常見的 3 種容災策略:備份與恢復、主備、雙活,不同的容災策略對應了不同的收益和成本。您需要綜合分析業務的重要性、風險、可投入的成本等,以選擇適合的容災策略。
備份與恢復(Backup-Restore)
在系統執行時,備份應用和資料,在災難發生時,在另一個地點恢復應用和資料,並切換業務流量。由於資料無法實時備份,在恢復資料時會有一定的資料丟失,同時如果資料量較大,恢復資料時間可能較長。
主備(Active-Standby)
在主備模式中,主 Location 處理所有的業務流量,備用 location 可以啟動較少的應用例項節省成本,並週期傳送測試流量以驗證系統有效性。在災難發生時,做資料庫主備切換,擴容應用例項數,並切換業務流量。
雙活(Active-Active)
在雙活模式中,2 個 Location 啟動相同的應用例項數,同時處理業務流量。在災難發生時,做資料庫主備切換,並切換業務流量。
容災範圍
多可用區(Multi-AZ)
阿里雲地域(Region) [ 11] 包含多個可用區(AZ),可用區(AZ)是電力和網路互相獨立的物理區域,對停電,斷網等區域性中斷的容災場景,可以使用多個可用區(AZ)設計容災策略。由於可用區間的網路延時較短,可以更容易實現資料部分的容災方案,包括資料庫、快取和訊息等。
多地域(Multi-Region)
為了應對更大範圍的災難故障事件,這些事件可能會影響同地域(Region)的多個可用區(AZ),您可以使用多個地域(Region)設計容災策略。但由於地域間更大網路延時,容災方案複雜度和實現成本較高。
在選擇多可用區(AZ)或者多地域(Region)容災方案時,需要重點考慮有狀態應用和依賴的雲產品(例如:資料庫、快取和訊息)是否支援多地域或者多可用區容災。
方案示例
備份與恢復(Backup & Restore)
公共雲跨可用區和跨地域備份與恢復
-
透過 ACK One 備份中心 [3 ] ,可以備份 ACK 叢集中的應用,包括無狀態應用和有狀態應用,對有狀態應用,在備份應用 YAML 的同時可以備份相關 Storage 資料。
-
ACK One 備份中心整合雲產品雲盤快照 [ 12] ,檔案儲存 NAS [13 ] ,物件儲存 OSS [14 ] 和雲備份 [15 ] ,分別支援應用 YAML,雲盤 PV,檔案系統 PV 的一鍵備份。
-
備份後,可以隨時將應用和 Storage 資料,恢復到任意地域和可用區的 ACK 叢集。
-
阿里雲資料庫服務的備份與恢復,可以參考相應資料產品的文件,例如:RDS MySQL 資料庫備份恢復 [ 16] ,RDS 例項間資料遷移 [17 ] 。
混合雲備份與恢復
-
透過 ACK One 註冊叢集 [ 4] ,可以將 IDC 自建或者非阿里雲 K8s 叢集,接入到阿里雲 ACK 控制檯。
-
接入 ACK One 註冊叢集后,透過 ACK One 備份中心,可以備份 IDC 自建和非阿里雲 K8s 叢集中的應用,包括無狀態應用和有狀態應用,對有狀態應用,在備份應用 YAML 的同時可以備份相關 Storage 資料。
-
備份後,可以隨時將應用(Deployment/Statefulset)和資料(PV/PVC),恢復到任意地域和可用區的 ACK 叢集。
總結
備份恢復方案實施成本較低,但 RTO 和 RPO 相對較長,取決於資料量的大小和應用的複雜度。備份中心能夠提供的全量備份+增量備份能力,減少 RTO 和 RPO 時間。
備份恢復作為容災的兜底方案,重要性高,在系統運維的過程中,要保證備份的及時性和可恢復性。
另外,許多使用者選擇透過備份恢復功能實現應用的跨叢集遷移,場景如下:
-
業務上雲,將本地 IDC 叢集中的應用,遷移到阿里雲 ACK 叢集中,參考 IDC 應用上雲遷移 [ 18] 。
-
叢集版本較老,版本升級有穩定性風險,可以先建立新版本叢集,透過備份恢復將應用遷移到新版本叢集執行,參考跨版本叢集遷移 [ 19] 。
-
使用者在收斂雲賬號或者組織調整時,需要跨賬號叢集接入 [ 20] 和跨叢集遷移應用 [21 ] 。
多叢集 Service
在應用遷移的過程中,由於應用的數量較多,需要分批遷移,同時應用間存在呼叫關係。此時,在網路打通的前提下,可以使用 ACK One 艦隊多叢集 Service [ 5] ,實現應用 Kubernetes Service 跨叢集訪問。如下圖所示,ACK One 艦隊多叢集 Service,可以將 Cluster1 的 Applcation2 的 Kubernetes Service(包含 endpoints)注入到 Cluster2,Cluster2 上的 Application1 可以訪問 Cluster1 上的 Application2。
在專線拉通的前提下,透過 ACK One 註冊叢集,IDC 和非阿里雲的 K8s 叢集也可以是用 ACK One 艦隊多叢集 Service。
單地域多可用區容災
基於 DNS 流量分發
-
透過 ACK One GitOps 應用分發 [6 ] ,在 2 個 ACK 叢集中部署應用,實現基於 Git 倉庫的持續一致性部署。
-
透過全域性流量管理(GTM) [22 ] 做 DNS 解析實現負載分發,並監控系統執行健康狀態,自動觸發容災切換。
-
每個 AZ 內,透過 ACK Ingress [ 7] 實現 7 層流量管理。
-
備叢集和主叢集的應用版本相同,但備叢集節點較少,應用副本較少,節省成本。
-
在主系統不可用時,全域性流量管理(GTM)會將服務域名 DNS 解析到備用系統,完成主備切換。
-
由於流量的增長,備叢集中 ACK HPA [8 ] 會擴容應用副本,進而觸發 ACK Cluster Autocaler [9 ] 擴容叢集節點。
-
阿里雲中介軟體(訊息,快取)的跨可用區容災,可參考相關文件,例如:雲訊息佇列 RocketMQ 版例項規格 [ 23] ,雲訊息佇列 Kafka 版例項規格 [ 24] ,雲原生記憶體資料庫 Tair 容災方案 [ 25] 。
-
阿里雲資料庫服務的跨可用區容災,可參考相關文件,例如:RDS MySQL 資料庫搭建高可用架構 [ 26] 。
🔔 注意:
-
本方案基於 DNS 流量轉發,由於 DNS 快取,在災難事件發生時,部分業務依然路由到主系統,造成一定的業務損失。
-
需要在 2 個叢集中分別配置維護 7 層 ingress 規則,成本高。系統正常執行狀態:
災難事件發生,AZ 不可用時,系統主備切換,GTM 將流量切換到 AZ2,ACK Cluste2 的應用例項自動擴充套件,中介軟體和資料庫多可用區高可用切換。
基於 ACK One 多叢集閘道器
-
透過 ACK One GitOps 應用分發,在 2 個 ACK 叢集中部署應用,實現基於 Git 倉庫的持續一致性部署。
-
透過 ACK One 多叢集閘道器 [ 10] ,定義標準 K8s Ingress 規則(YAML 格式),實現 7 層流量治理,實現流量的主備模式分發。多叢集閘道器為跨可用區高可用。
-
備叢集和主叢集的應用版本相同,但備叢集節點較少,應用副本較少,節省成本。可以傳送特定 http header 的測試流量,多叢集閘道器轉發到備叢集以驗證工作狀態。
-
在主系統不可用時,ACK One 多叢集閘道器會自動將業務流量備用系統,完成主備切換。
-
由於流量的增長,備叢集中 ACK HPA 會擴容應用副本,進而觸發 ACK Cluster Autocaler 擴容叢集節點。
-
阿里雲資料庫服務的跨可用區容災,可參考相關文件,例如:RDS MySQL 資料庫搭建高可用架構。
🔔 注意:
-
本方案為 HTTP 七層流量轉發,配合 7 層健康檢查,主備切換時相比 DNS 方案,大幅減低業務流量損失。
-
閘道器側統一支援基於 Ingress 規則的流量治理,相比 DNS 方案,合併了四層負載均衡 SLB 和七層 Ingress 閘道器,降低系統複雜度和維護成本。
系統正常執行狀態:
災難事件發生,AZ 不可用時,系統主備切換,多叢集閘道器(MSE 雲原生閘道器)自動將流量切換到 AZ2 的 ACK Cluste2 中, 應用例項自動擴充套件。
跨可用區雙活
以上 2 個方案以主備模式為例,描述了系統架構。同樣的架構,基於 DNS 流量分發和 ACK One 多叢集閘道器也支援雙活場景,可以配置流量分發比例(例如:50% : 50%),支援自動 failover 切換。在雙活的場景下,每個叢集中的應用副本數,需要根據流量分發比例確定,叢集中需要配置彈性伸縮,以支援流量切換情況下的流量增長。
總結
單地域多可用區方案實現的成本較低,可以利用雲產品(包括:閘道器,容器,中介軟體,資料庫)多可用區部署和多可用區高可用,快速實現容災,對業務改造較小。但此方案僅可應對單個可用區的災難和故障,無法應對地域級的災難故障。
單地域雲+IDC 容災方案
方案架構與單地域多可用區容災方案類似,要點如下:
-
雲上 VPC 與 IDC 建立專線連線,打通管控與資料通道。
-
透過 ACK One 註冊叢集接入 IDC 叢集,使用阿里雲強大可觀測和安全能力,統一管理 IDC 叢集和 ACK 叢集。
-
透過 ACK One GitOps 應用分發,在 2 個叢集中部署應用,實現基於 Git 倉庫的持續一致性部署。
基於 DNS 流量分發(單地域雲上和雲下雙活)
基於 ACK One 多叢集閘道器(單地域雲上和雲下雙活)
多地域容災
如果業務規模大重要性高,服務的使用者數量多範圍廣,單地域的容災方案就無法滿足業務高可用要求,這時需要多地域容災方案。在多個地域獨立部署業務系統,保證每個地域的業務系統具有單獨閉環提供完整的服務能力。
-
透過全域性流量管理(GTM)實現使用者就近接入相應地域。
-
透過 ACK One GitOps 應用分發,在 2 個 ACK 叢集中部署應用,實現基於 Git 倉庫的持續一致性部署。
-
快取多地域高可用方案,可以參考阿里雲產品相關文件,例如:Tair 全球多話 [ 27] 。
-
資料庫跨地域高可用方案,可以參考阿里資料庫雲產品相關文件,例如:雲原生資料庫 PolarDB MySQL 全球資料庫 [ 28] 。
-
地域內,可以採用單地域多可用區容災方案。
單元化多活部署
區別與前一方案,多地域單元化多活部署,需要設計分片規則對應用和資料進行分片,使得單元提供面向部分資料分片的完整服務能力,實現業務安全故障隔離,水平擴充套件,服務龐大的使用者群體。一般分為中心單元(擁有所有使用者資料)和多個子單元(分片後詳細資料)。此種方式需要業務系統支援,自定義分流規則,資料拆分,單元間配合等,複雜度高。
總結
各種災難事件會影響您業務的可用性,透過使用阿里雲的相關雲產品的容災能力,可以減輕或者消除這些影響。首先,需要了解業務可用性需求,從而選擇一個適當的容災策略,然後,使用阿里雲相關雲產品,包括:容器(容器服務 Kubernetes 版 ACK [ 1] 和分散式雲容器平臺 ACK One [ 2] )、訊息、快取、資料庫等,設計容災架構,快速達到您業務可用性要求的恢復時間目標 RTO 和恢復點目標 RPO。
相關連結:
[1] 容器服務 Kubernetes 版 ACK
https://help.aliyun.com/zh/ack/
[2] 分散式雲容器平臺 ACK One
https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/product-overview/ack-one-overview
[3] ACK One 備份中心
https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/backup-center-overview
[4] ACK One 註冊叢集
https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/overview-9
[5] ACK One 艦隊多叢集 Service
https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/mcs-overview
[6] ACK One GitOps 應用分發
https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/gitops-overview
[7] ACK Ingress
https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/ingress-overview
[8] ACK HPA
https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/horizontal-pod-autoscaling
[9] ACK Cluster Autocaler
https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/auto-scaling-of-nodes
[10] ACK One 多叢集閘道器
https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/multi-cluster-gateway-overview
[11] 地域(Region)
https://help.aliyun.com/document_detail/40654.html#concept-z04-bg5-j8w
[12] 雲盤快照
https://help.aliyun.com/zh/ecs/user-guide/copy-a-snapshot
[13] 檔案儲存 NAS
https://help.aliyun.com/zh/nas/product-overview/what-is-nas
[14] 物件儲存 OSS
https://help.aliyun.com/zh/oss/product-overview/what-is-oss
[15] 雲備份
https://help.aliyun.com/zh/cloud-backup/product-overview/what-is-hbr
[16] RDS MySQL 資料庫備份恢復
https://help.aliyun.com/zh/flink/developer-reference/log-service-connector
[17] RDS 例項間資料遷移
https://help.aliyun.com/zh/rds/apsaradb-rds-for-mysql/migrate-data-between-apsaradb-rds-for-mysql-instances
[18] IDC 應用上雲遷移
https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/migrate-applications-from-self-managed-kubernetes-clusters-to-ack-clusters
[19] 跨版本叢集遷移
https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/use-backup-center-to-migrate-applications-from-clusters-running-lower-kubernetes-versions
[20] 跨賬號叢集接入
https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/use-cases/use-ack-one-to-manage-clusters-across-cloud-platforms-and-alibaba-cloud-accounts
[21] 跨叢集遷移應用
https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/migrate-applications-across-clusters-in-different-regions
[22] 全域性流量管理(GTM)
https://help.aliyun.com/document_detail/189587.html
[23] 雲訊息佇列 RocketMQ 版例項規格
https://help.aliyun.com/zh/apsaramq-for-rocketmq/cloud-message-queue-rocketmq-5-x-series/product-overview/instance-specifications
[24] 雲訊息佇列 Kafka 版例項規格
https://help.aliyun.com/zh/apsaramq-for-kafka/cloud-message-queue-for-kafka/product-overview/instance-editions
[25] 雲原生記憶體資料庫 Tair 容災方案
https://help.aliyun.com/zh/tair/product-overview/disaster-recovery
[26] RDS MySQL 資料庫搭建高可用架構
https://help.aliyun.com/zh/rds/apsaradb-rds-for-mysql/build-a-high-availability-architecture
[27] Tair 全球多話
https://help.aliyun.com/zh/tair/user-guide/overview-of-global-distributed-cache-for-tair
[28] 雲原生資料庫 PolarDB MySQL 全球資料庫
https://help.aliyun.com/zh/polardb/polardb-for-mysql/user-guide/overview-49