主题
💾 备份恢复与高可用
你永远不知道明天是硬盘先挂还是你先备份——数据丢了就是丢了
需要备份什么
| 数据 | 重要性 | 备份频率 | 保留份数 |
|---|---|---|---|
| 训练数据集 | 🔴 最高 | 每次更新后 | 永远保留 |
| LoRA 微调权重 | 🔴 最高 | 每次微调完 | 至少 3 个版本 |
| 模型原始文件 | 🟡 高 | 下载后一次 | 1 份远程即可 |
| 推理日志 | 🟢 一般 | 每周 | 保留 30 天 |
| nginx/系统配置 | 🟡 高 | 改配置后 | 至少 3 份 |
| 代码/Git 仓库 | 🟡 高 | 每次 commit | Git 自动 |
自动备份脚本
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-backupGit 远程仓库
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.targetbash
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灾难恢复清单
真出事了按这个顺序:
- 停机——先关掉对外服务,别让错误扩散
- 排查——硬盘挂了还是误删了?网络断了还是服务崩了?
- 恢复——从最近的备份恢复数据
- 启动——先启服务再开外网
- 验证——跑一遍测试样本确认推理正常
- 复盘——写事后分析:为什么出事、怎么防
🎯 本章要点
- 备份三要素:训练数据 + LoRA 权重 + 配置文件,缺一不可
- 用 cron + rclone 自动化备份 → 远程同步,本地留 30 天
- 恢复演练每月一次——不验证的备份等于没备份
- systemd
Restart=always保底单机高可用 - 双机热备用 nginx upstream backup 做故障转移
加载练习题中...