蓝绿部署(Blue-Green)策略
2010 年,Netflix 面临一个难题:如何在不中断服务的情况下,发布一个可能有问题的新版本?
他们想到了一个办法:准备两套环境,一套运行当前的生产版本(蓝),另一套运行新版本(绿)。先在绿环境验证,验证通过后,通过修改负载均衡器的配置,把流量一次性从蓝切换到绿。如果绿有问题,立即切回蓝。
这就是蓝绿部署的起源。今天,蓝绿部署已经成为高可用系统发布的标配。
蓝绿部署的核心思想
核心原理
蓝绿部署通过同时运行两套完整环境,实现流量的快速切换:
与其他策略对比
Kubernetes 实现
Deployment 配置
blue-green-deployment.yaml
Service 切换
blue-green-service.yaml
切换脚本
switch-to-green.sh
回滚脚本
rollback-to-blue.sh
自动化蓝绿部署
Argo Rollout 实现
argocd-blue-green.yaml
自动预热与切换
argocd-auto-promote.yaml
数据库迁移策略
蓝绿部署最大的挑战是数据库变更。如果新版本的数据库 schema 与旧版本不兼容,切换会导致旧版本无法运行。
前后兼容策略
原则:新版本的数据库 schema 必须与旧版本兼容
migrations/001_create_table.sql
迁移流程
迁移示例
migrations/phase1.sql
流量验证
健康检查
health-check.sh
自动化验证
verification-job.yaml
监控与告警
关键指标
Prometheus 告警
blue-green-alert.yaml
最佳实践
部署流程
注意事项
:::warning 蓝绿部署的陷阱:
- 数据库兼容性:永远不要部署不兼容 schema 变更
- 资源成本:双倍资源意味着双倍成本
- 状态同步:跨环境的缓存、会话状态需要处理
- DNS 缓存:TTL 设置要合理,否则切换后部分用户仍然访问旧环境
- 测试不充分:切换前必须充分验证 :::
与其他策略对比
金丝雀 vs 蓝绿
选择建议
常见问题处理
延伸思考
蓝绿部署的本质是用资源换时间。当你准备两套环境,可以随时切换时,发布就不再是「小心翼翼的操作」,而是「可逆的操作」。
但蓝绿部署不是银弹:
- 资源成本:双倍环境意味着双倍成本
- 复杂性:需要处理数据库兼容性、状态同步等问题
- 适用性:并非所有场景都需要秒级切换
真正的问题是:你的业务能容忍多长时间的发布窗口?
如果业务要求零停机,蓝绿是最佳选择。如果业务可以容忍几分钟的发布窗口,滚动更新可能更经济。
最终,选择哪种策略,取决于业���需求和成本权衡,而不是技术偏好。