將Web服務從單體架構演化為彈性高可用架構

更新時間:
Copy as MD

隨著業務增長,單體架構的Web服務的業務負載也逐漸增加,導致系統穩定性降低。此時,您可以將單體架構演化為彈性高可用架構,通過伸縮組水平擴充伺服器來分攤負載,從而增強系統穩定性和響應速度。

為什麼使用彈性高可用架構?

單體架構的問題

一種常見的單體架構,所有的資源部署在一台ECS執行個體中,使用者通過網域名稱(或IP)直接存取到單一伺服器中的服務。該架構存在兩方面的問題:

  • 單點故障:使用單體架構部署,一旦服務出現故障後,整個業務將發生中斷,嚴重影響使用者體驗,造成使用者流失。

  • 效能瓶頸:隨著業務訪問量的增長,單體架構可能會遇到效能瓶頸,進而阻礙業務的擴充。特別是在遭遇突發性大量訪問時,容易導致服務響應變慢。

彈性高可用架構特點

彈性高可用架構使用者通過網域名稱訪問商務服務叢集時,請求會通過負載平衡器,分攤到叢集的各個商務服務執行個體上的商務服務進行處理。該架構特點如下:

  • 避免單點故障(高可用):使用多台伺服器來分攤業務負載,從而提高服務承載能力,避免出現單一服務故障造成的業務中斷。

  • Auto Scaling:使用伸縮組管理服務叢集可以一鍵修改叢集伺服器數量,快速橫向擴充。同時還可以設定自動調整的機制,實現根據業務負載按需擴充。

如何將單體架構演化為彈性高可用架構?

如圖所示,將左側單體架構演化為彈性高可用架構需要經歷兩個階段。

  • 階段一:分離資料存放區與商務邏輯

    由於彈性高可用架構是以ECS執行個體為單元進行複製,因此在實施彈性高可用架構時,需要確保ECS執行個體(包含其中的商務服務)的資料存放區商務邏輯分離,即無狀態化,避免因橫向擴充執行個體而導致的資料一致性問題。

    例如,在複製ECS執行個體時,應確保不會複製資料庫,從而防止叢集使用多個不同的資料來源。通過將資料存放區從ECS中抽離出來,確保所有執行個體共用同一資料來源,保持資料的一致性。

    如果在您的實際業務中,出現了以下幾種常見的情況時,您需要評估該情況是否會對您的業務造成影響,從而改進業務架構。

    常見的需要注意的情況

    情況1:在執行個體中部署了MySQL、Redis等服務。

    如果您的ECS執行個體中包含資料庫等具狀態服務,在複製該ECS橫向擴充時,會造成您的叢集存在多個資料來源,造成資料不一致等問題。遇到此情況時,您可以考慮抽離MySQL或者Redis等有狀態的服務單獨部署。

    此外,您還可以直接將自建MySQLRedis遷移到雲資料庫RDS,相比自建資料庫,RDS更加安全可靠、營運更加方便,自建資料庫遷移上雲,請參見自建資料庫遷移到雲資料庫

    情況2:在商務服務中用到了Session技術。

    如過您在商務服務中使用到了Session技術用於儲存使用者登入狀態,擴充服務後,會導致服務副本之間的登入資訊(Session資訊)不共用,從而造成使用者頻繁被彈出。此情況,您可以考慮單獨部署Redis做共用Session,來解決此問題。

    情況3:某些不能同時執行的定時任務。

    比如您的業務中存在每天只能執行一次的定時任務,在橫向擴充後,在這定時任務執行的時間點多台伺服器會同時執行該定時任務,此情況您可能需要調整任務處理邏輯。

  • 階段二:將架構演化為彈性高可用架構

    在將ECS執行個體中的資料存放區商務邏輯分離之後,可以通過棄置站台的方式進行橫向擴充ECS執行個體(包含其中商務服務)。

    此時將服務叢集遷移至伸縮組,利用其彈效能力快速建立服務的副本,使用負載平衡器作為服務叢集的訪問入口,分攤業務負載,確保系統的穩定和高效。

快速遷移以實現彈性高可用

方案介紹

如果您已經完成資料存放區商務邏輯的分離(無狀態化),您可以通過以下步驟快速將單體架構服務遷移到伸縮組實現彈性高可用架構。

  1. 部署樣本網站(準備執行個體)。本方案會類比一個已經完成無狀態化的樣本Web服務執行個體,以該執行個體為例,示範遷移過程。您也可以使用現有執行個體進行操作。

  2. 構建包含商務服務的執行個體鏡像。該鏡像之後會作為您叢集執行個體的啟動鏡像,執行個體啟動時自動啟動商務服務。

  3. 建立管理服務叢集的伸縮組。之後會通過該伸縮組快速複製執行個體(橫向擴充)。

  4. 為叢集設定統一訪問入口。關聯負載平衡器實現統一訪問的入口。

  5. 擴充執行個體(驗證)。快速複製執行個體(橫向擴充),訪問負載平衡器以驗證叢集正常工作。

1. 部署樣本網站

首先您需要準備能夠代表生產環境的應用執行個體,用於後續的複製和自動化部署。

本教程為您提供一個樣本網站服務,您可以使用該服務體驗遷移過程。單擊一鍵部署樣本服務完成樣本服務的搭建。

該樣本網站服務包含一個Web服務軟體包及其運行環境自啟動指令碼,且該執行個體已經完成資料存放區與商務邏輯的分離即無狀態化。
如果您的商務服務執行個體已經無狀態化,且具備以上條件(軟體包、環境、自啟動指令碼),您也可以使用您的實際商務服務代替該執行個體進行後續的遷移操作。

樣本服務部署說明

如右圖所示,在本樣本架構的ECS執行個體中,包含一個串連資料庫的Web服務,訪問該服務的地址,可以查看當前伺服器的IP以及從資料庫中查詢到的一個字串。同時,會為該服務設定開機自啟動命令,在ECS啟動時會自動運行該服務。

一鍵部署樣本服務功能基於Resource Orchestration Service(Resource Orchestration Service)實現,使用該功能會在您的阿里雲賬戶下建立一個Virtual Private Cloud以及交換器(vSwitch)、一個包含樣本服務的ECS執行個體、雲資料庫 RDS MySQL版。

部署該執行個體服務的具體操作步驟如下:

  1. 單擊一鍵部署樣本服務按鈕,進入一鍵部署頁。

  2. 根據介面提示,選擇地區可用區

  3. 在執行個體配置中,選擇執行個體規格並設定執行個體密碼

    選擇最低配置即可,您可以選擇共用型執行個體節省體驗成本。不同地區及可用性區域所支援的執行個體規格不同,請以介面顯示為準。
  4. 選擇RDS執行個體規格並設定RDS資料庫密碼

  5. 確認費用後,單擊立即部署按鈕,等待建立完成。

    您可以在具體資源頁簽下查看進度。您需要關注的資源從15依次為安全性群組、Virtual Private Cloud、交換器、ECS執行個體、RDS資料庫。
  6. 查看輸出頁簽下,找到輸出的WebUrl的連結。

    您可以在瀏覽器多次訪問該連結,每次看到的都是相同的IP,證明訪問到同一台ECS執行個體。

2. 構建包含商務服務的執行個體鏡像

為確保後續您新擴充的執行個體中部署有商務服務和設定好的自啟動指令碼,您需要先以該執行個體為基礎建立自訂鏡像,後續建立的執行個體會以該鏡像作為基礎鏡像,在執行個體啟動時,您的商務服務也隨之啟動。

  1. 進入ECS管理主控台,將地區切換到您在步驟1中準備的執行個體的地區。

  2. 找到步驟1中準備好的ECS執行個體,在右側操作列,選擇雲端硬碟與鏡像 > 建立自訂鏡像

  3. 在彈出的建立自訂鏡像對話方塊中,記錄鏡像名稱,方便後續尋找,單擊確認按鈕,等待鏡像建立完成。您可以在ECS控制台左側導覽列單擊執行個體與鏡像 > 鏡像查看鏡像建立進度。

3. 建立管理服務叢集的伸縮組

彈性高可用架構的核心是通過伸縮組管理您的服務叢集,您可以通過伸縮組快速複製執行個體,建立並啟用伸縮組具體操作如下:

  1. 進入伸縮組管理頁。

    1. 登入Auto Scaling控制台

      如果您是第一次使用Auto Scaling,請根據介面提示開通Auto Scaling的許可權。具體操作,請參見服務關聯角色

    2. 在左側導覽列中,單擊伸縮組管理
    3. 在頂部功能表列處,選擇地區。
  2. 建立伸縮組。

    1. 伸縮組管理頁面,單擊建立伸縮組按鈕進入建立伸縮組頁面。

    2. 在頁面中完成如下配置。表中未涉及的配置項保持預設即可。

      配置項

      說明

      伸縮組名稱

      根據介面提示輸入。本樣本伸縮組名稱為ess-demo。

      伸縮群組類型

      選中ECS

      組內執行個體配置資訊來源

      選中選擇已有執行個體

      選擇已有執行個體

      選擇在步驟1中準備的ECS執行個體。

      組內最小執行個體數

      伸縮組中執行個體數的最小值,當伸縮組執行個體數低於該值時,會自動觸發擴充。本樣本最小執行個體數為0。

      組內最大執行個體數

      伸縮組中執行個體數的最大值,當伸縮組執行個體數高於該值時,會自動觸發收縮。本樣本最大執行個體數為10。

      專有網路選擇交換器

      這兩個配置項會根據您選擇的ECS執行個體,自動填滿。

      重要

      建議您建立並選擇多個可用性區域的交換器,避免出現單一可用性區域執行個體庫存不足導致擴容失敗,建立交換器,請參見建立交換器

      展開高級配置 > 開啟期望執行個體數

      選擇開啟。開啟該功能之後,可以通過設定期望執行個體數自動擴縮容。

      展開高級配置 > 組內期望執行個體數

      輸入0即可,表示先建立一個空的伸縮組。

      展開高級配置 > 執行個體的健全狀態檢查

      選中執行個體狀態檢查負載平衡健全狀態檢查,啟用該功能後,系統會根據健全狀態檢查的結果,確保伸縮組中的所有執行個體及其商務服務正常運行。一旦探索服務異常,將及時用新執行個體替換故障執行個體。

    3. 單擊建立按鈕,等待伸縮組建立完成。

  3. 修改伸縮配置中的執行個體鏡像。

    在通過選擇已有執行個體建立伸縮組後,會根據ECS的原始鏡像建立一個伸縮配置,通過步驟1建立的執行個體中,原始鏡像不包含後續部署好的商務服務軟體包。因此需要將步驟2中新建立的鏡像覆蓋伸縮配置的基礎鏡像。
    1. 在伸縮組管理頁,找到剛剛建立的伸縮組,在右側操作列下,單擊查看詳情進入該伸縮組的詳情頁。

    2. 執行個體配置來源 > 伸縮設定頁簽下,單擊唯一的伸縮配置操作列下的修改鏡像

    3. 在彈出的修改鏡像的彈框中,選擇自訂鏡像,根據介面提示,選擇步驟2中建立的鏡像。單擊確認按鈕完成修改。

  4. 啟用伸縮組。

    在伸縮組管理頁,點擊右上方的啟用按鈕,伸縮組開始工作。

4. 為叢集設定統一訪問入口

當您將執行個體從1台擴充到多台時,需要為多台執行個體組成的叢集設定統一的訪問入口。您需要為伸縮組建立並關聯負載平衡器,使使用者請求通過負載平衡器自動分攤到叢集的各台ECS執行個體,從而平衡負載,最大化資源使用率。本樣本使用應用型負載平衡(ALB)作為負載平衡器,具體操作如下:

4.1 建立負載平衡器

  1. 登入應用型負載平衡ALB控制台

  2. 執行個體頁面,單擊建立應用型負載平衡

  3. 應用型負載平衡(隨用隨付)國際站購買頁面。根據介面提示完成應用型負載平衡的建立。

    本樣本以下配置,未提及配置項保持預設。

    配置項

    說明

    地區

    關聯與步驟1中執行個體的地區保持一致。

    執行個體網路類型

    選擇公網

    VPC

    選擇步驟1中準備執行個體的VPC。

    可用區

    至少選擇兩個,如果選擇的可用性區域沒有交換器,需要根據介面提示建立對應可用性區域的交換器。建立交換器的操作說明,請參見建立交換器

4.2 為業務叢集建立後端伺服器組

此後端伺服器組將會關聯到伸縮組,伸縮組建立的執行個體會自動添加到該後端伺服器組,通過負載平衡器對外提供服務。

  1. 在應用型負載平衡ALB控制台。選擇地區。

  2. 單擊左側導覽列的伺服器組進入伺服器組頁面,單擊建立伺服器組按鈕,根據介面提示完成後端伺服器組的建立。

    本樣本使用以下配置,未提及配置項保持預設。

    配置項

    說明

    伺服器群組類型

    選擇伺服器類型

    伺服器組名稱

    根據介面提示輸入,本樣本以ess-test-server-group為例。

    VPC

    選擇步驟1中準備的執行個體的VPC。

4.3 為負載平衡器配置監聽

建立一個HTTP監聽來轉寄來自HTTP協議的請求,Server Load Balancer執行個體在監聽到HTTP請求時,可以將請求轉寄到後端伺服器組的ECS執行個體中。

  1. 在應用型負載平衡ALB控制台。選擇地區。

  2. 單擊左側導覽列的執行個體,找到步驟4.1建立的負載平衡器,在右側操作列下單擊建立監聽,根據介面提示完成監聽的建立。

    本樣本使用以下配置,未提及配置項保持預設。

    配置項

    說明

    選擇監聽協議

    選擇HTTP

    監聽連接埠

    負載平衡對外提供服務的連接埠,本樣本服務的使用80,代表監聽訪問該負載平衡器80連接埠的請求。

    選擇伺服器組

    選擇步驟4.2建立的伺服器組。

4.4 為伸縮組關聯負載平衡器

  1. 在伸縮組管理頁,找到步驟3中建立的伸縮組,在右側操作列下,單擊查看詳情進入該伸縮組的詳情頁。

  2. 基本資訊頁簽下,找到關聯負載平衡ALB、NLB伺服器組,單擊添加關聯負載平衡ALB、NLB伺服器組,在彈出的對話方塊中單擊添加伺服器組,根據介面提示,關聯步驟4.2建立的後端伺服器組。完成配置後,單擊確認按鈕完成關聯負載平衡器的操作。

    重要

    該配置項中的連接埠設定為您的商務服務對外提供服務的連接埠,本樣本的商務服務使用80連接埠。

5. 開始擴充執行個體(驗證)

在準備好伸縮組並已關聯負載平衡器之後,此時可以開始擴充執行個體,驗證叢集是否可以正常工作。

  1. 觸發伸縮組的擴容操作,伸縮組將自動建立執行個體。

    您可以通過修改伸縮組期望執行個體數觸發擴容操作。具體操作步驟如下:

    1. 在伸縮組管理頁,找到剛剛建立的伸縮組,在右側操作列下,單擊查看詳情進入該伸縮組的詳情頁。

    2. 基本資訊頁簽下,找到執行個體伸縮概覽,單擊image,在彈出的修改執行個體伸縮概覽彈框中,修改組內期望執行個體數,從0修改為3(代表叢集需要3ECS執行個體對外提供服務),單擊確認完成修改。

    3. 等待執行個體建立完成,完成後會在伸縮組下建立3ECS執行個體,您可以在執行個體列表頁簽下查看執行個體的建立情況。

  2. 訪問負載平衡器的地址,驗證請求可以負載平衡到新建立的執行個體。

    1. 進入應用型負載平衡ALB控制台

    2. 找到步驟4.1中建立的負載平衡器,在DNS名稱下,找到訪問的網址。

    3. 多次訪問該網址,可以看到不同的IP地址,證明可以通過負載平衡器訪問到不同的伺服器。

6. (可選)資源清理

如果您不再需要該叢集,您可以通過以下流程清理資源。

  1. 釋放步驟4.1中建立的負載平衡器。具體操作,請參見釋放ALB執行個體

  2. 刪除步驟3中建立的伸縮組。具體操作,請參見刪除伸縮組

  3. 刪除步驟4.2中建立的後端伺服器組。具體操作,請參見建立和管理伺服器組

  4. 刪除步驟2中構建的自訂鏡像。具體操作,請參見刪除自訂鏡像

  5. 刪除您在步驟3步驟4.1中建立的交換器(vSwitch),具體操作,請參見建立和管理專用網路刪除交換器

  6. 清理步驟1中部署的樣本服務。如果您部署了步驟1中的樣本服務,您可以刪除其建立的資源棧,在刪除資源棧時,選擇刪除方式釋放資源,即可完成樣本服務的資源清理。具體操作,請參見刪除資源棧

後續使用建議

用於生產環境之前

為了確保該彈性高可用方案在生產環境中穩定運行,建議您在用於生產環境前,完成以下操作:

  • 完善伸縮組配置

    • 實現多可用性區域容災:您可以為伸縮組配置多個可用性區域的交換器,並設定均衡分布策略,這樣伸縮組可以在多個可用性區域建立執行個體,並將商務服務執行個體均衡分布在各個可用性區域,提升叢集的擴容成功率和容災能力。具體操作,請參見擴縮容策略

    • 選擇多個執行個體規格提高擴容成功率:單一執行個體規格在庫存不足時也會出現擴容失敗的現象,您可以選擇多個執行個體規格建立執行個體,以提高擴容成功率。具體操作,請參見建立伸縮配置(ECS執行個體)

  • 充分測試

    如果將該彈性高可用方案應用於生產環境,建議您在叢集搭建完成後,進行測試工作,確保您的服務複製為多個時不會出現問題,同時也可以對叢集進行壓測,來預估您的資源需求。

使用網域名稱作為叢集訪問入口

修改網域名稱解析

如果您原來使用網域名稱訪問您的ECS執行個體,您可以調整網域名稱解析,將網域名稱指向您的負載平衡器,這樣,通過網域名稱訪問時,使用者的請求可以經過負載平衡器訪問到您的服務叢集。具體操作,請參見ALB配置CNAME解析

重要

在您修改網域名稱解析之後,由於DNS傳播需要時間,請暫時不要調整原服務的IP或者停止原執行個體,請先保持原ECS執行個體運行一段時間,您可以先在監控中觀察流入該ECS執行個體的流量,待流量清零時再停止該執行個體。

這麼做是為了避免使用者所使用的DNS伺服器沒有更新DNS緩衝,從而訪問原ECS執行個體的IP。此時如果該ECS執行個體停止服務,會造成這部分使用者無法訪問。

HTTPS協議支援

本樣本使用HTTP訪問叢集,如果您需要您的叢集訪問網域名稱支援HTTPS,需要為負載平衡器設定HTTPS監聽,具體操作,請參見添加HTTPS監聽

使用伸縮組的Auto Scaling功能

  • 設計伸縮方案:本教程不涉及自動調整方案的設計,後續您可以為伸縮組設定自動調整方案最佳化成本,如何設計伸縮方案,請參見支援的伸縮方案

  • 進階功能需求:如果您有更多伸縮組的進階功能需求,比如提高擴容成功率、進一步降低成本等,請參見進階需求