Quản trị VPS

Checklist chuyển đổi từ Single-VPS sang cụm Multi-Server

Danh mục kiểm tra an toàn chuyển website từ Single-VPS sang Multi-Server: hạ TTL DNS, rà soát localhost, đo kiểm độ trễ mạng nội bộ và tiêu chí rollback khẩn cấp.

Checklist kiểm tra an toàn trước khi chuyển website từ 1 VPS sang cụm Multi-Server
MỤC LỤC

Chuyển đổi một website đang hoạt động với lượng người dùng thực tế từ mô hình máy chủ đơn lẻ (Single-VPS) sang cụm nhiều máy chủ (Multi-Server) là một mốc quan trọng trong vòng đời phát triển hệ thống. Bạn có thể đã nắm vững lộ trình kiến trúc tổng thể, hoàn tất việc tách Database sang VPS riêng qua Private VPC, thiết lập bộ cân bằng tải Nginx, chuyển đổi lưu trữ tệp phi trạng thái sang S3/R2 và chuẩn bị quy trình phát hành không gián đoạn Zero-Downtime.

Tuy nhiên, tại thời điểm cắt chuyển dữ liệu thực tế (cutover), rủi ro lớn nhất thường xuất phát từ việc thiếu sót trong quy trình kiểm soát thay vì giới hạn công nghệ.

Những sơ suất tưởng chừng nhỏ như quên hạ thời gian sống (TTL) của bản ghi DNS khiến người dùng bị phân mảnh truy cập giữa máy chủ cũ và máy chủ mới, bỏ sót một biến môi trường trỏ cứng về 127.0.0.1, hay ước tính sai thời gian sao chép dữ liệu đều có thể kéo dài thời gian bảo trì ngoài kế hoạch và làm gián đoạn trải nghiệm người dùng.

Danh mục kiểm tra an toàn dưới đây gồm 4 giai đoạn, giúp bạn rà soát các mắt xích kỹ thuật trước, trong và sau thời điểm cắt chuyển, đi kèm 4 tiêu chí định lượng để kích hoạt phương án rollback kịp thời khi phát sinh sự cố.

Bốn giai đoạn trong danh mục kiểm tra cắt chuyển Multi-Server

Nguyên tắc cốt lõi trong quy trình cắt chuyển

Trước khi đánh dấu hoàn thành các hạng mục, đội ngũ vận hành cần thống nhất ba nguyên tắc làm việc sau:

  1. Xác minh dựa trên kết quả lệnh: Tránh đánh giá trạng thái dịch vụ theo cảm tính hoặc phỏng đoán. Mọi hạng mục đều cần được kiểm chứng bằng câu lệnh cụ thể với đầu ra rõ ràng trên terminal.
  2. Diễn tập đo lường thời gian (dry-run): Quá trình sao lưu cơ sở dữ liệu và đồng bộ thư mục tệp tải lên cần được chạy thử nghiệm trước 24 giờ để đo đạc chính xác thời gian hoàn thành trong điều kiện thực tế.
  3. Thống nhất tiêu chí rollback trước thời điểm thực hiện: Người phụ trách kỹ thuật và quản trị viên cần thống nhất sẵn ngưỡng kích hoạt phương án hủy bỏ để quay về máy chủ cũ, giúp xử lý dứt khoát khi thời gian bảo trì vượt quá giới hạn an toàn.

Giai đoạn 1: Chuẩn bị hạ tầng và rà soát mã nguồn

Giai đoạn này diễn ra trước 48 – 72 giờ khi website vẫn đang phục vụ người dùng bình thường trên máy chủ cũ, nhằm rà soát và xử lý trước các rào cản kỹ thuật.

STTHạng mụcLệnh xác minhKết quả chuẩnRủi ro nếu bỏ qua
1.1Hạ thời gian sống (TTL) của DNSTruy cập bảng điều khiển Cloudflare hoặc DNS quản lý tên miền, chỉnh TTL của bản ghi A/AAAA về 120s – 300s.TTL hiển thị 2 mins hoặc 5 mins.Bản ghi DNS lưu đệm (cache) trên các DNS resolver ngoài Internet, khiến người dùng tiếp tục truy cập máy chủ cũ nhiều giờ sau khi trỏ IP mới.
1.2Quét mã nguồn tìm địa chỉ trỏ cứnggrep -rnE '(127\.0\.0\.1\|localhost)' config/ src/ .env*Không còn dịch vụ nào (DB, Redis, S3) đặt giá trị localhost hoặc 127.0.0.1.Website báo lỗi kết nối cơ sở dữ liệu ngay sau khi deploy lên Web Node mới.
1.3Đo kiểm độ trễ mạng Private VPCping -c 50 10.0.0.20 (từ Web Node sang DB Node).Độ trễ trung bình ≤ 0.8ms, Packet loss = 0.0%.Độ trễ mạng nội bộ cao làm tăng thời gian phản hồi (TTFB) cho mọi truy vấn backend.
1.4Đo kiểm thông lượng mạng nội bộiperf3 -c 10.0.0.20 (từ Web Node sang DB Node).Băng thông đạt ≥ 940 Mbps trên cổng mạng 1Gbps.Quá trình đồng bộ dữ liệu và các truy vấn trả về dung lượng lớn bị nghẽn tại tầng mạng.
1.5Khóa cổng Internet của Databasesudo ss -tulpn \| grep 3306 trên DB Node.Chỉ hiển thị 10.0.0.20:3306, không mở trên 0.0.0.0:3306.Cổng cơ sở dữ liệu lộ ra mạng ngoài, làm gia tăng bề mặt dễ bị tấn công từ các đợt quét cổng và dò mật khẩu.
1.6Cấu hình tường lửa UFW cấp máy chủsudo ufw status verbose trên DB và Redis.Chỉ mở cổng dịch vụ cho đúng IP Private của Web Node (10.0.0.10).Nguy cơ rò rỉ dữ liệu hoặc bị tấn công leo thang từ các máy chủ khác trong cùng trung tâm dữ liệu.
1.7Kiểm tra chứng chỉ SSL Load Balancercurl -Iv https://example.com trỏ thử IP Load Balancer qua /etc/hosts.Bắt tay TLS 1.3 thành công, thời hạn chứng chỉ còn trên 60 ngày.Trình duyệt người dùng cảnh báo lỗi bảo mật ngay khi trỏ tên miền chính thức.

Giai đoạn 2: Diễn tập thử nghiệm và đồng bộ tệp nền

Thực hiện trước 2 – 24 giờ nhằm rút ngắn tối đa thời gian gián đoạn dịch vụ trong thời điểm cắt chuyển chính thức.

STTHạng mụcLệnh xác minhKết quả chuẩnRủi ro nếu bỏ qua
2.1Đồng bộ dữ liệu tệp nền lần 1 lên S3/R2rclone sync /var/www/html/uploads remote-r2:bucket/uploads -PDữ liệu tệp tải lên hiện có được đồng bộ đầy đủ lên bucket lưu trữ.Cửa sổ bảo trì bị kéo dài do phải sao chép toàn bộ dung lượng tệp tin trong giờ cắt chuyển.
2.2Đo thời gian xuất và nhập dữ liệu (Dump & Restore)Chạy thử nghiệm xuất dữ liệu và nhập vào máy chủ mới, ghi nhận thời gian thực thi.Xác định chính xác mốc thời gian: ví dụ xuất mất 4 phút, nạp mất 8 phút ➔ Tổng 12 phút.Ước tính sai thời gian bảo trì, gây lúng túng cho đội ngũ vận hành khi dịch vụ ngưng lâu hơn dự kiến.
2.3Đồng bộ múi giờ (Timezone) cơ sở dữ liệuSELECT @@global.time_zone, NOW(); trên cả hai máy chủ.Múi giờ trên DB Node mới trùng khớp với máy chủ cũ (ví dụ +07:00).Sai lệch thời gian ghi nhận đơn hàng, bài viết hoặc thời điểm hết hạn phiên làm việc.
2.4Kiểm tra bộ mã ký tự và CollationSHOW VARIABLES LIKE 'character_set_database';Hiển thị utf8mb4 và collation đồng nhất (utf8mb4_unicode_ci).Phát sinh lỗi hiển thị văn bản tiếng Việt có dấu sau khi chuyển đổi dữ liệu.
2.5Thử nghiệm phân quyền tài khoản MySQLmysql -h 10.0.0.20 -u app_prod -p production_db -e "SELECT 1;"Đăng nhập và truy vấn thành công từ máy chủ Web-01.Ứng dụng gặp lỗi Access denied for user do phân quyền sai địa chỉ IP nguồn.

Giai đoạn 3: Cắt chuyển trong cửa sổ bảo trì (T-0)

Khung giờ thực thi nên rơi vào thời điểm có lượng truy cập thấp nhất trong tuần, thường từ 1:00 AM đến 3:00 AM.

Bạn nên thực hiện tuần tự quy trình 7 bước dưới đây để kiểm soát rủi ro và tránh nhầm lẫn:

[ Bước 1: Khóa quyền ghi (HTTP 503) ]
                  │
                  ▼
[ Bước 2: Trích xuất bản snapshot DB cuối cùng ]
                  │
                  ▼
[ Bước 3: Truyền nén và nạp vào máy chủ DB mới ]
                  │
                  ▼
[ Bước 4: Chạy đồng bộ tệp delta (tệp phát sinh trong 24h) ]
                  │
                  ▼
[ Bước 5: Cập nhật cấu hình .env trên các web node ]
                  │
                  ▼
[ Bước 6: Kiểm thử luồng người dùng (smoke test) ]
                  │
                  ▼
[ Bước 7: Mở lại website và trỏ DNS chính thức ]

Các thao tác thực thi giờ G

Bước 1: Kích hoạt chế độ bảo trì

Tạm khóa quyền ghi của người dùng và cấu hình web server trả về mã trạng thái HTTP 503 để giữ tính toàn vẹn dữ liệu:

bash
# Đối với Laravel
php artisan down --render="errors::503" --secret="BaoTriNoiBoPasscode123"

# Đối với WordPress (qua Nginx)
# Kích hoạt tệp cấu hình trả về trang bảo trì 503 tĩnh

Bước 2 & 3: Trích xuất và nạp dữ liệu vào cơ sở dữ liệu mới

Sử dụng đường ống nén dữ liệu trực tiếp qua SSH trên card mạng nội bộ để tăng tốc độ truyền và không tốn dung lượng lưu trữ tệp .sql trung gian:

bash
mysqldump -u root -p --single-transaction --quick --routines --triggers --hex-blob production_db \
| gzip -c \
| ssh 10.0.0.20 "gunzip -c | mysql -u root -p production_db"

Xác nhận lại số lượng bản ghi (row count) trên các bảng quan trọng để đối chiếu dữ liệu:

sql
SELECT table_name, table_rows 
FROM information_schema.tables 
WHERE table_schema = 'production_db' 
AND table_name IN ('users', 'orders', 'posts', 'transactions');

Bước 4: Đồng bộ phần tệp tải lên mới phát sinh (Delta Sync)

Do phần lớn tệp tĩnh đã được đồng bộ ở Giai đoạn 2, lệnh đồng bộ delta lúc này chỉ cần quét và chuyển các tệp mới tạo trong vòng 24 giờ qua:

bash
rclone sync /var/www/html/uploads remote-r2:bucket/uploads --transfers 16 -P

Thao tác này thường chỉ mất khoảng 30 đến 60 giây.

Bước 5: Cập nhật tệp cấu hình môi trường .env

Trên từng web node mới, mở tệp .env và trỏ các kết nối sang hạ tầng mới:

ini
DB_CONNECTION=mysql
DB_HOST=10.0.0.20
DB_PORT=3306
DB_DATABASE=production_db
DB_USERNAME=app_prod
DB_PASSWORD=MatKhauBaoMatRanDomSieuManh123!

REDIS_HOST=10.0.0.30
REDIS_PORT=6379

FILESYSTEM_DISK=s3
AWS_ENDPOINT=https://your-account-id.r2.cloudflarestorage.com
AWS_BUCKET=my-media-bucket
AWS_URL=https://media.example.com

Bước 6: Kiểm thử luồng nghiệp vụ chính (Smoke Test)

Sử dụng trình duyệt hoặc công cụ nội bộ truy cập qua đường dẫn bypass bảo trì để kiểm tra 5 tác vụ cốt lõi:

  1. Đăng nhập tài khoản người dùng thành công.
  2. Tải lên một hình ảnh mới (xác nhận ảnh hiển thị qua CDN và lưu vào S3/R2).
  3. Đọc dữ liệu trang chủ và trang chi tiết sản phẩm.
  4. Thử nghiệm tạo một đơn hàng mới (ghi nhận thành công vào cơ sở dữ liệu mới).
  5. Kiểm tra log hệ thống: tail -n 50 /var/log/nginx/error.log và log ứng dụng để bảo đảm không xuất hiện exception.

Bước 7: Mở lại website và cập nhật bản ghi DNS chính thức

Tắt chế độ bảo trì và chuyển bản ghi A của tên miền chính trên Cloudflare sang địa chỉ IP public của Nginx Load Balancer (203.0.113.10). Do bạn đã hạ TTL xuống 120s từ trước, lưu lượng truy cập của người dùng sẽ chuyển dần sang cụm Multi-Server mới trong khoảng 2 đến 3 phút.

Giai đoạn 4: Nghiệm thu và theo dõi sau chuyển đổi

Trong 48 giờ đầu sau khi chuyển đổi, hệ thống bước vào giai đoạn nhạy cảm nhất. Bạn cần duy trì theo dõi liên tục các thông số vận hành sau:

  • Giám sát kết nối cơ sở dữ liệu:
bash
  mysqladmin -h 10.0.0.20 -u app_prod -p status

Quan sát hai chỉ số Threads_connected và Threads_running. Nếu Threads_running liên tục vượt quá 30, cơ sở dữ liệu có thể đang bị nghẽn do truy vấn chậm.

  • Theo dõi nhật ký truy vấn chậm (Slow Query Log) trên máy chủ DB để phát hiện các câu lệnh SQL phát sinh độ trễ cao khi chạy qua mạng nội bộ.
  • Theo dõi tỷ lệ lỗi HTTP 5xx trên Nginx Load Balancer:
bash
  awk '($9 ~ /50[0-9]/)' /var/log/nginx/access.log | wc -l

Tỷ lệ này cần duy trì dưới 0.05% tổng lưu lượng truy cập.

  • Đo lường thời gian phản hồi trang (TTFB): Sử dụng các công cụ giám sát bên ngoài (như Uptime Kuma hoặc Grafana) để theo dõi, bảo đảm mức TTFB trung bình không tăng quá 15% so với máy chủ cũ.

Tiêu chí kích hoạt phương án rollback

Việc xác định rõ thời điểm dừng lại và rút lui an toàn giúp hạn chế tối đa rủi ro gián đoạn dịch vụ. Khi gặp bất kỳ điều kiện nào trong bảng dưới đây, người vận hành nên chủ động kích hoạt phương án rollback:

STTĐiều kiện sự cốNgưỡng kích hoạtQuyết định
1Thời gian bảo trì vượt giới hạnQuá trình dump & restore vượt quá khung giờ bảo trì quá 20 phút mà chưa hoàn tất 80%.Kích hoạt rollback
2Sai lệch tính toàn vẹn dữ liệuBảng giao dịch (orders, payments) bị lệch số lượng dòng hoặc sai lệch khóa chính.Kích hoạt rollback
3Độ trễ TTFB tăng caoTTFB trung bình đo được từ người dùng tăng quá 250% so với máy chủ cũ do nghẽn mạng hoặc lỗi N+1 query.Kích hoạt rollback
4Tỷ lệ lỗi hệ thống caoTỷ lệ phản hồi HTTP 500/502 vượt quá 1.0% liên tục trong 15 phút đầu tiên sau khi mở lại website.Kích hoạt rollback

Quy trình rollback nhanh

  1. Chuyển lại bản ghi A trên Cloudflare DNS trỏ ngược về IP public của máy chủ Single-VPS cũ.
  2. Trên máy chủ cũ, sửa lại tệp .env trỏ về DB_HOST=127.0.0.1 và tắt chế độ bảo trì (php artisan up).
  3. Khởi động lại ứng dụng web trên máy chủ cũ.

Dữ liệu trên máy chủ cũ vẫn được giữ nguyên từ thời điểm bắt đầu bảo trì, do đó website sẽ hoạt động bình thường trở lại ngay lập tức. Đội ngũ kỹ thuật sẽ có đủ thời gian phân tích nguyên nhân lỗi trên hạ tầng mới mà không gây ảnh hưởng kéo dài đến người dùng.

Sau khi hoàn tất danh mục kiểm tra này và vận hành ổn định cụm Multi-Server, hạ tầng của bạn đã chính thức bước sang mô hình phân tán. Hãy tiếp tục chuẩn bị cho giai đoạn tiếp theo của Phase 3: xây dựng chu trình phát hành phần mềm tự động qua pipeline CI/CD tự host và thiết lập cơ chế sao lưu bất biến để bảo vệ an toàn tài sản số của hệ thống.

Nội dung hướng dẫn này có hữu ích với hệ thống của bạn không?

Chia sẻ bài viết hữu ích

Gửi bài viết này cho đồng nghiệp

Đọc tiếp

Bài nên đọc tiếp

Xem tất cả bài về Quản trị VPS