MST

星途 面试题库

面试题:Bash脚本复杂场景下的灾难恢复机制

假设你正在编写一个Bash脚本,用于在服务器上部署一套复杂的应用程序,涉及多个服务的安装、配置和启动。在这个过程中,如果某个关键步骤失败,需要有完善的灾难恢复机制。请描述你将如何设计这个脚本的结构和灾难恢复逻辑,包括如何保存和恢复系统状态,以及如何确保数据的一致性。
14.1万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试
  1. 脚本结构设计
    • 初始化部分
      • 定义变量,如应用程序安装目录、配置文件路径等。例如:
APP_DIR="/opt/myapp"
CONFIG_PATH="$APP_DIR/config"
  - 检查脚本运行权限,确保以足够权限运行(如root权限)。
if [ "$EUID" -ne 0 ]; then
    echo "This script must be run as root"
    exit 1
fi
- **安装服务部分**:
  - 按顺序编写各个服务的安装命令。例如,若应用依赖于`nginx`、`mysql`和`nodejs`:
# 安装nginx
apt - get update
apt - get install - y nginx

# 安装mysql
apt - get install - y mysql - server

# 安装nodejs
curl - sL https://deb.nodesource.com/setup_14.x | bash -
apt - get install - y nodejs
- **配置服务部分**:
  - 复制配置文件到相应目录,并进行必要的配置修改。例如,修改`nginx`配置文件:
cp $CONFIG_PATH/nginx.conf /etc/nginx/sites - available/
ln - s /etc/nginx/sites - available/nginx.conf /etc/nginx/sites - enabled/
nginx - t && systemctl restart nginx
- **启动服务部分**:
  - 启动各个服务。
systemctl start mysql
systemctl start nodejs - service # 假设已配置好systemd服务
  1. 灾难恢复逻辑设计
    • 保存系统状态
      • 在每个关键步骤前,使用工具如tar对相关目录进行备份。例如,在安装mysql前备份/var/lib/mysql(假设mysql数据存储在此):
tar - czvf /var/backups/mysql - pre - install.tar.gz /var/lib/mysql
  - 记录关键步骤执行状态,可使用一个日志文件。例如:
echo "Starting to install mysql" >> deployment.log
- **恢复系统状态**:
  - 如果某个步骤失败,根据日志文件定位失败步骤。例如,若`mysql`安装失败:
if [ $? - ne 0 ]; then
    echo "Mysql installation failed. Restoring previous state."
    # 停止可能已部分启动的mysql服务
    systemctl stop mysql
    # 恢复备份
    rm - rf /var/lib/mysql
    tar - xzvf /var/backups/mysql - pre - install.tar.gz - C /
fi
- **确保数据一致性**:
  - 在涉及数据修改的步骤中,使用事务机制(如果服务支持,如`mysql`的事务)。
  - 在配置文件修改时,先进行备份,若修改后服务启动失败,恢复原配置文件。例如:
cp /etc/nginx/sites - enabled/nginx.conf /etc/nginx/sites - enabled/nginx.conf.bak
# 修改配置文件
sed - i 's/old_value/new_value/' /etc/nginx/sites - enabled/nginx.conf
nginx - t && systemctl restart nginx
if [ $? - ne 0 ]; then
    echo "Nginx configuration change failed. Restoring original config."
    mv /etc/nginx/sites - enabled/nginx.conf.bak /etc/nginx/sites - enabled/nginx.conf
    systemctl restart nginx
fi