Giới thiệu về Cold và Hot Deployment
Trong bài viết này, chúng ta sẽ tìm hiểu về hai phương thức triển khai ứng dụng phổ biến trong quy trình CI/CD: Cold Deployment và Hot Deployment. Đây là những khái niệm quan trọng đối với các nhà phát triển, đặc biệt trong bối cảnh phát triển ứng dụng microservices và Kubernetes. Chúng tôi sẽ đề cập đến sự khác biệt, quy trình thực hiện, và những lưu ý cần thiết khi triển khai.
Nội dung chính
- Sự khác biệt giữa Cold và Hot Deployment
- Cách triển khai trong ứng dụng monolithic so với microservices
- Hướng dẫn từng bước với các lệnh thực tế
Khái niệm chính
Cold Deployment
- Cold Deployment: Dừng ứng dụng, triển khai mã mới, sau đó khởi động lại ứng dụng. Thời gian ngừng hoạt động có thể ảnh hưởng đến người dùng.
Hot Deployment
- Hot Deployment: Triển khai mã mà không cần dừng dịch vụ, giúp giảm thiểu thời gian ngừng hoạt động.
Lưu ý
- Cold deployments thường thấy trong các hệ thống kế thừa.
- Hot deployments là tiêu chuẩn trong các pipeline CI/CD hiện đại.
- Việc hiểu rõ về thời gian ngừng hoạt động, khả năng phục hồi và rủi ro rất quan trọng trong môi trường sản xuất.
Cold Deployment trong Ứng dụng Web Truyền Thống
Tình huống: Triển khai file WAR lên Tomcat
Các bước thực hiện:
- Dừng server Tomcat:
bash
sudo systemctl stop tomcat - Thay thế file WAR cũ:
bash
cp /tmp/app.war /opt/tomcat/webapps/app.war - Khởi động lại Tomcat:
bash
sudo systemctl start tomcat - Kiểm tra tình trạng sức khỏe:
bash
curl -f http://web1:8080/app/health || echo "Triển khai thất bại"
Lưu ý:
- Người dùng không thể truy cập ứng dụng trong khoảng thời gian Tomcat tắt.
- Thời gian ngừng hoạt động phụ thuộc vào thời gian khởi động ứng dụng.
- Đây là phương pháp đơn giản nhưng rủi ro trong môi trường sản xuất.
Hot Deployment trong Ứng dụng Web Truyền Thống
Tình huống: Sử dụng Tomcat Manager
Các bước thực hiện:
- Tải file WAR mới mà không dừng server:
bash
curl -u admin:password -T target/app.war \ "http://web1:8080/manager/text/deploy?path=/app&update=true" - Kiểm tra ứng dụng đang hoạt động:
bash
curl -f http://web1:8080/app/health
Lưu ý:
- Server vẫn hoạt động, không có thời gian ngừng hoạt động.
- Rủi ro: Có thể xảy ra rò rỉ bộ nhớ hoặc mất phiên.
- Giải pháp: Sử dụng Load Balancer để cập nhật theo kiểu rolling để triển khai hot an toàn hơn.
Cold Deployment trong Microservices
Tình huống: Docker Compose
Các bước thực hiện:
- Dừng các dịch vụ:
bash
docker-compose -f docker-compose.prod.yml down - Kéo hình ảnh mới:
bash
docker-compose -f docker-compose.prod.yml pull - Khởi động lại các dịch vụ:
bash
docker-compose -f docker-compose.prod.yml up -d - Kiểm tra các endpoint:
bash
curl -f http://microservice:8080/health
Lưu ý:
- Tất cả các container dừng lại trước khi các container mới khởi động, dẫn đến thời gian ngừng hoạt động.
- Phương pháp này phù hợp cho các triển khai quy mô nhỏ.
- Không được khuyến nghị cho các microservices trong môi trường sản xuất.
Hot Deployment trong Microservices
Tình huống: Cập nhật Rolling trong Docker Swarm
Các bước thực hiện:
- Xây dựng và đẩy hình ảnh Docker mới:
bash
docker build -t registry/myapp:v2 . docker push registry/myapp:v2 - Cập nhật dịch vụ với chiến lược rolling:
bash
docker service update --image registry/myapp:v2 \ --update-parallelism 1 --update-delay 10s myapp_service - Giám sát cập nhật:
bash
docker service ps myapp_service
Lưu ý:
- Các tác vụ cập nhật lần lượt, dịch vụ vẫn hoạt động.
- Thời gian ngừng hoạt động thấp và an toàn cho người dùng.
Hot Deployment trong Kubernetes
Cập nhật Rolling (mặc định trong K8s)
Mẫu YAML triển khai:
yaml
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
Các bước thực hiện:
- Xây dựng và đẩy hình ảnh:
bash
docker build -t registry/myapp:2.0 . docker push registry/myapp:2.0 - Cập nhật triển khai:
bash
kubectl set image deployment/myapp myapp=registry/myapp:2.0 --record - Giám sát quá trình triển khai:
bash
kubectl rollout status deployment/myapp kubectl get pods -l app=myapp -w
Lưu ý:
- Các pod mới phải vượt qua các probe sẵn sàng trước khi các pod cũ bị kết thúc.
- Đảm bảo không có thời gian ngừng hoạt động.
- Việc quay lại là dễ dàng:
bash
kubectl rollout undo deployment/myapp
So sánh Cold và Hot Deployment
| Khía cạnh | Cold Deployment | Hot Deployment |
|---|---|---|
| Thời gian ngừng hoạt động | Có | Không / Tối thiểu |
| Triển khai Web truyền thống | Dừng server, thay thế artifact, khởi động lại server | Tomcat Manager / Cập nhật rolling với Load Balancer |
| Microservices | Dừng container, khởi động container mới | Rolling / Blue-Green / Canary |
| Quay lại | Thủ công | Dễ dàng (hoặc quay lại hoặc chuyển đổi lưu lượng) |
| Rủi ro | Cao (thời gian ngừng hoạt động cho người dùng) | Thấp (đã được kiểm tra, tự động, không có thời gian ngừng hoạt động) |
Thực hành tốt nhất
- Luôn sử dụng các probe sẵn sàng/sống.
- Giữ cho các dịch vụ không trạng thái.
- Sử dụng feature flags để bật/tắt tính năng mà không cần triển khai lại.
- Theo dõi chỉ số triển khai và quay lại nếu vượt quá ngưỡng lỗi.
- Chạy các bài kiểm tra khói trước khi định tuyến lưu lượng.
- Giữ log tập trung để xử lý sự cố (ELK / EFK).
Kết luận
Cold deployments đơn giản nhưng có thời gian ngừng hoạt động cho người dùng. Ngược lại, hot deployments đảm bảo không có thời gian ngừng hoạt động, an toàn hơn cho môi trường sản xuất. Đối với microservices và Kubernetes, việc sử dụng rolling, blue-green, và canary deployments là tiêu chuẩn trong ngành.
💡 Mẹo: Kết hợp tự động hóa CI/CD với chiến lược triển khai phù hợp và theo dõi để đạt được sản xuất không có thời gian ngừng hoạt động.
FAQ
Cold Deployment có an toàn không?
Cold Deployment có thể an toàn nếu được thực hiện cẩn thận, nhưng thường có thời gian ngừng hoạt động.
Hot Deployment có thể gây ra vấn đề gì không?
Hot Deployment có thể dẫn đến rò rỉ bộ nhớ hoặc mất phiên nếu không được quản lý tốt.
Tại sao nên sử dụng CI/CD cho triển khai?
CI/CD giúp tự động hóa quy trình triển khai, giảm thiểu lỗi và tăng tốc độ phát triển.
Làm thế nào để rollback khi có lỗi?
Với hot deployment, bạn có thể dễ dàng quay lại phiên bản trước đó bằng các lệnh đã được cung cấp trong bài viết này.