Về chủ đề phân tải hệ thống web, sẽ được chia làm 2 phần để giúp bạn đọc dễ theo dõi hơn.
Phần 1: Hiểu hơn về phân tải, cài đặt và triển khai việc phân tải với HAProxy
Phần 2: Cải thiện độ ổn định và tính sẵn sàng cao cho hệ thống HAProxy (High Availability)
Sau khi đã cài đặt và triển khai được HAProxy như trong phần 1, chúng ta sẽ bắt đầu phần 2 với mục tiêu cải thiện độ ổn định và tính sẵn sàng cao cho hệ thống HAProxy (High Availability)
I. Giải pháp High Availability cho HAProxy
Sau khi cài đặt và triển khai xong HAProxy, chúng ta đã giải quyết được bài toán public một số ứng dụng web trong nội bộ để mọi người có thể truy cập được. Tuy nhiên, trong trường hợp server đang chạy HAProxy gặp sự cố, thì tất cả các site mà được public sẽ không thể truy cập được. Đây là một vấn đề lớn, vì vậy, cần tìm giải pháp để tăng tính sẵn sàng cho hệ thống HAProxy (High Availability).
Một giải pháp mà tôi đã lựa chọn, là sẽ dựng nhiều server chạy HAProxy, và chúng hoạt động theo cơ chế active-passive. Ví dụ như sau:
II. Giao thức VRRP (Virtual Router Redundancy Protocol)
VRRP (Virtual Router Redundancy Protocol) là một giao thức mạng được sử dụng để tăng tính sẵn sàng và độ tin cậy của môi trường mạng bằng cách loại bỏ router lỗi trong việc xác định định tuyến mạng.
VRRP cho phép nhiều router chia sẻ một địa chỉ IP bằng cách lựa chọn một router ảo dựa trên độ ưu tiên. Router chính (Master) sẽ có độ ưu tiên cao nhất và router phụ (Backup) sẽ thực hiện quá trình giám sát.
Cách hoạt động của VRRP:
- Initialization: Trong quá trình này, các router được cấu hình với VRRP và một giá trị độ ưu tiên. Một router có độ ưu tiên cao nhất sẽ trở thành router chính (master) và định tuyến cho mạng còn lại.
- Operation: Router chính gửi gói VRRP để thông báo sự hiện diện của nó cho các router khác. Các router phụ giám sát gói VRRP và nếu không nhận được gói trong một khoảng thời gian nhất định, một trong các router phụ sẽ thay thế router chính.
- Transition: Nếu một router mới với độ ưu tiên cao hơn được thêm vào mạng, nó sẽ trở thành router chính mới và router cũ sẽ trở thành router phụ.
Với VRRP, mạng của bạn sẽ không bao giờ bị ngắt kết nối vì khi router chính bị lỗi thì luôn có router phụ sẵn sàng thay thế ngay lập tức.
III. Triển khai Keepalived
Keepalived là một phần mềm mã nguồn mở, sử dụng giao thức VRRP để thực hiện việc chuyển đổi IP ảo. Keepalived được cấu hình để theo dõi trạng thái của HAProxy và chuyển đổi IP ảo cho máy chủ dự phòng nếu HAProxy gặp sự cố. Điều này đồng nghĩa với việc ngay cả khi một cụm HAProxy gặp sự cố, dịch vụ vẫn có thể hoạt động thông qua máy chủ dự phòng, đảm bảo rằng dịch vụ không bị gián đoạn. Như vậy, chúng ta sẽ cần cài đặt Keepalived trên các server HAProxy. Mô hình hoạt động sẽ như sau:
1. Cài đặt keepalived
Đầu tiên, chúng ta sẽ cần cài đặt keepalived trên cả 3 server đã cài đặt HAProxy.
$ sudo apt-get install keepalived -y
2. Cấu hình keepalived
Sau khi cài đặt xong, sẽ cần cấu hình để keepalived có thể hoạt động theo mô hình mà chúng ta đã thiết kế. Để cấu hình, chúng ta cần chỉnh sửa file /etc/keepalived/keepalived.conf
.
$ sudo vi /etc/keepalived/keepalived.conf
Việc sửa file sẽ được thực hiện trên cả 3 server HAProxy. Với router chính (Master), nội dung của file keepalived.conf
sẽ như sau:
vrrp_script chk_haproxy {
script "/usr/bin/killall -0 haproxy" # check the haproxy process
interval 2 # every 2 seconds
weight 2 # add 2 points if OK
}
vrrp_instance VI_1 {
interface ens34
state MASTER
virtual_router_id 111
priority 101
virtual_ipaddress {
192.168.1.111/24
}
track_script {
chk_haproxy
}
}
Với router phụ (Backup) thứ nhất, nội dung sẽ như sau:
vrrp_script chk_haproxy {
script "/usr/bin/killall -0 haproxy" # check the haproxy process
interval 2 # every 2 seconds
weight 2 # add 2 points if OK
}
vrrp_instance VI_1 {
interface ens34
state BACKUP
virtual_router_id 111
priority 100
virtual_ipaddress {
192.168.1.111/24
}
track_script {
chk_haproxy
}
}
Với node phụ (Backup) thứ hai, nội dung sẽ như sau:
vrrp_script chk_haproxy {
script "/usr/bin/killall -0 haproxy" # check the haproxy process
interval 2 # every 2 seconds
weight 2 # add 2 points if OK
}
vrrp_instance VI_1 {
interface ens34
state BACKUP
virtual_router_id 111
priority 99
virtual_ipaddress {
192.168.1.111/24
}
track_script {
chk_haproxy
}
}
Từ config của các node, chúng ta cần chú ý đến một số thông tin sau:
- interface: để lấy giá trị này, có thể sử dụng câu lệnh sau:
$ sudo ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
....
2: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:e4:9c:28 brd ff:ff:ff:ff:ff:ff
altname enp2s2
inet 192.168.1.21/24 brd 192.168.10.255 scope global ens34
...
Ở đây, chúng ta sẽ lấy giá trị interface là ens34. Giao diện mạng này hiện tại có 1 IP chính là 192.168.1.21, sau khi cài đặt xong keepalived, chúng ta sẽ có thêm 1 IP ảo nữa là 192.168.1.111
- state : Trạng thái khởi tạo, MASTER: router chính, BACKUP: router phụ.
- priority: Độ ưu tiên của router, nếu router chính gặp sự cố, thì trong các router BACKUP, router nào có giá trị priority cao hơn thì sẽ được bổ nhiệm làm router chính mới.
- virtual_ipaddress: Giá trị ip ảo sẽ sử dụng
- track_script: Script để kiểm tra xem là HAProxy có đang hoạt động không.
3. Kiểm tra keepalived đang hoạt động
Sau khi cấu hình file, bạn sẽ cần khởi động lại dịch vụ Keepalived cho các thay đổi có hiệu lực:
$ sudo systemctl restart keepalived
Để kiểm tra xem Keepalived có hoạt động hay không, bạn có thể sử dụng lệnh sau:
$ sudo systemctl status keepalived
● keepalived.service - Keepalive Daemon (LVS and VRRP)
Loaded: loaded (/lib/systemd/system/keepalived.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2024-09-09 07:56:54 UTC; 2 weeks 1 day ago
Main PID: 864 (keepalived)
Tasks: 2 (limit: 2218)
Memory: 1.5M
CPU: 40min 48.827s
CGroup: /system.slice/keepalived.service
├─864 /usr/sbin/keepalived --dont-fork
└─915 /usr/sbin/keepalived --dont-fork
Trong thông tin đầu ra của lệnh trên, chúng ta sẽ biết được router nào là route chính, cái nào đang là phụ. Ví dụ đây là thông tin của router đang là router phụ:
Sep 21 00:15:56 vnlab-lb01 Keepalived_vrrp[906]: (VI_1) Master received advert from 192.168.10.21 with higher priority 103, ours 102
Sep 21 00:15:56 vnlab-lb01 Keepalived_vrrp[906]: (VI_1) Entering BACKUP STATE
IV. Thử nghiệm khi có server haproxy gặp sự cố
Sau khi cài đặt hệ thống, chúng ta sẽ có 3 router như sau:
- Router chính: IP chính: 192.168.1.21, IP ảo: 192.168.1.111
- Route phụ 1: IP chính: 192.168.1.20, IP ảo: 192.168.1.111
- Route phụ 2: IP chính: 192.168.1.23, IP ảo: 192.168.1.111
Chúng ta cần sử dụng IP ảo 192.168.1.111 để truy cập, hoặc để trỏ DNS. Để có thể test, tôi sẽ set file hosts với domain ai.vietnamlab.vn như sau:
192.168.1.111 ai.vietnamlab.vn
Bây giờ, chúng ta sẽ bắt đầu thực hiện các bước test:
-
Bước 1: Truy cập thành công url https://ai.vietnamlab.vn/
-
Bước 2: Tắt haproxy ở router chính:
$ sudo systemctl status haproxy
○ haproxy.service - HAProxy Load Balancer
Loaded: loaded (/lib/systemd/system/haproxy.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Wed 2024-09-25 08:35:34 UTC; 5s ago
...
- Bước 3: Kiểm tra keepalived ở router chính, thấy router chính gặp lỗi, và chuyển router chính sang router phụ 1 (192.168.1.20)
$ sudo systemctl status keepalived
Sep 25 08:35:35 vnlab-lb02 Keepalived_vrrp[915]: Script `chk_haproxy` now returning 1
Sep 25 08:35:35 vnlab-lb02 Keepalived_vrrp[915]: VRRP_Script(chk_haproxy) failed (exited with status 1)
Sep 25 08:35:35 vnlab-lb02 Keepalived_vrrp[915]: (VI_1) Changing effective priority from 103 to 101
Sep 25 08:35:38 vnlab-lb02 Keepalived_vrrp[915]: (VI_1) Master received advert from 192.168.1.20 with higher priority 102, ours 101
Sep 25 08:35:38 vnlab-lb02 Keepalived_vrrp[915]: (VI_1) Entering BACKUP STATE
- Bước 4: Kiểm tra keepalived ở router phụ 1 (192.168.1.20), thấy router này đã được chuyển thành router chính (MASTER)
$ sudo systemctl status keepalived
Sep 25 08:35:36 vnlab-lb01 Keepalived_vrrp[906]: (VI_1) received lower priority (101) advert from 192.168.10.21 - discarding
Sep 25 08:35:37 vnlab-lb01 Keepalived_vrrp[906]: (VI_1) received lower priority (101) advert from 192.168.10.21 - discarding
Sep 25 08:35:38 vnlab-lb01 Keepalived_vrrp[906]: (VI_1) received lower priority (101) advert from 192.168.10.21 - discarding
Sep 25 08:35:38 vnlab-lb01 Keepalived_vrrp[906]: (VI_1) Entering MASTER STATE
- Bước 5: Truy cập lại url https://ai.vietnamlab.vn/ thấy vẫn truy cập được.
Như vậy, khi router chính gặp vấn đề, chúng ta vẫn có thể truy cập các website của hệ thống bình thường.
V. Kết luận
Việc xử lý để tăng độ ổn định và tính sẵn sàng cao của hệ thống HAProxy là rất quan trọng. Khi sử dụng keepalived, thì nếu có server HAProxy nào gặp sự cố thì sẽ có các server Backup chạy để giúp hệ thống không bị gián đoạn truy cập. Trong trường hợp tất cả các server HAProxy đều gặp sự cố, thì hệ thống sẽ bị gián đoạn, để tránh trường hợp này xảy ra, thì ngoài việc sử dụng lượng server HAProxy hợp lý, thì cũng cần thêm hệ thống monitor và cảnh báo để giúp phát hiện ra các server gặp sự cố và xử lý sớm nhất có thể.