Chuyển đến nội dung chính (Skip to content)
System Administrator

Xây Dựng Cụm Load Balancer High Availability Với HAProxy Và Keepalived Trên Ubuntu 24.04 LTS

Xây Dựng Cụm Load Balancer High Availability Với HAProxy Và Keepalived Trên Ubuntu 24.04 LTS

Hướng dẫn thực chiến từng bước xây dựng hệ thống cân bằng tải High Availability (HA) với HAProxy và Keepalived VRRP failover trên Ubuntu Server 24.04 LTS cho môi trường Production.

1. Giới thiệu tổng quan và khi nào nên sử dụng

Trong các hạ tầng CNTT doanh nghiệp, điểm gián đoạn đơn lẻ (Single Point of Failure - SPOF) tại tầng Load Balancer là một trong những rủi ro nghiêm trọng nhất đối với tính sẵn sàng của dịch vụ. Khi một Web Server độc lập hoặc một máy chủ cân bằng tải đơn lẻ gặp sự cố phần cứng, sập nguồn hoặc treo tiến trình, toàn bộ ứng dụng phía sau sẽ không thể truy cập, gây ảnh hưởng trực tiếp tới hoạt động kinh doanh.

Giải pháp tiêu chuẩn cho bài toán này trong môi trường sản xuất (Production) là kết hợp HAProxy và Keepalived trên hệ điều hành Linux doanh nghiệp như Ubuntu Server 24.04 LTS hoặc CentOS Stream 9. HAProxy đóng vai trò làm Reverse Proxy và Load Balancer hiệu năng cực cao ở tầng 4 (TCP) và tầng 7 (HTTP/HTTPS). Trong khi đó, Keepalived triển khai giao thức VRRP (Virtual Router Redundancy Protocol) nhằm quản lý một địa chỉ IP ảo (Virtual IP - VIP) chung giữa hai hoặc nhiều node load balancer.

Mô hình này nên được triển khai khi:

  • Hệ thống yêu cầu độ sẵn sàng cao đạt mức 99.99% (High Availability) cho các ứng dụng Web, API Gateway, hoặc Database Proxy.
  • Cần giải pháp cân bằng tải có khả năng xử lý hàng trăm nghìn kết nối đồng thời với độ trễ thấp.
  • Cần cơ chế tự động chuyển phòng ngừa rủi ro (Failover) dưới 1 giây khi một trong các máy chủ cân bằng tải gặp sự cố.
  • Cần quản lý và chấm dứt kết nối mã hóa SSL/TLS (SSL Termination) tập trung.

2. Kiến trúc tổng thể và các khái niệm cốt lõi

Hệ thống High Availability tiêu chuẩn bao gồm hai node Load Balancer hoạt động ở chế độ Active-Passive (Master-Backup) hoặc Active-Active, chia sẻ chung một địa chỉ Virtual IP (VIP).

Giao thức VRRP và Virtual IP

VRRP là giao thức mạng cấp thấp hoạt động ở tầng IP (IP Protocol 112). Keepalived sử dụng VRRP để liên tục gửi các gói tin Heartbeat theo khoảng thời gian định sẵn (mặc định là 1 giây) từ Master Node tới địa chỉ Multicast (224.0.0.18). Backup Node lắng nghe các thông điệp này. Nếu Backup Node không nhận được gói heartbeat trong 3 chu kỳ liên tiếp, nó sẽ tự động nâng cấp trạng thái thành Master và gán địa chỉ Virtual IP vào giao diện mạng của chính nó.

Các thông số hạ tầng mẫu

Trong hướng dẫn này, hạ tầng thử nghiệm được chuẩn hóa theo địa chỉ IP như sau:

  • Master Load Balancer (Node 1): Hostname lb-node01, IP Interface 192.168.1.11.
  • Backup Load Balancer (Node 2): Hostname lb-node02, IP Interface 192.168.1.12.
  • Virtual IP (Floating VIP): IP 192.168.1.100.
  • Backend Application Servers: web-app01 (192.168.1.21:8080), web-app02 (192.168.1.22:8080).

HAProxy and Keepalived High Availability Architecture Diagram

3. Yêu cầu tiên quyết và quy trình cài đặt chi tiết

Trước khi cấu hình các dịch vụ cân bằng tải, hệ điều hành Linux cần được chuẩn bị về giao tiếp mạng và cho phép liên kết các địa chỉ IP chưa tồn tại trên giao diện mạng vật lý (Non-local IP Binding).

Chuẩn bị Kernel Linux

HAProxy cần khả năng bind vào địa chỉ Virtual IP ngay cả khi địa chỉ này chưa được gán chính thức cho máy chủ (khi máy chủ đang ở trạng thái Backup). Cần bật hai tham số quan trọng trong Kernel Linux:

sudo sysctl -w net.ipv4.ip_nonlocal_bind=1
sudo sysctl -w net.ipv4.ip_forward=1

Cấu hình cố định các tham số này vào hệ thống để không bị mất khi reboot:

echo "net.ipv4.ip_nonlocal_bind = 1" | sudo tee -a /etc/sysctl.d/99-haproxy-ha.conf
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.d/99-haproxy-ha.conf
sudo sysctl -p /etc/sysctl.d/99-haproxy-ha.conf

Cài đặt Package trên Ubuntu Server 24.04 LTS

Thực hiện cài đặt các gói phần mềm cần thiết trên cả hai máy chủ lb-node01lb-node02:

sudo apt update
sudo apt install -y haproxy keepalived psmisc curl ufw rsyslog socat

Kiểm tra phiên bản cài đặt để đảm bảo phần mềm hoạt động bình thường:

haproxy -v
keepalived -v

4. Cấu hình chi tiết từng thành phần

Quy trình cấu hình được chia thành hai bước chính: thiết lập script theo dõi sức khỏe HAProxy cho Keepalived và cấu hình file dịch vụ chính trên cả hai node.

4.1 Tạo Script Health Check cho Keepalived

Keepalived cần kiểm tra xem tiến trình HAProxy có đang sống hay không. Nếu HAProxy bị sập mà Keepalived vẫn giữ VIP, lưu lượng mạng gửi tới VIP sẽ bị đứt đoạn. Do đó, cần viết một script kiểm tra health check trên cả 2 node tại đường dẫn /etc/keepalived/check_haproxy.sh:

sudo tee /etc/keepalived/check_haproxy.sh << 'EOF'
#!/bin/bash
if /usr/bin/killall -0 haproxy; then
    exit 0
else
    exit 1
fi
EOF

Cấp quyền thực thi cho script:

sudo chmod +x /etc/keepalived/check_haproxy.sh

4.2 Cấu hình Keepalived trên Master Node (lb-node01)

Chỉnh sửa file cấu hình /etc/keepalived/keepalived.conf trên máy chủ lb-node01:

sudo tee /etc/keepalived/keepalived.conf << 'EOF'
vrrp_script check_haproxy {
    script "/etc/keepalived/check_haproxy.sh"
    interval 2
    weight 2
    fall 2
    rise 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 101
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass Secr3tPassVRRP
    }

    virtual_ipaddress {
        192.168.1.100/24 dev eth0
    }

    track_script {
        check_haproxy
    }
}
EOF

4.3 Cấu hình Keepalived trên Backup Node (lb-node02)

Chỉnh sửa file cấu hình /etc/keepalived/keepalived.conf trên máy chủ lb-node02 với priority thấp hơn (100) và state là BACKUP:

sudo tee /etc/keepalived/keepalived.conf << 'EOF'
vrrp_script check_haproxy {
    script "/etc/keepalived/check_haproxy.sh"
    interval 2
    weight 2
    fall 2
    rise 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass Secr3tPassVRRP
    }

    virtual_ipaddress {
        192.168.1.100/24 dev eth0
    }

    track_script {
        check_haproxy
    }
}
EOF

4.4 Cấu hình HAProxy cho cả hai Node

Cấu hình file /etc/haproxy/haproxy.cfg giống nhau hoàn toàn trên cả lb-node01lb-node02 nhằm đảm bảo tính đồng nhất lưu lượng:

sudo tee /etc/haproxy/haproxy.cfg << 'EOF'
global
    log /dev/log local0
    log /dev/log local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
    stats timeout 30s
    user haproxy
    group haproxy
    daemon
    maxconn 100000

defaults
    log global
    mode http
    option httplog
    option dontlognull
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms
    retries 3

frontend stats
    mode http
    bind *:8404
    stats enable
    stats uri /
    stats refresh 5s

frontend http_in
    bind *:80
    mode http
    default_backend web_servers

backend web_servers
    mode http
    balance roundrobin
    option httpchk GET /health
    http-check expect status 200
    default-server inter 3s fall 3 rise 2
    server web01 192.168.1.21:8080 check
    server web02 192.168.1.22:8080 check
EOF

Khởi động và kích hoạt tự động chạy dịch vụ trên cả 2 máy chủ:

sudo systemctl restart haproxy
sudo systemctl enable haproxy
sudo systemctl restart keepalived
sudo systemctl enable keepalived

VRRP Failover Heartbeat Workflow Diagram

5. Kịch bản vận hành thực tế trong sản xuất

Trong vận hành thực tế, đội ngũ Sysadmin thường xuyên đối mặt với các tình huống cần bảo trì hạ tầng hoặc ứng dụng cần giữ phiên làm việc người dùng.

Bảo trì chủ động không gây Downtime

Khi cần nâng cấp hệ điều hành hoặc bảo trì máy chủ Master lb-node01, thực hiện dừng dịch vụ Keepalived trên Master để chủ động chuyển Virtual IP sang BackupNode lb-node02:

sudo systemctl stop keepalived

Sau khi bảo trì xong lb-node01, khởi động lại dịch vụ. Do có priority cao hơn (101 so với 100), lb-node01 sẽ tự động chiếm lại vai trò Master (Preemption mode):

sudo systemctl start keepalived

Cấu hình Sticky Sessions cho ứng dụng Web Stateful

Đối với các ứng dụng lưu session tại bộ nhớ cục bộ thay vì Redis/Database tập trung, HAProxy hỗ trợ chèn Cookie để cố định kết nối người dùng vào đúng Backend Server ban đầu:

backend web_servers
    mode http
    balance roundrobin
    cookie SERVERID insert indirect nocache
    server web01 192.168.1.21:8080 cookie s1 check
    server web02 192.168.1.22:8080 cookie s2 check

6. An ninh hệ thống và gia cố bảo mật

Máy chủ Load Balancer là điểm tiếp xúc đầu tiên với môi trường bên ngoài, do đó việc gia cố bảo mật mạng và mã hóa SSL/TLS là điều kiện bắt buộc.

Cấu hình Firewall UFW

Cần mở các port dịch vụ HTTP (80), HTTPS (443), cổng giám sát Stats (8404) và cho phép giao thức VRRP giao tiếp giữa 2 node:

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow from 192.168.1.0/24 to any port 8404 proto tcp
sudo ufw allow proto vrrp
sudo ufw reload
sudo ufw enable

Tối ưu hóa Kernel Hardening

Tạo file gia cố hệ thống /etc/sysctl.d/99-security-hardening.conf để chống các đòn tấn công mạng thông dụng như SYN Flood và ICMP Redirect:

sudo tee /etc/sysctl.d/99-security-hardening.conf << 'EOF'
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
EOF
sudo sysctl -p /etc/sysctl.d/99-security-hardening.conf

Cấu hình Chấm dứt SSL/TLS và HSTS Header

Để HAProxy xử lý mã hóa TLS với mức độ bảo mật cao đạt chuẩn A+ từ SSL Labs, kết hợp file certificate và private key thành một file .pem duy nhất:

sudo mkdir -p /etc/haproxy/certs
sudo cat /etc/letsencrypt/live/example.com/fullchain.pem /etc/letsencrypt/live/example.com/privkey.pem | sudo tee /etc/haproxy/certs/example.com.pem
sudo chmod 600 /etc/haproxy/certs/example.com.pem

Cập nhật khối frontend trong /etc/haproxy/haproxy.cfg:

frontend https_in
    bind *:443 ssl crt /etc/haproxy/certs/ alpn h2,http/1.1
    mode http
    http-response set-header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
    default_backend web_servers

Linux Server Security Hardening & SSL Termination Diagram

7. Tối ưu hóa hiệu năng hệ thống

Môi trường sản xuất có lưu lượng truy cập lớn yêu cầu điều chỉnh các giới hạn tài nguyên của hệ điều hành Linux để tránh lỗi hết socket hoặc hết số lượng file descriptor.

Tuning Kernel Linux cho High Concurrency

Cấu hình file /etc/sysctl.d/99-haproxy-performance.conf:

sudo tee /etc/sysctl.d/99-haproxy-performance.conf << 'EOF'
fs.file-max = 2097152
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65536
net.ipv4.tcp_max_syn_backlog = 65536
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_tw_buckets = 1440000
EOF
sudo sysctl -p /etc/sysctl.d/99-haproxy-performance.conf

Cấu hình Limit Systemd cho HAProxy

Mặc định hệ thống giới hạn số file đính kèm cho mỗi tiến trình. Cần mở rộng giới hạn này cho dịch vụ HAProxy bằng Systemd override:

sudo mkdir -p /etc/systemd/system/haproxy.service.d/
sudo tee /etc/systemd/system/haproxy.service.d/override.conf << 'EOF'
[Service]
LimitNOFILE=500000
EOF
sudo systemctl daemon-reload
sudo systemctl restart haproxy

8. Giám sát và khả năng quan sát hệ thống

Giám sát là yếu tố then chốt giúp phát hiện sớm các bất thường trên cụm Load Balancer trước khi xảy ra sự cố gián đoạn.

Cấu hình Log tách biệt qua Rsyslog

HAProxy đẩy log qua socket của rsyslog. Tạo file cấu hình /etc/rsyslog.d/49-haproxy.conf để ghi file log riêng biệt:

sudo tee /etc/rsyslog.d/49-haproxy.conf << 'EOF'
$AddUnixListenSocket /var/lib/haproxy/dev/log
local0.* -/var/log/haproxy.log
local1.* -/var/log/haproxy-status.log
& stop
EOF
sudo systemctl restart rsyslog

Kiểm tra trạng thái qua Socket CLI và Socat

Sysadmin có thể truy vấn thông số vận hành trực tiếp từ Socket admin của HAProxy:

echo "show info" | sudo socat stdio /run/haproxy/admin.sock
echo "show stat" | sudo socat stdio /run/haproxy/admin.sock

9. Kiểm thử và xác minh tính sẵn sàng cao

Việc kiểm thử kịch bản Failover thực tế đảm bảo hệ thống chuyển giao Virtual IP mượt mà khi gặp sự cố.

Xác minh gán Virtual IP

Trên Master node lb-node01, kiểm tra xem địa chỉ 192.168.1.100 đã xuất hiện hay chưa:

ip addr show dev eth0

Trên Backup node lb-node02, lệnh trên sẽ chỉ hiển thị IP vật lý 192.168.1.12 và không có VIP.

Mô phỏng sự cố Failover

Tiến hành tắt dịch vụ HAProxy trên lb-node01 để mô phỏng tiến trình bị crash:

sudo systemctl stop haproxy

Theo dõi ngay lập tức log của Keepalived trên lb-node02:

sudo journalctl -u keepalived -n 20 --no-pager

Kết quả đầu ra sẽ xác nhận lb-node02 nhận thấy script check thất bại từ Master, tiến hành tự nâng cấp từ state BACKUP lên state MASTER và gán IP 192.168.1.100 chỉ trong chưa đầy 500ms.

Đánh giá hiệu năng bằng ApacheBench

Sử dụng công cụ ApacheBench để gửi hàng nghìn request qua địa chỉ VIP trong lúc thực hiện failover:

ab -n 20000 -c 100 http://192.168.1.100/

HAProxy & Keepalived Realtime Monitoring Dashboard

10. Danh mục kiểm tra vận hành sản xuất cuối cùng

Trước khi chính thức bàn giao cụm HA Load Balancer vào môi trường Production, quản trị viên Linux bắt buộc phải hoàn thành các hạng mục kiểm tra sau:

  1. Virtual IP Non-local Binding: Đã bật net.ipv4.ip_nonlocal_bind=1 cố định trong /etc/sysctl.d/ trên cả hai node.
  2. VRRP Authentication: Mật khẩu xác thực trong keepalived.conf đã được đổi khỏi giá trị mặc định và đồng nhất giữa Master/Backup.
  3. Health Check Script: Script /etc/keepalived/check_haproxy.sh có quyền thực thi (+x) và đường dẫn chính xác.
  4. HAProxy Syntax Validation: Lệnh haproxy -c -f /etc/haproxy/haproxy.cfg trả về kết quả Configuration file is valid trên cả hai node.
  5. File Descriptors Limit: Đã cấu hình LimitNOFILE=500000 trong systemd override dịch vụ HAProxy.
  6. Firewall Rules: Đã cho phép giao thức VRRP (IP protocol 112) và các port HTTP/HTTPS trên UFW/iptables.
  7. Kernel Hardening: Đã kích hoạt tcp_syncookies và vô hiệu hóa ICMP redirecting.
  8. SSL Certificate Auto-renewal: Đã thiết lập hook tự động ghép file fullchain.pemprivkey.pem sau khi Certbot gia hạn certificate.
  9. Log Separation: Log của HAProxy được chuyển hướng chính xác vào /var/log/haproxy.log qua Rsyslog và có cấu hình Logrotate.
  10. Prometheus & Dashboard Metrics: Endpoint :8404/stats hoặc /metrics được bảo mật bằng IP whitelist hoặc HTTP Basic Auth.
  11. Preemption Mode Verification: Đã thử nghiệm dừng và khởi động lại Keepalived/HAProxy trên Master, kiểm tra VIP trả về đúng vị trí.
  12. Multi-datacenter Physical Separation: Hai máy chủ LB vật lý (hoặc Hypervisor) được đặt trên hai switch/nguồn điện tách biệt để đảm bảo đứt gãy hạ tầng vật lý không làm sập cả hai node cùng lúc.

11. Kết luận

Xây dựng hệ thống High Availability Load Balancing với HAProxy và Keepalived trên Linux là giải pháp tối ưu, chi phí hợp lý nhưng mang lại hiệu năng cao và độ tin cậy tuyệt đối cho hạ tầng sản xuất. Việc thực thi đúng quy trình chuẩn bị Kernel, cấu hình VRRP, gia cố bảo mật và kiểm thử toàn diện kịch bản Failover sẽ giúp hệ thống của bạn vận hành liên tục 24/7 mà không sợ bất kỳ rủi ro gián đoạn nào.

Xây Dựng HA Load Balancer HAProxy & Keepalived Ubuntu 24.04 LTS | thanhnh.id.vn