全部產品
Search
文件中心

Elastic Compute Service:自動回復服務

更新時間:Jun 08, 2024

服務或指令碼在運行過程中可能會因程式異常、伺服器重啟、掉電等情況而停止運行,如果不能及時恢複運行,會給線上業務造成損失。您可以通過雲助手外掛程式ecs-tool-servicekeepalive,使服務或指令碼在被中斷時快速恢複運行,保障服務的可靠性和持久性。

方案原理

該方案是基於Linux作業系統的systemd service服務實現的。啟用外掛程式ecs-tool-servicekeepalive時,使用者只需輸入服務/程式的啟動命令(例如,python /home/root/main.py)。啟用後,該外掛程式會根據使用者輸入的啟動命令,自動產生systemd service配置,實現服務或指令碼自啟動,無需您手動設定systemd service。

說明

systemd service是Linux系統中的一個組件,可以用來自動管理服務,例如實現開機自啟動和服務意外停止後自啟動等。詳細介紹,請參見systemd官方文檔

方案實踐

  1. 完成服務或程式等部署後,以root許可權啟動雲助手外掛程式ecs-tool-servicekeepalive

    以root使用者運行服務/指令碼

    sudo acs-plugin-manager --exec --plugin ecs-tool-servicekeepalive --params "start,'cmd'"

    cmd:需替換為服務啟動命令。例如,指令碼執行命令(/bin/bash /home/work/debug/debug.sh )、程式運行命令(python /home/root/main.py)等。

    重要

    指令碼或程式檔案路徑需為根路徑。

    通過指定使用者運行服務/指令碼

    sudo acs-plugin-manager --exec --plugin ecs-tool-servicekeepalive --params "start,execstart='cmd',user=user_name,group=group_name"
    • cmd:需替換為服務啟動命令。例如,指令碼執行命令(/bin/bash /home/work/debug/debug.sh )、程式運行命令(python /home/root/main.py)等。

      重要

      指令碼或程式檔案路徑需為根路徑。

    • user_name:替換為服務啟動並執行使用者名稱。執行cut -d: -f1 /etc/passwd可查看已建立的使用者。

    • group_name:替換為服務啟動並執行使用者組名。執行cut -d: -f1 /etc/group可查看已建立的使用者組。

  2. 執行以下命令,查看服務是否已被配置為自恢複。

    sudo acs-plugin-manager --exec --plugin ecs-tool-servicekeepalive --params "status"

    類似如下回顯,表示配置成功。

    image

  3. (可選)如果您需要取消服務/指令碼自恢複,可執行如下命令。

    sudo acs-plugin-manager --exec --local --plugin ecs-tool-servicekeepalive --params "stop service_name"

    service_name:替換為已配置的服務配置名稱(即步驟2回顯中的service_name列)。

應用樣本

  1. 準備環境。

    建立一個/home/work/debug檔案夾,並在該檔案夾下建立debug.sh指令碼,該指令碼會每秒列印一行日誌到使用者指定的記錄檔中。

    sudo mkdir -p /home/work/debug && \
    sudo tee /home/work/debug/debug.sh > /dev/null << 'EOF'
    #!/bin/bash
    while true
    do
       sudo echo "$(date '+%Y-%m-%d %H:%M:%S') progress is alive" >> $1
        sleep 1
    done
    EOF

    通過命令ps aux |grep debug.sh,發現指令碼並未運行。

    image

  2. 啟動雲助手外掛程式。

    sudo acs-plugin-manager --exec --plugin ecs-tool-servicekeepalive --params "start,'/bin/bash /home/work/debug/debug.sh /home/work/debug/debug.log'"

    此時通過命令ps aux | grep debug.sh查看,發現指令碼已經在運行(此時進程號為2572)。

    image

  3. 驗證指令碼是否會自動回復運行。

    重啟ECS指令碼正常運行

    在控制台重啟ECS執行個體,ECS恢複後,登入執行個體,執行如下命令。

    ps aux |grep debug.sh

    探索服務debug.sh的進程仍正常運行,且進程號更新為764,說明指令碼被重新啟動過。

    image

    Kill進程指令碼正常運行

    1. 執行如下命令,通過尋找到debug.sh的進程號。

      ps aux |grep debug.sh

      類似如下回顯,2572即為debug.sh進程號。

      image

    2. 執行如下命令,kill掉debug.sh進程。

      sudo date && kill -9 進程號
    3. 再次執行如下命令,發現debug.sh仍在運行且進程號更新為4220,說明指令碼被重新啟動過。

      ps aux |grep debug.sh

      image

相關文檔

隨著業務規模的增長,資料請求和並發訪問量增大、您可以部署多台ECS搭建一個具備可用性區域層級的故障災備能力的服務,保障資料的可用性和持久性。具體操作,請參見部署高可用