自动恢复服务

服务或脚本在运行过程中可能会因程序异常、服务器重启、掉电等情况而停止运行,如果不能及时恢复运行,会给线上业务造成损失。您可以通过云助手插件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搭建一个具备可用区级别的故障灾备能力的服务,保障数据的可用性和持续性。具体操作,请参见部署高可用架构