使用自動修復功能以提供高可用性

本互動式教學課程說明如何使用自動修復功能在 Compute Engine 上建構高可用性的應用程式。

高可用性的應用程式是專為提供用戶端最少延遲時間和停機時間所設計。當應用程式當機或停止運作時,可用性就遭到破壞。可用性遭破壞應用程式的用戶端可能會發生高延遲或停機狀況。

您可以利用自動修復功能,自動重新啟動可用性遭破壞的應用程式。這項功能可偵測運作失敗的執行個體並自動重新建立執行個體,以便再次為用戶端提供服務。只要使用自動修復功能,您就不必在發生故障時手動復原應用程式來恢復服務。

目標

  • 設定健康狀態檢查和自動修復政策。
  • 在代管執行個體群組上設定示範網路服務。
  • 模擬健康狀態檢查失敗,並見證自動修復的復原程序。

費用

本教學課程使用的 GCP 可計費元件包括:

  • Compute Engine

事前準備

    登入您的 Google 帳戶。

    如果您沒有帳戶,請申請新帳戶

    選取或建立 Google Cloud Platform 專案。

    前往「Manage resources」(管理資源) 頁面

    請確認您已啟用 Google Cloud Platform 專案的計費功能。

    瞭解如何啟用計費功能

    啟用Compute Engine API。

    啟用 API

如果您希望透過指令列操作,請先安裝 gcloud 指令列工具。

應用程式架構

應用程式包含以下 Compute Engine 元件:

系統架構圖表,顯示健康狀態檢查和執行個體群組

健康狀態檢查如何探測示範網路服務

健康狀態檢查會透過指定通訊協定 (例如 HTTP(S)、SSL 或 TCP),將探測要求傳送給執行個體。詳情請參閱健康狀態檢查運作方式健康狀態檢查類別、通訊協定和通訊埠的相關說明文件。

本教學課程中的健康狀態檢查是探測通訊埠 80 上 HTTP 路徑 /health 的 HTTP 健康狀態檢查。如果是 HTTP 健康狀態檢查,則只有在路徑傳回 HTTP 200 (OK) 回應時才會傳送探測要求。在本教學課程中,示範網路伺服器會定義路徑 /health 在健康狀態良好的狀況下傳回 HTTP 200 (OK) 回應,在健康狀態不良的狀況下則傳回 HTTP 500 (Internal Server Error) 回應。詳情請參閱 HTTP、HTTPS 和 HTTP/2 的成功標準相關說明文件。

建立健康狀態檢查

如要設定自動修復功能,請建立自訂健康狀態檢查,並將網路防火牆設定為允許使用健康狀態檢查探測器。

主控台

  1. 建立健康狀態檢查。

    1. 前往 GCP 主控台的「Health checks」(健康狀態檢查) 頁面。
      前往「Health checks」(健康狀態檢查) 頁面
    2. 按一下 [Create Health Check] (建立健康狀態檢查)
    3. 將「Name」(名稱) 設為 autohealer-check
    4. 針對「Protocol」(通訊協定),選取 [HTTP]。
    5. 將「Request path」(要求路徑) 設為 /health。這項設定會指出健康狀態檢查使用的是哪一個 HTTP 路徑。在本教學課程中,示範網路伺服器會定義路徑 /health 在健康狀態良好的狀況下傳回 HTTP 200 (OK) 回應,在健康狀態不良的狀況下則傳回 HTTP 500 (Internal Server Error) 回應。
    6. 設定「Health criteria」(健康狀態判定條件):
      1. 將「Check interval」(檢查時間間隔) 設為 10。這項設定可定義從開始一次探測到開始下一次探測的時間長度。
      2. 將「Timeout」(逾時) 設定為 5。這項設定可定義 GCP 等待探測回應的時間長度,這個值必須小於或等於檢查時間間隔。
      3. 將「Healthy threshold」(良好健康狀態判定門檻) 設為 2。這項設定可定義要將執行個體的健康狀態判定為良好時必須執行成功的連續探測次數。
      4. 將「Unhealthy threshold」(不良健康狀態判定門檻) 設為 3。這項設定可定義要將執行個體的健康狀態判定為不良時必須執行失敗的連續探測次數。
    7. 按一下底端的 [Create] (建立)。
  2. 建立防火牆規則,允許健康狀態檢查探測器發出 HTTP 要求。

    1. 前往 GCP 主控台的「Create firewall rule」(建立防火牆規則) 頁面。
      前往「Create firewall rule」(建立防火牆規則) 頁面
    2. 在「Name」(名稱) 中,輸入 default-allow-http-health-check
    3. 在「Network」(網路) 中選取 [default] (預設值)。
    4. 在「Targets」(目標) 中選取 [All instances in the network] (網路中的所有執行個體)。
    5. 在「Source filter」(來源篩選器) 欄中選取 [IP ranges] (IP 範圍)。
    6. 在「Source IP ranges」(來源 IP 範圍) 欄中,輸入 130.211.0.0/2235.191.0.0/16
    7. 在「Protocols and ports」(通訊協定和通訊埠) 中選取 [tcp],然後輸入 80
    8. 按一下 [Create] (建立)。

gcloud

  1. 建立健康狀態檢查。

    gcloud compute health-checks create http autohealer-check \
        --check-interval 10 \
        --timeout 5 \
        --healthy-threshold 2 \
        --unhealthy-threshold 3 \
        --request-path "/health"
    
    • check-interval 可定義從開始一次探測到開始下一次探測的時間長度。
    • timeout 可定義 GCP 等待探測回應的時間長度,這個值必須小於或等於檢查時間間隔。
    • healthy-threshold 可定義要將執行個體的健康狀態判定為良好時必須執行成功的連續探測次數。
    • unhealthy-threshold 可定義要將執行個體的健康狀態判定為不良時必須執行失敗的連續探測次數。
    • request-path 會指出健康狀態檢查使用的是哪一個 HTTP 路徑。在本教學課程中,示範網路伺服器會定義路徑 /health 在健康狀態良好的狀況下傳回 HTTP 200 (OK) 回應,在健康狀態不良的狀況下則傳回 HTTP 500 (Internal Server Error) 回應。
  2. 建立防火牆規則,允許健康狀態檢查探測器發出 HTTP 要求。

    gcloud compute firewall-rules create default-allow-http-health-check \
        --network default \
        --allow tcp:80 \
        --source-ranges 130.211.0.0/22,35.191.0.0/16
    

什麼是良好的自動修復健康狀態檢查

用於自動修復功能的健康狀態檢查必須較為保守,這樣才不會預先刪除及重新建立執行個體。如果自動修復程式的健康狀態檢查過於嚴格,自動修復程式可能會將忙碌的執行個體誤判為失敗的執行個體,不必要地加以重新啟動,因而降低了可用性。

  • unhealthy-threshold (不良健康狀態判定門檻):應大於 1,最好是 3 或以上。這樣可防止發生如網路封包遺失等罕見失敗狀況。
  • healthy-threshold (良好健康狀態判定門檻):2 這個值可適用於多數應用程式。
  • timeout (逾時):應遠大於 (5 倍以上) 預期回應時間。這樣可防止意外的延遲狀況 (例如執行個體忙碌運作或網路連線速度緩慢)。
  • check-interval (檢查時間間隔):不應過長 (逾時的 2 倍) 或過短 (少於 1 秒)。如果過長,就無法快速找出失敗的執行個體;要是過短,執行個體和網路可能會因每秒發送的大量健康狀態檢查探測器而變得非常忙碌。

設定網路服務

如要設定示範網路服務,請建立執行個體範本,這個範本必須在開機時啟動示範網路伺服器。接著,使用這個執行個體範本部署代管執行個體群組並啟用自動修復功能。

主控台

  1. 建立執行個體範本。請在其中加入開機指令碼,以啟動示範網路伺服器。

    1. 前往 GCP 主控台的「Instance Templates」(執行個體範本) 頁面。
      前往「Instance templates」(執行個體範本) 頁面
    2. 按一下 [Create instance template] (建立執行個體範本)。
    3. 將「Name」(名稱) 設為 webserver-template
    4. 針對「Machine configuration」(機器設定),選取 micro (f1-micro)。
    5. 在「Firewall」(防火牆) 下方,勾選 [Allow HTTP traffic] (允許 HTTP 流量) 核取方塊。
    6. 按一下 [Management, security, disks, networking, sole tenancy] (管理、安全性、磁碟、網路、單獨租用) 即可顯示進階設定,畫面上應該會出現數個分頁。
    7. 在「Management」(管理) 分頁中,找到「Automation」(自動) 並輸入下列開機指令碼
      sudo apt-get update && sudo apt-get install git gunicorn3 python3-pip -y
      git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
      cd python-docs-samples/compute/managed-instances/demo
      sudo pip3 install -r requirements.txt
      sudo gunicorn3 --bind 0.0.0.0:80 app:app --daemon
      
    8. 按一下頁面底部的 [Create] (建立)。
  2. 將網路伺服器部署為代管執行個體群組。

    1. 前往 GCP 主控台的「Instance Groups」(執行個體群組) 頁面。
      前往「Instance groups」(執行個體群組) 頁面
    2. 按一下 [Create instance group] (建立執行個體群組)。
    3. 將「Name」(名稱) 設為 webserver-group
    4. 針對「Region」(地區),選取 [europe-west1]。
    5. 針對「Zone」(區域),選取 [europe-west1-b]。
    6. 針對「Instance template」(執行個體範本),選取 [webserver-template]。
    7. 針對「Autoscaling」(自動調度資源),選取 [Off] (關閉)。
    8. 將「Number of instances」(執行個體數量) 設為 3
    9. 針對「Health check」(健康狀態檢查),選取 [autohealer-check]。
    10. 將「Initial delay」(初始延遲) 設為 90
    11. 按一下 [Create] (建立)。
  3. 建立防火牆規則,允許對網路伺服器發出 HTTP 要求。

    1. 前往 GCP 主控台的「Create firewall rule」(建立防火牆規則) 頁面。
      前往「Create firewall rule」(建立防火牆規則) 頁面
    2. 在「Name」(名稱) 中,輸入 default-allow-http
    3. 在「Network」(網路) 中選取 [default] (預設值)。
    4. 在「Targets」(目標) 中選取 [Specified target tags] (網路中的所有執行個體)。
    5. 在「Target Tags」(目標標記) 中,輸入 http-server
    6. 在「Source filter」(來源篩選器) 欄中選取 [IP ranges] (IP 範圍)。
    7. 在「Source IP ranges」(來源 IP 範圍) 中輸入 0.0.0.0/0
    8. 在「Protocols and ports」(通訊協定和通訊埠) 中選取 [tcp],然後輸入 80
    9. 按一下 [Create] (建立)。

gcloud

  1. 建立執行個體範本。請在其中加入開機指令碼,以啟動示範網路伺服器。

    gcloud compute instance-templates create webserver-template \
        --machine-type f1-micro \
        --tags http-server \
        --metadata startup-script='
      sudo apt-get update && sudo apt-get install git gunicorn3 python3-pip -y
      git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
      cd python-docs-samples/compute/managed-instances/demo
      sudo pip3 install -r requirements.txt
      sudo gunicorn3 --bind 0.0.0.0:80 app:app --daemon'
    
  2. 建立執行個體群組。

    gcloud compute instance-groups managed create webserver-group \
        --zone europe-west1-b \
        --template webserver-template \
        --size 3 \
        --health-check autohealer-check \
        --initial-delay 90
    
  3. 建立防火牆規則,允許對網路伺服器發出 HTTP 要求。

    gcloud compute firewall-rules create default-allow-http \
        --network default \
        --allow tcp:80 \
        --target-tags http-server
    

模擬健康狀態檢查失敗

如要模擬健康狀態檢查失敗的狀況,您可以利用示範網路伺服器所提供的數種方式強制發生健康狀態檢查失敗的狀況。

主控台

  1. 前往網路伺服器執行個體。

    1. 前往 GCP 主控台的「VM instances」(VM 執行個體) 頁面。
      前往「VM instances」(VM 執行個體) 頁面
    2. 在「External IP」(外部 IP) 欄底下,點選任一 webserver-group 執行個體的 IP 位址。網路瀏覽器應隨即開啟新的分頁。如果要求逾時或網頁無法使用,請稍候幾分鐘,讓伺服器完成設定,然後再試一次。

    示範網路伺服器會顯示如下頁面:

    簡單的示範網頁,顯示綠色狀態按鈕和藍色動作按鈕

  2. 在示範網頁上,按一下 [Make unhealthy] (將健康狀態設為不良)。

    這樣做會導致網路伺服器無法通過健康狀態檢查。具體來說,網路伺服器會讓 /health 路徑傳回 HTTP 500 (Internal Server Error)。您可以快速點選 [Check health] (檢查健康狀態) 按鈕,自行確認這個狀況 (這個方法將在自動修復程式開始重新啟動執行個體後失效)。

  3. 等待自動修復程式採取動作。

    1. 前往 GCP 主控台的「VM instances」(VM 執行個體) 頁面。
      前往「VM instances」(VM 執行個體) 頁面
    2. 等候網路伺服器執行個體的狀態變更。執行個體名稱旁的綠色勾號應會變成灰色正方形,代表自動修復程式已開始重新啟動健康狀態不良的執行個體。
    3. 定期點選頁面頂端的 [Refresh] (重新整理),即可取得最新狀態。
    4. 當灰色正方形變回綠色勾號時,自動修復程序就完成了,代表執行個體已再次回到良好的健康狀態。

gcloud

  1. 監控執行個體群組的狀態 (完成時請使用 Ctrl-C 鍵停止監控)。

    while : ; do \
        gcloud compute instance-groups managed list-instances webserver-group \
        --zone europe-west1-b \
        ; done
    
    NAME                 ZONE            STATUS   ACTION  INSTANCE_TEMPLATE   VERSION_NAME  LAST_ERROR
    webserver-group-d5tz  europe-west1-b  RUNNING  NONE    webserver-template
    webserver-group-q6t9  europe-west1-b  RUNNING  NONE    webserver-template
    webserver-group-tbpj  europe-west1-b  RUNNING  NONE    webserver-template
    

    如果執行個體顯示的狀態不是 RUNNING (執行中),例如 STAGING (準備中),請稍候幾分鐘,讓執行個體完成設定,然後再試一次。

  2. 開啟新的殼層工作階段,並安裝 gcloud。

  3. 取得網路伺服器執行個體的位址。

    gcloud compute instances list --filter webserver-group
    

    在「EXTERNAL_IP」(外部 IP) 欄底下,複製任一網路伺服器執行個體的 IP 位址,並儲存為本機 bash 變數。

    export IP_ADDRESS=[EXTERNAL_IP_ADDRESS]
    
  4. 確認網路伺服器已完成設定。該伺服器應會傳回 HTTP 200 OK 回應。

    curl --head $IP_ADDRESS/health
    
    HTTP/1.1 200 OK
    Server: gunicorn/19.6.0
    ...
    

    如果收到 Connection refused 錯誤,請稍候幾分鐘,讓伺服器完成設定,然後再試一次。

  5. 將網路伺服器的健康狀態設為不良。

    curl $IP_ADDRESS/makeUnhealthy > /dev/null
    

    這樣做會導致網路伺服器無法通過健康狀態檢查。具體來說,網路伺服器會讓 /health 路徑傳回 HTTP 500 INTERNAL SERVER ERROR。您可以快速對 /health 發出要求,自行確認這個狀況 (這個方法將在自動修復程式開始重新啟動執行個體後失效)。

    curl --head $IP_ADDRESS/health
    
    HTTP/1.1 500 INTERNAL SERVER ERROR
    Server: gunicorn/19.6.0
    ...
    
  6. 返回第一個殼層工作階段監控執行個體群組,並等待自動修復程式採取動作。

    1. 自動修復程序啟動後,「STATUS」(狀態) 和「ACTION」(動作) 兩欄將會更新,代表自動修復程式已開始重新啟動健康狀態不良的執行個體。

      NAME                 ZONE            STATUS    ACTION      INSTANCE_TEMPLATE   VERSION_NAME  LAST_ERROR
      webserver-group-d5tz  europe-west1-b  RUNNING   NONE        webserver-template
      webserver-group-q6t9  europe-west1-b  RUNNING   NONE        webserver-template
      webserver-group-tbpj  europe-west1-b  STOPPING  RECREATING  webserver-template
      
    2. 自動修復程序一旦完成,執行個體就會再次回報 RUNNING (執行中) 的 STATUS (狀態) 以及 NONE (無) 的 ACTION (動作),代表執行個體已成功重新啟動。

      NAME                 ZONE            STATUS   ACTION  INSTANCE_TEMPLATE   VERSION_NAME  LAST_ERROR
      webserver-group-d5tz  europe-west1-b  RUNNING  NONE    webserver-template
      webserver-group-q6t9  europe-west1-b  RUNNING  NONE    webserver-template
      webserver-group-tbpj  europe-west1-b  RUNNING  NONE    webserver-template
      
    3. 執行個體群組監控完畢後,請使用 Ctrl-C 鍵結束監控。

您可視需要重複進行這項練習。不妨參考下列建議:

  • 如果您一次將所有執行個體的健康狀態都設為不良,會發生什麼狀況?如要進一步瞭解並行失敗期間的自動修復行為,請參閱自動修復行為相關說明文件。

  • 您是否能夠透過更新健康狀態檢查設定的方式,盡快修復執行個體?(在實務上,您應該採用本教學課程中說明的保守值來設定健康狀態檢查參數。否則,執行個體可能會在沒有實際發生問題的情況下遭到錯誤刪除及重新啟動)。

  • 執行個體群組提供 initial delay (初始延遲) 設定。您是否能夠決定本示範網路伺服器所需的最少延遲時間?(在實務上,您應將延遲時間設為比執行個體開機及開始提供應用程式要求服務的時間更長 (10% 到 20% 之間)。否則,執行個體可能會卡在自動修復開機循環中)。

(選用) 查看自動修復程式記錄

您可使用 gcloud 指令查看自動修復程式作業的記錄。

gcloud compute operations list --filter='operationType~compute.instances.repair.*'

詳情請參閱自動修復作業記錄的說明文件。

清除所用資源

完成自動修復作業的教學課程後,您可以清除在 GCP 上建立的資源,這樣資源就不會占用配額,您日後也無須為其付費。下列各節將說明如何刪除或停用這些資源。

如果您為本教學課程建立了獨立的專案,可以刪除整個專案。否則,要是專案內有您想保留的資源,可以只刪除您在本教學課程中建立的特定資源。

刪除專案

  1. 前往 GCP 主控台的「Projects」(專案) 頁面。

    前往專案頁面

  2. 在專案清單中選取要刪除的專案,然後按一下 [Delete] (刪除)
  3. 在對話方塊中輸入專案 ID,按一下 [Shut down] (關閉) 即可刪除專案。

刪除特定資源

如果您無法刪除本教學課程中使用的專案,請個別刪除教學課程使用的資源。

刪除執行個體群組

主控台

  1. 前往 GCP 主控台的「Instances Groups」(執行個體群組) 頁面。

    前往 GCP 主控台的執行個體群組 頁面

  2. 找到 您的 webserver-group 執行個體群組,然後按一下旁邊的核取方塊。
  3. 按一下頁面頂端的 [刪除] 按鈕, 刪除該執行個體群組。

gcloud

gcloud compute instance-groups managed delete webserver-group --zone europe-west1-b -q

刪除執行個體範本

主控台

  1. 前往 GCP 主控台的「Instance Templates」(執行個體範本) 頁面。

    前往「Instance templates」(執行個體範本) 頁面

  2. 勾選所需執行個體範本旁的核取方塊。

  3. 按一下頁面頂端的「刪除」圖示 。在隨即顯示的新視窗中,按一下 [Delete] (刪除) 以進行確認。

gcloud

gcloud compute instance-templates delete webserver-template -q

刪除健康狀態檢查

主控台

  1. 前往 GCP 主控台的「Health checks」(健康狀態檢查) 頁面。

    前往「Health checks」(健康狀態檢查) 頁面

  2. 勾選所需健康狀態檢查旁的核取方塊。

  3. 按一下頁面頂端的「刪除」圖示 。在隨即顯示的新視窗中,按一下 [Delete] (刪除) 以進行確認。

gcloud

gcloud compute health-checks delete autohealer-check -q

刪除防火牆規則

主控台

  1. 前往 GCP 主控台的「Firewall Rules」(防火牆規則) 頁面。

    前往「Firewall Rules」(防火牆規則) 頁面

  2. 找到名為 default-allow-httpdefault-allow-http-health-check 的防火牆規則,然後勾選旁邊的核取方塊。

  3. 按一下頁面頂端的「刪除」圖示 。在隨即顯示的新視窗中,按一下 [Delete] (刪除) 以進行確認。

gcloud

gcloud compute firewall-rules delete default-allow-http default-allow-http-health-check -q

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Compute Engine 說明文件