Zero-Downtime Deployment: Rolling vs Blue/Green vs Canary
Deploy xong mà service down vài giây thôi cũng đủ để user complain và on-call bị gọi dậy lúc nửa đêm 😩. Dưới đây là 3 chiến lược phổ biến nhất để release mà không ai nhận ra có chuyện gì vừa xảy ra.
🔵 Rolling Update⌗
Thay dần từng pod/instance cũ bằng bản mới, theo từng batch nhỏ.
- ✅ Không cần thêm hạ tầng, tiết kiệm chi phí
- ✅ Default strategy của Kubernetes Deployment
- ⚠️ Trong lúc rollout, cả 2 version cùng chạy song song → cẩn thận breaking change ở API/schema
- ⚠️ Rollback không tức thời, phải rolling ngược lại
Phù hợp: hầu hết workload nội bộ, ít rủi ro về schema.
🟢 Blue/Green⌗
Dựng song song 2 môi trường (Blue = đang chạy, Green = bản mới), test kỹ Green rồi chuyển toàn bộ traffic sang trong một phát.
- ✅ Rollback tức thì: trỏ traffic ngược lại Blue
- ✅ Không có trạng thái “nửa cũ nửa mới”
- ⚠️ Tốn gấp đôi tài nguyên trong lúc chuyển đổi
- ⚠️ Cần layer routing/load balancer switch được nhanh (DNS, ALB, Service selector…)
Phù hợp: hệ thống critical, cần rollback nhanh và chắc chắn.
🟠 Canary⌗
Đẩy bản mới cho một nhóm nhỏ traffic (1% → 10% → 50% → 100%), theo dõi metrics/error rate trước khi tăng dần.
- ✅ Giảm blast radius nếu bản mới có bug
- ✅ Kết hợp tốt với observability (Prometheus, Datadog…) để auto rollback theo threshold
- ⚠️ Cần service mesh hoặc ingress hỗ trợ traffic splitting (Istio, Argo Rollouts, Flagger)
- ⚠️ Phức tạp hơn để setup và debug
Phù hợp: hệ thống lớn, thay đổi rủi ro cao, có sẵn observability tốt.
Chọn cái nào?⌗
| Tiêu chí | Rolling | Blue/Green | Canary |
|---|---|---|---|
| Chi phí hạ tầng | Thấp | Cao (tạm thời) | Trung bình |
| Tốc độ rollback | Chậm | Tức thì | Nhanh (giảm % traffic) |
| Độ phức tạp | Thấp | Trung bình | Cao |
| Rủi ro khi lỗi | Trung bình | Thấp | Rất thấp |
Không có strategy nào “đúng nhất” — chọn theo mức độ chấp nhận rủi ro và hạ tầng hiện có. Nhiều team production thực ra kết hợp cả 3: Rolling cho service phụ, Blue/Green cho service critical, Canary cho những thay đổi lớn ở core service 🚀.