Tại Sao Triển Khai Không Gián Đoạn Quan Trọng
Trong một thế giới mà người dùng mong đợi phản hồi ngay lập tức, ngay cả vài giây gián đoạn cũng có thể làm giảm niềm tin. Một lần triển khai thất bại có thể dẫn đến doanh thu bị mất, số lượng yêu cầu hỗ trợ tăng lên và thương hiệu bị ảnh hưởng. Đối với một người lãnh đạo DevOps, mục tiêu rất đơn giản: triển khai mã mới mà không làm gián đoạn lưu lượng truy cập trực tiếp.
Tác Động Đến Kinh Doanh
- Bảo vệ doanh thu – Các trang thương mại điện tử mất trung bình 5,600 USD mỗi phút khi xảy ra sự cố.
- Niềm tin của khách hàng – Những lỗi lặp đi lặp lại có thể làm tăng tỷ lệ rời bỏ lên tới 15%.
- Tinh thần đội ngũ – Việc thường xuyên quay lại phiên bản trước tạo ra một văn hóa ứng phó khẩn cấp.
Triển khai không gián đoạn cho phép bạn tự tin thực hiện việc phát hành nhanh chóng mà vẫn giữ trải nghiệm người dùng liền mạch.
Danh Sách Kiểm Tra Trước Khi Triển Khai
Trước khi bạn chạm vào cụm sản xuất, hãy chạy qua danh sách kiểm tra ngắn gọn này.
- Vệ sinh kiểm soát phiên bản
- Tất cả các thay đổi đều được gộp vào
mainthông qua PRs. - Tin nhắn cam kết phải tuân theo định dạng thông thường.
- Tất cả các thay đổi đều được gộp vào
- Hạ tầng như mã
- Các file Dockerfile, file compose, và cấu hình Nginx được lưu trữ trong kho.
- Mật khẩu được tiêm vào thời gian chạy, không bao giờ được nhúng vào hình ảnh.
- Điểm kiểm tra sức khỏe
/healthtrả về200chỉ khi ứng dụng đã sẵn sàng./readyphân biệt giữa “sẵn sàng nhận lưu lượng” và “vừa khởi động”.
- Chiến lược di trú cơ sở dữ liệu
- Sử dụng di trú tương thích ngược.
- Xác minh rằng mã cũ và mới có thể đọc/ghi cùng một sơ đồ.
- Sự sẵn sàng của bộ cân bằng tải
- Nginx được cấu hình để giảm tải một cách nhẹ nhàng.
- Tránh sử dụng phiên bản cố định trừ khi thật sự cần thiết.
Nếu bất kỳ mục nào không đạt yêu cầu, hãy ngừng quy trình và giải quyết vấn đề.
Quy Trình Phát Hành Dựa Trên Docker
Docker cung cấp cho bạn các bản ghi không thay đổi có thể quay lại ngay lập tức. Dưới đây là một docker-compose.yml tối thiểu hỗ trợ kiểm tra sức khỏe và thay đổi không gián đoạn.
yaml
version: "3.8"
services:
app:
image: myapp:latest
ports:
- "8080:80"
environment:
- NODE_ENV=production
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 30s
timeout: 10s
retries: 3
nginx:
image: nginx:stable-alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
app:
condition: service_healthy
Điểm Chú Ý Chính:
- Thẻ hình ảnh không thay đổi – Đánh dấu mỗi bản phát hành bằng Git SHA (
myapp:1a2b3c4d). - Kiểm tra sức khỏe – Nginx chỉ bắt đầu chuyển tiếp lưu lượng khi Docker báo cáo ứng dụng là khỏe.
- Các container tách biệt – Giữ reverse proxy không trạng thái và dễ nâng cấp.
Triển khai ngăn xếp mới với:
bash
docker compose pull
docker compose up -d --no-deps --scale app=2
Tham số --scale khởi động một phiên bản thứ hai trong khi phiên bản đầu tiên vẫn tiếp tục phục vụ lưu lượng truy cập. Khi container mới vượt qua kiểm tra sức khỏe, bạn có thể an toàn ngừng sử dụng container cũ.
Cấu Hình Blue-Green Nginx
Nginx có thể hoạt động như một bộ định tuyến lưu lượng đơn giản giữa hai nhóm upstream: green (phiên bản hiện tại) và blue (phiên bản mới). Đoạn mã dưới đây thể hiện cách chuyển đổi không gián đoạn bằng cách sử dụng các chỉ thị upstream và map.
nginx
# /etc/nginx/nginx.conf
worker_processes auto;
events { worker_connections 1024; }
http {
upstream green {
server 127.0.0.1:8080; # phiên bản hiện tại
}
upstream blue {
server 127.0.0.1:8081; # phiên bản tiếp theo
}
# Biến quyết định nhóm upstream nào sẽ sử dụng
map $http_x_deploy_stage $upstream {
default green;
"blue" blue;
}
server {
listen 80;
location / {
proxy_pass http://$upstream;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# Điểm kiểm tra sức khỏe cho chính Nginx
location /nginx_status {
stub_status on;
allow 127.0.0.1;
deny all;
}
}
}
Để chuyển lưu lượng:
bash
# Đánh dấu tiêu đề yêu cầu cho lần triển khai tiếp theo
curl -X POST -H "X-Deploy-Stage: blue" http://localhost/some/trigger
# Hoặc đơn giản là tải lại Nginx sau khi cập nhật file map
nginx -s reload
Bởi vì Nginx giải quyết upstream vào thời điểm yêu cầu, các kết nối hiện có sẽ kết thúc trên máy chủ green trong khi các yêu cầu mới sẽ chuyển đến blue. Sau khi xác nhận sự ổn định, hãy ngừng sử dụng các container green.
Tích Hợp CI/CD
Tự động hóa danh sách kiểm tra sẽ loại bỏ lỗi do con người. Dưới đây là một quy trình làm việc GitHub Actions xây dựng hình ảnh Docker, chạy thử nghiệm, đẩy lên kho, và kích hoạt chuyển đổi blue-green.
yaml
name: Triển Khai Không Gián Đoạn
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Cài đặt Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Đăng nhập vào Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USER }}
password: ${{ secrets.DOCKER_PASS }}
- name: Xây dựng và đẩy
run: |
IMAGE=repo/myapp:${{ github.sha }}
docker build -t $IMAGE .
docker push $IMAGE
- name: Triển khai phiên bản blue
env:
IMAGE: ${{ steps.build.outputs.image }}
run: |
ssh deploy@server "docker pull $IMAGE && docker compose up -d --scale app=2"
- name: Kiểm tra sức khỏe
run: |
curl -f http://server/health || exit 1
- name: Chuyển Nginx sang blue
run: |
ssh deploy@server "curl -X POST -H 'X-Deploy-Stage: blue' http://localhost/trigger && nginx -s reload"
Quy trình làm việc này bảo vệ danh sách kiểm tra:
- Xây dựng & thử nghiệm trước khi bất kỳ hình ảnh nào đến kho.
- Đẩy một hình ảnh có thẻ phiên bản, giúp việc quay lại dễ dàng (
docker compose up -d app=repo/myapp:previous_sha). - Xác minh sức khỏe đảm bảo các container mới đã sẵn sàng.
- Chuyển Nginx hoàn tất quá trình chuyển đổi blue-green chỉ với một lệnh.
Quan Sát & Quay Lại
Triển khai không gián đoạn chỉ hiệu quả khi bạn có khả năng phát hiện sự cố nhanh chóng.
- Ghi log – Chuyển tiếp log từ container đến một hệ thống tập trung (ví dụ: Loki hoặc Elastic). Sử dụng nhãn như
app=myappđể lọc. - Metrics – Xuất metrics Prometheus từ cả ứng dụng và Nginx (điểm cuối
/metrics). Đặt cảnh báo trên các đỉnh độ trễ. - Tracing – Kích hoạt OpenTelemetry để theo dõi các yêu cầu qua các phiên bản green và blue.
Nếu một cảnh báo được kích hoạt, việc quay lại chỉ cần một lệnh:
bash
docker compose up -d --no-deps app=repo/myapp:previous_sha
nginx -s reload # quay lại upstream xanh
Vì hình ảnh trước đó vẫn được lưu trong bộ nhớ cache cục bộ, việc quay lại diễn ra chỉ trong vài giây, giữ cho tác động đến người dùng ở mức tối thiểu.
Triển khai không gián đoạn với Docker và Nginx trở nên lặp lại khi bạn tích hợp danh sách kiểm tra vào quy trình làm việc của mình. Nếu bạn cần giúp đỡ trong việc giao hàng này, đội ngũ tại https://ramerlabs.com có thể hỗ trợ bạn.