22.13-回滚策略

要点

  • 回滚是部署出问题时的紧急恢复手段
  • Workers 支持版本回滚,Vercel 也支持
  • 数据库的回滚最复杂——需要手动执行反向 SQL
  • 回滚策略要提前准备好,不能等出了问题再想

内容

1. 什么时候需要回滚

情况严重程度处理方式
新功能有 bug灰度阶段发现,停止灰度
性能下降观察后决定是否回滚
核心功能不可用立即回滚
数据损坏紧急回滚 + 从备份恢复
安全漏洞紧急立即回滚

2. Workers 版本回滚

2.1 查看历史版本

// terminal
npx wrangler deployments list

2.2 回滚到上一版本

// terminal
npx wrangler deployments rollback

2.3 回滚到指定版本

// terminal
npx wrangler deployments rollback --deployment-id=xxxxxxxx

2.4 Dashboard 回滚

Cloudflare Dashboard → Workers → 你的 Worker → Deployments → 找到要回滚的版本 → Rollback

3. Vercel 版本回滚

  1. Vercel Dashboard → 你的项目 → Deployments
  2. 找到要回滚的部署
  3. 点击 "..." → "Promote to Production"

4. 数据库回滚

数据库的回滚比代码回滚复杂。D1 没有自动回滚,需要手动执行反向 SQL。

4.1 场景:添加了一个列

-- 迁移
ALTER TABLE users ADD COLUMN avatar_url TEXT;
 
-- 回滚
ALTER TABLE users DROP COLUMN avatar_url;

4.2 场景:创建了一个表

-- 迁移
CREATE TABLE notifications (...);
 
-- 回滚
DROP TABLE notifications;

4.3 场景:修改了数据

-- 迁移
UPDATE users SET status = 'active' WHERE status IS NULL;
 
-- 回滚需要从备份恢复

5. 备份策略

回滚的前提是有备份。

5.1 D1 备份

// terminal
# 导出备份
npx wrangler d1 export ai-agent-production-auth --env production --output=backup.sql
 
# 从备份恢复
npx wrangler d1 execute ai-agent-production-auth --env production --file=backup.sql

也可以在 Dashboard 里操作:D1 → 数据库 → "..." → Export as SQL

5.2 R2 备份

R2 支持版本控制:

// terminal
# 开启版本控制
npx wrangler r2 bucket update ai-agent-avatars --versioning
 
# 恢复被删除的文件
npx wrangler r2 object get ai-agent-avatars/avatar.jpg --version-id=xxx

5.3 定期备份

# .github/workflows/backup.yml
name: Daily Backup
 
on:
  schedule:
    - cron: '0 0 * * *'  # 每天 UTC 00:00
 
jobs:
  backup:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
 
      - name: Backup D1
        env:
          CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
        run: |
          DATE=$(date +%Y%m%d)
          npx wrangler d1 export ai-agent-production-auth --env production --output=backup-$DATE.sql
 
      - name: Upload to R2
        run: |
          npx wrangler r2 object put backups/d1/backup-$DATE.sql --file=backup-$DATE.sql

6. 回滚决策树

发现问题
  │
  ├── 是代码问题吗?
  │     ├── 是 → 回滚 Workers / Vercel 版本
  │     └── 否 ↓
  │
  ├── 是数据库问题吗?
  │     ├── 是 → 执行反向迁移 / 从备份恢复
  │     └── 否 ↓
  │
  ├── 是配置问题吗?
  │     ├── 是 → 修改环境变量 / secrets
  │     └── 否 ↓
  │
  └── 查日志,找根因

7. 回滚的注意事项

  1. 回滚不会回滚数据库:代码回滚了,但数据库的迁移不会自动撤销
  2. 回滚不会回滚 secrets:新代码依赖的 secret,回滚后旧代码可能读不到
  3. 回滚有延迟:全球边缘节点需要几分钟更新
  4. 回滚前确认:确认问题确实需要回滚,而不是误报

8. 回滚脚本

#!/bin/bash
# scripts/rollback.sh
 
set -e
 
echo "=== 回滚到上一版本 ==="
 
# 1. 确认
read -p "确认要回滚吗?(y/N) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
  exit 1
fi
 
# 2. 回滚 Workers
echo "回滚 Workers..."
npx wrangler deployments rollback --env production
 
# 3. 提示 Vercel 回滚
echo "请手动在 Vercel Dashboard 回滚前端"
 
# 4. 验证
echo "验证回滚..."
sleep 10
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" https://api.aistudy8.com/health)
if [ "$HTTP_CODE" = "200" ]; then
  echo "✅ Workers 回滚成功"
else
  echo "❌ Workers 回滚可能有问题"
fi

9. 回滚后的复盘

回滚后要做复盘:

  1. 问题根因:什么导致了问题
  2. 发现方式:怎么发现的问题(用户报告、监控告警)
  3. 响应时间:从发现问题到回滚花了多久
  4. 改进措施:怎么避免下次再发生

10. 小结

回滚策略的核心:

  1. 代码回滚:Workers 用 wrangler deployments rollback,Vercel 在 Dashboard 操作
  2. 数据库回滚:手动执行反向 SQL,需要提前备份
  3. 备份策略:定期备份 D1 和 R2
  4. 回滚脚本:提前准备好,紧急时直接用
  5. 复盘:回滚后找出根因,避免再次发生