Skip to content

💾 备份恢复与高可用

你永远不知道明天是硬盘先挂还是你先备份——数据丢了就是丢了

需要备份什么

数据重要性备份频率保留份数
训练数据集🔴 最高每次更新后永远保留
LoRA 微调权重🔴 最高每次微调完至少 3 个版本
模型原始文件🟡 高下载后一次1 份远程即可
推理日志🟢 一般每周保留 30 天
nginx/系统配置🟡 高改配置后至少 3 份
代码/Git 仓库🟡 高每次 commitGit 自动

自动备份脚本

bash
#!/bin/bash
# /opt/scripts/backup.sh
# crontab 里加:0 2 * * * /opt/scripts/backup.sh

BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=30

mkdir -p $BACKUP_DIR

# 1. 备份训练数据
tar -czf "$BACKUP_DIR/training_data_$DATE.tar.gz" /opt/data/training/
gpg -c --batch --passphrase "$BACKUP_PASSPHRASE" \
  "$BACKUP_DIR/training_data_$DATE.tar.gz"
rm "$BACKUP_DIR/training_data_$DATE.tar.gz"

# 2. 备份 LoRA 权重
tar -czf "$BACKUP_DIR/lora_weights_$DATE.tar.gz" /opt/models/*/adapter_*
gpg -c --batch --passphrase "$BACKUP_PASSPHRASE" \
  "$BACKUP_DIR/lora_weights_$DATE.tar.gz"
rm "$BACKUP_DIR/lora_weights_$DATE.tar.gz"

# 3. 备份 nginx + 系统配置
tar -czf "$BACKUP_DIR/config_$DATE.tar.gz" \
  /etc/nginx/sites-available/ \
  /etc/nginx/ssl/ \
  /opt/kb/docs/.vitepress/config.mts

# 4. 推送到远程(腾讯云 COS 或另一台服务器)
rclone sync $BACKUP_DIR remote:bucket/backups/

# 5. 清理 30 天前的备份
find $BACKUP_DIR -name "*.gpg" -mtime +$RETENTION_DAYS -delete

echo "[$(date)] 备份完成,保留 $RETENTION_DAYS 天"

云同步方案

rclone + 腾讯云 COS

bash
# 安装 rclone
curl https://rclone.org/install.sh | sudo bash

# 配置 COS
rclone config
# 选 s3 → 填腾讯云 COS 的 endpoint/bucket/key

# 同步
rclone sync /opt/data remote:bucket/data-backup --progress

# 定时同步
# crontab: 0 3 * * * rclone sync /opt/data remote:bucket/data-backup

Git 远程仓库

bash
# 训练数据和配置进 Git(小文件)
cd /opt/data/configs
git init
git remote add origin git@github.com:user/ai-configs.git
git add . && git commit -m "backup $(date +%F)" && git push

大文件

模型文件(.gguf/.safetensors)不适合 Git,用 rclone 或 rsync。可以用 Git LFS 但不推荐,直接对象存储更简单。


恢复演练

备份不是用来存的,是用来恢复的。每个月至少演练一次

bash
# 1. 模拟数据丢失
sudo rm -rf /opt/data/training

# 2. 从备份恢复
gpg -d /backup/training_data_20260807.tar.gz.gpg | tar -xz -C /

# 3. 验证
ls /opt/data/training/
# ✅ 数据回来了

# 4. 切回当前模型版本验证推理可用
ollama run contract-reviewer:current "测试"

不演练的备份等于没备份——真出事的时候你会发现备份文件打不开、密码忘了、路径不对。


高可用:服务不中断

单机高可用(systemd 自动重启)

ini
# /etc/systemd/system/vllm.service
[Unit]
Description=vLLM Inference Service
After=network.target

[Service]
Type=simple
User=inference
ExecStart=/usr/bin/python -m vllm.entrypoints.openai.api_server \
  --model /opt/models/qwen-contract-merged \
  --host 0.0.0.0 --port 8000
Restart=always
RestartSec=10
Environment="CUDA_VISIBLE_DEVICES=0"

[Install]
WantedBy=multi-user.target
bash
sudo systemctl enable vllm
sudo systemctl start vllm
# 挂了 10 秒后自动重启

双机热备

                 ┌─ 机器A(主)
用户 → nginx ───┤
                 └─ 机器B(备)← 数据同步,A挂了自动切
nginx
# nginx 上游配置
upstream vllm_backend {
    server 192.168.1.10:8000 max_fails=3 fail_timeout=30s;  # 主
    server 192.168.1.11:8000 backup;                          # 备
}

健康检查

bash
# 检查推理服务是否正常
curl -f http://localhost:8000/health || \
  systemctl restart vllm

# 放 crontab 每 5 分钟查一次
# */5 * * * * /opt/scripts/health_check.sh

灾难恢复清单

真出事了按这个顺序:

  1. 停机——先关掉对外服务,别让错误扩散
  2. 排查——硬盘挂了还是误删了?网络断了还是服务崩了?
  3. 恢复——从最近的备份恢复数据
  4. 启动——先启服务再开外网
  5. 验证——跑一遍测试样本确认推理正常
  6. 复盘——写事后分析:为什么出事、怎么防

🎯 本章要点

  • 备份三要素:训练数据 + LoRA 权重 + 配置文件,缺一不可
  • 用 cron + rclone 自动化备份 → 远程同步,本地留 30 天
  • 恢复演练每月一次——不验证的备份等于没备份
  • systemd Restart=always 保底单机高可用
  • 双机热备用 nginx upstream backup 做故障转移
加载练习题中...

有问题或补充?欢迎留言