Triển khai Hệ thống Có Khả năng Dự phòng
Giới Thiệu
Trong thế giới công nghệ hiện đại, việc đảm bảo hệ thống luôn hoạt động liên tục là yếu tố sống còn đối với bất kỳ doanh nghiệp nào. Một hệ thống có dự phòng (redundant system) được thiết kế để duy trì hoạt động ngay cả khi một hoặc nhiều thành phần của nó gặp sự cố. Điều này đạt được thông qua việc nhân bản các thành phần quan trọng, từ máy chủ, cơ sở dữ liệu cho đến các thiết bị mạng. Triển khai dự phòng giúp tăng cường tính sẵn sàng cao (High Availability - HA) và khả năng chịu lỗi (Fault Tolerance), giảm thiểu rủi ro gián đoạn dịch vụ và bảo vệ danh tiếng của bạn.
Bài hướng dẫn này sẽ trang bị cho bạn kiến thức cơ bản và các bước thực hành để xây dựng một hệ thống có dự phòng đơn giản, tập trung vào việc sử dụng bộ cân bằng tải (load balancer) và nhiều máy chủ ứng dụng.
📋 Thời gian: 45 phút | Độ khó: Trung bình
Yêu Cầu
Để thực hiện theo bài hướng dẫn này, bạn cần có:
- Kiến thức cơ bản về quản trị hệ điều hành Linux (Ubuntu/CentOS).
- Hiểu biết về mạng máy tính (địa chỉ IP, cổng, tường lửa).
- Quyền truy cập vào một môi trường ảo hóa (ví dụ: VirtualBox, VMware) hoặc nền tảng điện toán đám mây (ví dụ: AWS EC2, Google Cloud, Azure) để tạo nhiều máy chủ ảo.
- Cài đặt
sshclient trên máy tính cá nhân để kết nối tới các máy chủ.
Các Bước Thực Hiện
Bước 1: Lên Kế hoạch Kiến trúc Dự phòng
Trước khi bắt đầu, hãy xác định kiến trúc dự phòng phù hợp. Có nhiều mô hình, nhưng phổ biến nhất bao gồm:
- Active-Passive: Một máy chủ hoạt động, một máy chủ chờ. Khi máy chủ chính lỗi, máy chủ chờ sẽ tiếp quản.
- Active-Active: Tất cả các máy chủ đều hoạt động và xử lý yêu cầu đồng thời. Đây là mô hình chúng ta sẽ tập trung vào, vì nó không chỉ cung cấp dự phòng mà còn tăng hiệu suất.
Chúng ta sẽ triển khai một kiến trúc Active-Active cơ bản với:
- Một máy chủ Load Balancer: Phân phối lưu lượng truy cập đến các máy chủ ứng dụng.
- Hai (hoặc nhiều hơn) máy chủ Web/Ứng dụng: Chạy ứng dụng web của bạn.
💡 Mẹo: Đối với các hệ thống phức tạp hơn, bạn cũng sẽ cần dự phòng cho cơ sở dữ liệu và các dịch vụ phụ trợ khác.
Bước 2: Chuẩn bị Cơ sở Hạ tầng
Tạo ba máy chủ ảo (hoặc instance trên cloud): một cho Load Balancer và hai cho Web Server.
Ví dụ cấu hình (trên cloud hoặc máy ảo):
- Load Balancer Node (LB1):
- Hệ điều hành: Ubuntu Server 20.04+
- CPU: 1 vCPU, RAM: 1GB
- IP Public:
LB_PUBLIC_IP - IP Private:
192.168.1.10
- Web Server Node 1 (WEB1):
- Hệ điều hành: Ubuntu Server 20.04+
- CPU: 1 vCPU, RAM: 1GB
- IP Private:
192.168.1.11
- Web Server Node 2 (WEB2):
- Hệ điều hành: Ubuntu Server 20.04+
- CPU: 1 vCPU, RAM: 1GB
- IP Private:
192.168.1.12
Đảm bảo các máy chủ này có thể giao tiếp với nhau qua mạng nội bộ (IP Private). Cấu hình tường lửa (firewall) để:
- Mở cổng 80 (HTTP) và 443 (HTTPS) trên LB1 cho truy cập từ bên ngoài.
- Mở cổng 22 (SSH) trên tất cả các máy chủ để quản trị.
- Cho phép LB1 truy cập cổng 80/443 của WEB1 và WEB2.
Bước 3: Cấu hình Máy chủ Web (WEB1 & WEB2)
Trên cả hai máy chủ WEB1 và WEB2, cài đặt một máy chủ web đơn giản (ví dụ: Nginx hoặc Apache) và tạo một trang HTML để dễ dàng nhận biết.
-
Cập nhật hệ thống và cài đặt Nginx:
# Kết nối SSH tới WEB1 và WEB2
ssh [email protected] # (hoặc IP public nếu bạn test qua public IP)
sudo apt update
sudo apt install -y nginx -
Tạo trang web đơn giản để phân biệt:
# Trên WEB1
sudo sh -c 'echo "<h1>Welcome to Web Server 1!</h1>" > /var/www/html/index.nginx-debian.html'
# Trên WEB2
sudo sh -c 'echo "<h1>Welcome to Web Server 2!</h1>" > /var/www/html/index.nginx-debian.html' -
Khởi động lại Nginx và kiểm tra:
sudo systemctl restart nginx
sudo systemctl enable nginx
sudo systemctl status nginx
# Bạn có thể thử truy cập trực tiếp bằng IP private của từng máy chủ (nếu có thể)
# hoặc thông qua SSH Tunneling để xác nhận Nginx đang chạy.✅ Sau bước này, bạn đã có hai máy chủ web độc lập.
Bước 4: Cấu hình Load Balancer (LB1)
Chúng ta sẽ sử dụng Nginx làm bộ cân bằng tải.
-
Cập nhật hệ thống và cài đặt Nginx:
# Kết nối SSH tới LB1
ssh user@LB_PUBLIC_IP
sudo apt update
sudo apt install -y nginx -
Cấu hình Nginx làm Load Balancer: Mở file cấu hình Nginx chính (hoặc tạo một file mới trong
sites-available):sudo nano /etc/nginx/sites-available/defaultSửa đổi hoặc thêm cấu hình sau vào khối
http { ... }:# Thêm khối upstream này bên ngoài khối server, nhưng bên trong khối http
upstream backend_servers {
server 192.168.1.11; # IP private của WEB1
server 192.168.1.12; # IP private của WEB2
# Có thể thêm các tùy chọn như weight, max_fails, fail_timeout
# server 192.168.1.11 weight=5;
# server 192.168.1.12 weight=2;
}
server {
listen 80;
server_name your_domain.com LB_PUBLIC_IP; # Thay bằng tên miền hoặc IP public của LB1
location / {
proxy_pass http://backend_servers; # Chuyển tiếp yêu cầu đến nhóm máy chủ backend
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}⚠️ Lưu ý: Đảm bảo bạn đã thay thế
your_domain.comvàLB_PUBLIC_IPbằng thông tin thực tế của bạn. -
Kiểm tra cú pháp Nginx và khởi động lại:
sudo nginx -t # Kiểm tra lỗi cú pháp
sudo systemctl restart nginx
sudo systemctl enable nginx
sudo systemctl status nginx✅ Bây giờ, Load Balancer của bạn đã sẵn sàng.
Bước 5: Kiểm tra và Giám sát Hệ thống Dự phòng
-
Kiểm tra cân bằng tải: Mở trình duyệt và truy cập
http://LB_PUBLIC_IP(hoặc tên miền nếu bạn đã cấu hình DNS). Làm mới trang nhiều lần. Bạn sẽ thấy nội dung thay đổi giữa "Welcome to Web Server 1!" và "Welcome to Web Server 2!", chứng tỏ Nginx đang phân phối yêu cầu giữa hai máy chủ. -
Kiểm tra khả năng chịu lỗi (Failover Test):
- Kết nối SSH tới WEB1.
- Dừng dịch vụ Nginx trên WEB1:
sudo systemctl stop nginx - Quay lại trình duyệt và làm mới
http://LB_PUBLIC_IP. - Bạn sẽ chỉ thấy nội dung "Welcome to Web Server 2!". Điều này cho thấy Load Balancer đã tự động phát hiện WEB1 không khả dụng và chuyển hướng tất cả lưu lượng đến WEB2.
- Khởi động lại Nginx trên WEB1:
sudo systemctl start nginx - Làm mới trình duyệt, bạn sẽ thấy WEB1 quay trở lại hoạt động.
- Lặp lại quy trình này với WEB2 để đảm bảo cả hai máy chủ đều hoạt động dự phòng.
-
Giám sát: Để đảm bảo hệ thống luôn ổn định, việc giám sát là cực kỳ quan trọng.
- Sử dụng các công cụ giám sát như Prometheus, Grafana, Nagios, Zabbix để theo dõi trạng thái của Load Balancer và các máy chủ ứng dụng (CPU, RAM, Disk I/O, Network I/O, trạng thái dịch vụ Nginx).
- Cấu hình cảnh báo (alerts) để nhận thông báo ngay lập tức khi có sự cố.
Troubleshooting
-
Lỗi: Không truy cập được trang web qua LB_PUBLIC_IP.
- Nguyên nhân 1: Tường lửa (firewall) chưa mở cổng 80/443 trên LB1.
- Cách xử lý: Kiểm tra và cấu hình lại tường lửa (ví dụ:
sudo ufw allow 80/tcp,sudo ufw allow 443/tcptrên Ubuntu).
- Cách xử lý: Kiểm tra và cấu hình lại tường lửa (ví dụ:
- Nguyên nhân 2: Nginx trên LB1 chưa chạy hoặc có lỗi cấu hình.
- Cách xử lý: Kiểm tra
sudo systemctl status nginxvàsudo nginx -t. Khắc phục lỗi trong file cấu hình.
- Cách xử lý: Kiểm tra
- Nguyên nhân 3: Load Balancer không thể kết nối tới các Web Server (WEB1/WEB2) qua IP Private.
- Cách xử lý: Kiểm tra kết nối mạng giữa LB1 và WEB1/WEB2 (ví dụ: dùng
ping 192.168.1.11từ LB1). Đảm bảo không có tường lửa chặn giữa các máy chủ nội bộ.
- Cách xử lý: Kiểm tra kết nối mạng giữa LB1 và WEB1/WEB2 (ví dụ: dùng
- Nguyên nhân 1: Tường lửa (firewall) chưa mở cổng 80/443 trên LB1.
-
Lỗi: Chỉ thấy nội dung từ một Web Server duy nhất, không có cân bằng tải.
- Nguyên nhân: Cấu hình
upstreamtrong Nginx trên LB1 sai hoặc chỉ có một máy chủ web đang hoạt động. - Cách xử lý:
- Kiểm tra lại file cấu hình Nginx trên LB1, đảm bảo cả hai máy chủ
192.168.1.11và192.168.1.12đều được liệt kê trong khốiupstream backend_servers. - Đảm bảo Nginx đang chạy trên cả WEB1 và WEB2.
- Kiểm tra log của Nginx trên LB1 (
sudo tail -f /var/log/nginx/error.log) để tìm lỗi kết nối tới backend.
- Kiểm tra lại file cấu hình Nginx trên LB1, đảm bảo cả hai máy chủ
- Nguyên nhân: Cấu hình
-
Lỗi: Sau khi dừng một Web Server, trang web báo lỗi thay vì chuyển sang server còn lại.
- Nguyên nhân: Nginx chưa kịp hoặc không phát hiện ra máy chủ backend bị lỗi.
- Cách xử lý: Mặc định Nginx đủ thông minh để xử lý. Đảm bảo bạn đã dừng hẳn dịch vụ Nginx trên máy chủ bị lỗi. Nếu vẫn gặp sự cố, hãy kiểm tra lại cấu hình Nginx trên LB1, đặc biệt là các tùy chọn
max_failsvàfail_timeouttrong khốiupstreamnếu bạn đã tùy chỉnh chúng.
Kết Luận
Việc triển khai hệ thống có dự phòng là một bước quan trọng để đảm bảo tính liên tục và độ tin cậy của dịch vụ. Bằng cách sử dụng Load Balancer và nhiều máy chủ ứng dụng, bạn đã tạo ra mởt hệ thống có khả năng chịu lỗi cơ bản, giúp giảm thiểu thời gian ngừng hoạt động do sự cố phần cứng hoặc phần mềm.
Best Practices:
- Tự động hóa: Sử dụng công cụ như Ansible, Chef, Puppet hoặc script để tự động hóa việc triển khai và cấu hình các máy chủ, giảm thiểu lỗi thủ công.
- Dự phòng mọi nơi: Mở rộng khái niệm dự phòng không chỉ cho máy chủ ứng dụng mà còn cho cơ sở dữ liệu, mạng, và các dịch vụ quan trọng khác.
- Kiểm tra định kỳ: Thường xuyên thực hiện các bài kiểm tra failover để đảm bảo rằng hệ thống dự phòng hoạt động đúng như mong đợi.
- Giám sát toàn diện: Triển khai các giải pháp giám sát mạnh mẽ với cảnh báo để nhanh chóng phát hiện và phản ứng với các sự cố.
- Khả năng mở rộng: Thiết kế hệ thống với khả năng mở rộng (scalability) ngay từ đầu để dễ dàng thêm các máy chủ khi nhu cầu tăng lên.
Xem thêm: