使用自動修復功能建構高可用的應用程式


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

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

您可以利用自動修復功能,自動重新啟動遭到破壞的應用程式。這項功能可立即偵測運作失敗的虛擬機器 (VM) 執行個體,並自動重新建立執行個體,以再次為用戶端提供服務。有了自動修復功能,您就不必在發生故障後手動復原應用程式的服務。

目標

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

費用

本教學課程使用 Google Cloud 的計費元件,包括:

  • Compute Engine

事前準備

    Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.

    In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

    Make sure that billing is enabled for your Google Cloud project.

    Enable the Compute Engine API.

    Enable the API

    In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

    Make sure that billing is enabled for your Google Cloud project.

    Enable the Compute Engine API.

    Enable the API

如果您希望透過指令列操作,請安裝 Google Cloud CLI。

應用程式架構

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

健康狀態檢查和執行個體群組的系統架構。

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

健康狀態檢查會透過指定通訊協定 (例如 HTTP(S)、SSL 或 TCP),將探測要求傳送給 VM。詳情請參閱「健康狀態檢查運作方式」和「健康狀態檢查類別、通訊協定和通訊埠」。

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

建立健康狀態檢查

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

在本教學課程中,您將建立地區健康狀態檢查。如要自動修復,您可以使用區域全域健康狀態檢查。區域健康檢查可減少跨區域依附元件,並有助於實現資料落地。如果您想在多個區域的 MIG 中使用相同的健康狀態檢查,全域健康狀態檢查就很方便。

控制台

  1. 建立健康狀態檢查。

    1. 前往 Google Cloud 控制台中的「Create health check」(建立健康狀態檢查) 頁面。

      前往「建立健康狀態檢查」

    2. 在「Name」(名稱) 欄位中輸入 autohealer-check

    3. 將「範圍」設為 Regional

    4. 在「Region」(區域) 下拉式選單中,選取「europe-west1」。

    5. 在「Protocol」(通訊協定) 中選取 HTTP

    6. 將「Request path」(要求路徑) 設為 /health。這項設定會指出健康狀態檢查使用的是哪一個 HTTP 路徑。在本教學課程中,示範網路伺服器會定義路徑 /health 在健康狀態良好的狀況下傳回 HTTP 200 (OK) 回應,在健康狀態不良的狀況下則傳回 HTTP 500 (Internal Server Error) 回應。

    7. 設定「Health criteria」(健康狀態判定條件):

      1. 將「Check interval」(檢查時間間隔) 設為 10。這項設定可定義從開始一次探測到開始下一次探測的時間長度。
      2. 將「Timeout」(逾時) 設定為 5。這項設定可定義Google Cloud 等待探測回應的時間長度。這個值必須小於或等於檢查時間間隔。
      3. 將「Healthy threshold」(良好健康狀態判定門檻) 設為 2。這項設定可定義要將 VM 的健康狀態判定為良好時,必須成功執行的連續探測次數。
      4. 將「Unhealthy threshold」(不良健康狀態判定門檻) 設為 3。這項設定可定義要將 VM 的健康狀態判定為不良時,探測必須連續失敗的次數。
    8. 保留其他選項的預設值。

    9. 按一下底端的 [Create] (建立)。

  2. 建立防火牆規則,允許健康狀態檢查探測器發出 HTTP 要求。

    1. 在 Google Cloud 控制台中,前往「Create firewall rule」(建立防火牆規則) 頁面。

      前往「建立防火牆規則」

    2. 在「Name」(名稱) 中輸入 default-allow-http-health-check

    3. 在「Network」(網路) 中選取 default

    4. 在「Targets」(目標) 中選取 All instances in the network

    5. 在「Source filter」(來源篩選器) 中選取 IPv4 ranges

    6. 在「Source IPv4 ranges」(來源 IPv4 範圍) 中輸入 130.211.0.0/22, 35.191.0.0/16

    7. 在「Protocols and ports」(通訊協定和通訊埠) 中選取「TCP」,然後輸入 80

    8. 保留其他選項的預設值。

    9. 按一下 [建立]。

gcloud

  1. 使用 health-checks create http 指令建立健康狀態檢查。

    gcloud compute health-checks create http autohealer-check \
        --region europe-west1 \
        --check-interval 10 \
        --timeout 5 \
        --healthy-threshold 2 \
        --unhealthy-threshold 3 \
        --request-path "/health"
    
    • check-interval 定義從一次探測開始到下一次探測開始之間的時間間隔。
    • timeout 定義 Google Cloud等待探測回應的時間長度。這個值必須小於或等於檢查時間間隔。
    • healthy-threshold 定義要將 VM 的健康狀態判定為良好時必須執行成功的連續探測次數。
    • unhealthy-threshold 定義要將 VM 判定為不良健康狀態時,必須失敗的連續探測次數。
    • 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。將此時間值設為遠大於 (五倍以上) 預期回應時間。這樣可防止意外的延遲狀況 (例如執行個體忙碌運作或網路連線速度緩慢)。
  • check-interval。此值應介於 1 秒和兩倍的逾時值之間 (不會過長也不會過短)。當值過長時,就無法及時找出失敗的執行個體。如果過短,執行個體和網路可能會因每秒發送的大量健康狀態檢查探測器而變得非常忙碌。

設定網路服務

本教學課程使用儲存在 GitHub 上的網路應用程式。如要進一步瞭解應用程式的實作方式,請參閱 GoogleCloudPlatform/python-docs-samples GitHub 存放區。

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

主控台

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

    1. 前往 Google Cloud 控制台的「Create instance template」(建立執行個體範本) 頁面。

      前往「建立執行個體範本」

    2. 將「Name」(名稱) 設為 webserver-template

    3. 在「Location」部分,從「Region」下拉式選單中選取「europe-west1」

    4. 在「機器設定」專區的「機器類型」下拉式選單中,選取「e2-medium」

    5. 在「Firewall」(防火牆) 專區中,選取「Allow HTTP traffic」(允許 HTTP 流量) 核取方塊。

    6. 展開「進階選項」部分,即可查看進階設定。畫面上會顯示多個子區段。

    7. 在「Management」專區中,找到「Automation」並輸入下列「Startup script」

      apt update && apt -y install git python3-pip python3-venv
      git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
      python3 -m venv venv
      ./venv/bin/pip3 install -Ur ./python-docs-samples/compute/managed-instances/demo/requirements.txt
      ./venv/bin/pip3 install gunicorn
      ./venv/bin/gunicorn --bind 0.0.0.0:80 app:app --daemon --chdir ./python-docs-samples/compute/managed-instances/demo
      

    8. 保留其他選項的預設值。

    9. 按一下 [建立]。

  2. 將網路伺服器部署為代管執行個體群組。

    1. 前往 Google Cloud 控制台的「Create instance group」(建立執行個體群組) 頁面。

      前往「建立執行個體群組」

    2. 將「Name」(名稱) 設為 webserver-group

    3. 在「Instance template」(執行個體範本) 中選取 webserver-template

    4. 在「Region」(區域) 中選取 europe-west1

    5. 在「Zone」(可用區) 中選取 europe-west1-b

    6. 在「Autoscaling」部分,針對「Autoscaling mode」,選取「Off: do not autoscale」

    7. 捲動回「Number of instances」欄位,並將其設為 3

    8. 在「Autohealing」(自動修復) 專區中,執行下列操作:

      1. 在「Health check」(健康狀態檢查) 下拉式選單中,選取 autohealer-check
      2. 將「Initial delay」(初始延遲) 設為 180

    9. 保留其他選項的預設值。

    10. 按一下 [建立]。

  3. 建立防火牆規則,允許對網路伺服器發出 HTTP 要求。

    1. 在 Google Cloud 控制台中,前往「Create firewall rule」(建立防火牆規則) 頁面。

      前往「建立防火牆規則」

    2. 在「Name」(名稱) 中輸入 default-allow-http

    3. 在「Network」(網路) 中選取 default

    4. 在「Targets」(目標) 中選取 Specified target tags

    5. 在「Target Tags」(目標標記) 中輸入 http-server

    6. 在「Source filter」(來源篩選器) 中選取 IPv4 ranges

    7. 在「Source IPv4 ranges」(來源 IPv4 範圍) 中輸入 0.0.0.0/0,允許存取所有 IP 位址。

    8. 在「Protocols and ports」(通訊協定和通訊埠) 中選取「TCP」,然後輸入 80

    9. 保留其他選項的預設值。

    10. 按一下 [建立]。

gcloud

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

    gcloud compute instance-templates create webserver-template \
        --instance-template-region europe-west1 \
        --machine-type e2-medium \
        --tags http-server \
        --metadata startup-script='
      apt update && apt -y install git python3-pip python3-venv
      git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
      python3 -m venv venv
      ./venv/bin/pip3 install -Ur ./python-docs-samples/compute/managed-instances/demo/requirements.txt
      ./venv/bin/pip3 install gunicorn
      ./venv/bin/gunicorn --bind 0.0.0.0:80 app:app --daemon --chdir ./python-docs-samples/compute/managed-instances/demo'
    
  2. 建立代管執行個體群組。

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

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

請稍候幾分鐘,讓代管執行個體群組建立及驗證 VM。

模擬健康狀態檢查失敗

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

控制台

  1. 前往網路伺服器 VM。

    1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面

      前往 VM 執行個體

    2. 針對任何 webserver-group VM,請在「External IP」欄下方,按一下 IP 位址。網路瀏覽器應隨即開啟新的分頁。如果要求逾時或網頁無法使用,請稍候幾分鐘,讓伺服器完成設定,然後再試一次。

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

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

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

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

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

    1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面

      前往 VM 執行個體

    2. 等候網路伺服器 VM 的狀態變更。VM 名稱旁的綠色勾號應會變成灰色正方形,代表自動修復程式已開始重新啟動健康狀態不良的 VM。

    3. 定期點選頁面頂端的 [Refresh] (重新整理),即可取得最新狀態。

    4. 當灰色正方形變回綠色勾號時,自動修復程序就完成了,代表 VM 已再次回到良好的健康狀態。

gcloud

  1. 監控代管執行個體群組的狀態。(完成後,請按下 Ctrl+C 停止操作)。

    while : ; do
      gcloud compute instance-groups managed list-instances webserver-group \
      --zone europe-west1-b
      sleep 5  # Wait for 5 seconds
    done
    
      NAME: webserver-group-0zx6
      ZONE: europe-west1-b
      STATUS: RUNNING
      HEALTH_STATE: HEALTHY
      ACTION: NONE
      INSTANCE_TEMPLATE: webserver-template
      VERSION_NAME:
      LAST_ERROR:
    
      NAME: webserver-group-4qbx
      ZONE: europe-west1-b
      STATUS: RUNNING
      HEALTH_STATE: HEALTHY
      ACTION: NONE
      INSTANCE_TEMPLATE: webserver-template
      VERSION_NAME:
      LAST_ERROR:
    
      NAME: webserver-group-m5v5
      ZONE: europe-west1-b
      STATUS: RUNNING
      HEALTH_STATE: HEALTHY
      ACTION: NONE
      INSTANCE_TEMPLATE: webserver-template
      VERSION_NAME:
      LAST_ERROR:
    

    群組中的所有 VM 都必須顯示 STATUS: RUNNINGACTION: NONE。如果不是,請稍候幾分鐘,讓 VM 完成設定,然後再試一次。

  2. 開啟新的 Cloud Shell 工作階段,並安裝 Google Cloud CLI。

  3. 取得網路伺服器 VM 的位址。

    gcloud compute instances list --filter webserver-group
    

    在「EXTERNAL_IP」欄底下,複製任一網路伺服器 VM 的 IP 位址,並儲存為本機 bash 變數。

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

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

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

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

    curl $IP_ADDRESS/makeUnhealthy > /dev/null
    

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

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

    1. 自動修復程序啟動後,STATUSACTION 兩欄將會更新,代表自動修復程式已開始重新啟動健康狀態不良的 VM。

        NAME: webserver-group-0zx6
        ZONE: europe-west1-b
        STATUS: STOPPING
        HEALTH_STATE: UNHEALTHY
        ACTION: RECREATING
        INSTANCE_TEMPLATE: webserver-template
        VERSION_NAME:
        LAST_ERROR:
      
        ...
      
    2. 自動修復程序一旦完成,VM 就會再次回報 RUNNINGSTATUS 以及 NONEACTION,代表 VM 已成功重新啟動。

        NAME: webserver-group-0zx6
        ZONE: europe-west1-b
        STATUS: RUNNING
        HEALTH_STATE: HEALTHY
        ACTION: NONE
        INSTANCE_TEMPLATE: webserver-template
        VERSION_NAME:
        LAST_ERROR:
      
        ...
      
    3. 執行個體群組監控完畢後,按下 Ctrl+C 即可結束監控。

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

  • 如果您一次將所有 VM 的健康狀態都設為不良,會發生什麼狀況?如要進一步瞭解並行錯誤的自動修復行為,請參閱自動修復行為一節。

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

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

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

如要查看自動修復程式的作業記錄,請使用以下 gcloud 指令:

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

詳情請參閱查看自動修復作業記錄一節。

清除所用資源

完成教學課程後,您可以清除所建立的資源,這樣資源就不會占用配額並產生費用。下列各節將說明如何刪除或關閉這些資源。

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

刪除專案

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

刪除特定資源

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

刪除執行個體群組

主控台

  1. In the Google Cloud console, go to the Instance groups page.

    Go to Instance groups

  2. Select the checkbox for your webserver-group instance group.
  3. To delete the instance group, click Delete.

gcloud

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

刪除執行個體範本

主控台

  1. 前往 Google Cloud 控制台的「Instance templates」(執行個體範本) 頁面。

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

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

  3. 按一下頁面頂端的 「刪除」。在新開啟的視窗中,按一下 [Delete] (刪除) 以確認刪除作業。

gcloud

gcloud compute instance-templates delete webserver-template -q \
    --region=europe-west1

刪除健康狀態檢查

主控台

  1. 在 Google Cloud 控制台中,前往「Health checks」(健康狀態檢查) 頁面。

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

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

  3. 按一下頁面頂端的 「刪除」。在新開啟的視窗中,按一下 [Delete] (刪除) 以確認刪除作業。

gcloud

gcloud compute health-checks delete autohealer-check -q \
    --region=europe-west1

刪除防火牆規則

主控台

  1. 在 Google Cloud 控制台中,前往「防火牆規則」頁面。

    前往「防火牆規則」

  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

後續步驟