0

Tối ưu CI/CD cho Hệ thống Microservices - Bài 6 - Triển khai không Downtime với Blue-Green & Canary Deployment

I. Giới hạn của cách Deploy truyền thống (Rolling Update)

Trong những hệ thống nhỏ hoặc ở giai đoạn đầu, chiến lược deploy phổ biến nhất là Recreate (tắt service cũ, bật service mới) hoặc Rolling Update (thay thế dần từng container). Tuy nhiên, khi đối mặt với các hệ thống backend chịu tải cao và yêu cầu xử lý liên tục (như điều phối luồng vận đơn hay xử lý transaction), cả hai cách này đều bộc lộ nhược điểm chí mạng:

  • Recreate tạo ra downtime rõ rệt (dù chỉ vài giây để container khởi động xong), làm rớt các luồng request đang gửi đến.

  • Rolling Update tuy giữ được uptime, nhưng nếu version mới chứa một lỗi "chết người" (như tràn RAM hoặc treo kết nối database), một lượng lớn user vẫn sẽ dính lỗi trước khi bạn kịp nhận ra và rollback. Quá trình rollback của Rolling Update cũng diễn ra rất chậm chạp.

Để đạt đến cảnh giới "Continuous Deployment" (CD) thực sự, chúng ta phải tách rời quá trình Deploy (đưa code lên server) khỏi quá trình Release (mở luồng cho người dùng truy cập).

II. Blue-Green Deployment: Công tắc chuyển đổi tức thì

Thay vì ghi đè lên version cũ, bạn triển khai song song hai môi trường giống hệt nhau:

  • Môi trường Blue (Màu Xanh dương): Đang chạy version cũ (v1.0), nhận 100% traffic thực tế từ người dùng.

  • Môi trường Green (Màu Xanh lá): Được deploy version mới (v1.1) lên. Lúc này, hệ thống Green hoàn toàn "vô hình" với người dùng thật.

Quy trình vận hành:

  1. Luồng CI/CD build xong image và tự động deploy lên cụm Green.

  2. Đội QA hoặc developer có thể truy cập vào cụm Green (thông qua một domain test hoặc header riêng) để test các tính năng thực tế.

  3. Khi mọi thứ đã hoàn hảo, bạn chỉ cần thay đổi cấu hình trên Load Balancer (ví dụ như chỉnh sửa block upstream trong Nginx). Toàn bộ 100% traffic sẽ lập tức chuyển hướng sang cụm Green. Cụm Green trở thành Production mới.

  4. Cứu cánh: Nếu cụm Green xảy ra lỗi không lường trước, chỉ mất 1 giây để gạt Load Balancer quay lại cụm Blue (Rollback tức thì).

Nhược điểm duy nhất của Blue-Green là tốn kém. Bạn phải duy trì lượng tài nguyên (RAM, CPU) gấp đôi trong thời gian chuyển giao.

III. Canary Deployment: Nghệ thuật "Dò đá qua sông"

Lấy cảm hứng từ việc thợ mỏ ngày xưa mang theo chim hoàng yến (canary) xuống hầm để dò khí độc, Canary Deployment giúp bạn giảm thiểu rủi ro đến mức thấp nhất. Thay vì chuyển 100% traffic như Blue-Green, bạn chỉ thả một lượng nhỏ request vào version mới:

Quy trình vận hành:

  1. Deploy version mới (Canary) chạy song song với version hiện tại (Stable).

  2. Cấu hình API Gateway/Load Balancer để định tuyến đúng 5% traffic vào version Canary, 95% vẫn vào bản Stable.

  3. Hệ thống Monitoring (APM, Prometheus/Grafana) bắt đầu đo lường: Version Canary có bị tăng tỷ lệ lỗi (5xx) không? Độ trễ (latency) có cao bất thường không?

  4. Nếu các chỉ số ổn định, luồng CD tự động tăng traffic lên 10% -> 25% -> 50% -> 100%. Nếu có bất kỳ sự cố nào, hệ thống lập tức tự động cắt traffic khỏi cụm Canary và trả 100% về cụm Stable.

Canary cực kỳ an toàn, đặc biệt phù hợp cho các microservices đóng vai trò core (cốt lõi) nơi mà một phút lỗi có thể ảnh hưởng đến trải nghiệm của hàng nghìn người.

IV. Yêu cầu cốt lõi để hiện thực hóa CD nâng cao

Để cấu hình được các luồng chạy Blue-Green hay Canary trong file pipeline, hệ thống kiến trúc của bạn cần đáp ứng hai điều kiện sống còn:

  1. Lớp trung gian thông minh (Ingress/API Gateway): Không thể làm được nếu Load Balancer của bạn quá thô sơ. Bạn cần những công cụ như Nginx có hỗ trợ split-traffic, Kong API Gateway, hoặc hiện đại hơn là sử dụng Service Mesh (như Istio) trong Kubernetes.

  2. Tính tương thích ngược (Backward Compatibility): Vì version cũ và version mới phải chạy song song (có thể là truy cập chung một bảng trong database), code mới của bạn TUYỆT ĐỐI không được làm vỡ cấu trúc dữ liệu của version cũ. Nếu version mới đổi tên một cột trong database, version cũ lập tức sụp đổ.

V. Tổng kết bài học

Luồng CD bằng Blue-Green và Canary mang lại sự tự tin tuyệt đối cho team kỹ thuật mỗi lần bấm nút "Deploy lên Production". Tuy nhiên, như đã nhắc ở phần Yêu cầu cốt lõi, trở ngại lớn nhất khiến nhiều team gục ngã khi áp dụng 2 kỹ thuật này không nằm ở cách viết file pipeline, mà nằm ở bài toán: Xử lý Database Migration ra sao khi hai version code chạy cùng một lúc? Chúng ta sẽ giải quyết triệt để nút thắt này ở Bài 7.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí