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

Triển khai High Availability Load Balancing với Keepalived, HAProxy và Nginx trên Ubuntu Server 24.04 LTS

Triển khai High Availability Load Balancing với Keepalived, HAProxy và Nginx trên Ubuntu Server 24.04 LTS

Hướng dẫn chi tiết từng bước triển khai hệ thống cân bằng tải High Availability (HA) với Keepalived, HAProxy và Nginx trên Ubuntu Server 24.04 LTS chuẩn Production.

Giới thiệu và Bối cảnh Sử dụng

Trong các hệ thống công nghệ thông tin hiện đại phục vụ môi trường Production, tính sẵn sàng cao (High Availability - HA) và khả năng mở rộng (Scalability) là hai yếu tố then chốt quyết định sự ổn định của dịch vụ. Một điểm nghẽn đơn lẻ (Single Point of Failure - SPOF) tại tầng Web Server hoặc Load Balancer có thể dẫn đến việc toàn bộ hệ thống bị ngưng hoạt động (downtime), gây thiệt hại nghiêm trọng về vận hành và kinh tế.

Giải pháp kết hợp giữa Keepalived, HAProxy và Nginx trên nền tảng hệ điều hành Ubuntu Server LTS cung cấp một hạ tầng cân bằng tải tầng 4 và tầng 7 (Layer 4 & Layer 7 Load Balancing) kết hợp cơ chế chuyển lỗi tự động (Failover) cấp độ mili-giây. Giải pháp này phù hợp cho các hệ thống thương mại điện tử, cổng thanh toán, hệ thống API microservices và các ứng dụng enterprise yêu cầu uptime 99.99%.

Kiến trúc Hệ thống và Nguyên lý Cấu thành

Kiến trúc High Availability chuẩn Production được thiết kế dựa trên mô hình Active-Passive cho tầng VRRP Keepalived và Active-Active cho tầng Nginx Web Backend. Cấu trúc địa chỉ IP và thành phần mạng bao gồm:

  • Virtual IP (VIP): 192.168.10.100 (Địa chỉ đại diện tiếp nhận toàn bộ traffic từ client).
  • Load Balancer Node 01 (Master): IP 192.168.10.11, cài đặt Keepalived (Master) và HAProxy.
  • Load Balancer Node 02 (Backup): IP 192.168.10.12, cài đặt Keepalived (Backup) và HAProxy.
  • Web Backend Node 01: IP 192.168.10.21, chạy Nginx Web Service (Port 8080).
  • Web Backend Node 02: IP 192.168.10.22, chạy Nginx Web Service (Port 8080).

Mô hình Kiến trúc High-Availability Load Balancing Cluster

Nguyên lý hoạt động: Keepalived sử dụng giao thức Virtual Router Redundancy Protocol (VRRP) để gán địa chỉ Virtual IP (192.168.10.100) vào interface mạng của Master node. Toàn bộ gói tin gửi đến VIP sẽ được HAProxy trên Master node tiếp nhận và phân phối đến các Backend Nginx node theo thuật toán cân bằng tải. Khi Master node gặp sự cố mạng hoặc phần cứng, Keepalived trên Backup node sẽ tự động phát hiện thông qua VRRP Advertisement và tiếp quản VIP trong khoảng thời gian dưới 1 giây mà không làm gián đoạn kết nối của người dùng.

Yêu cầu Tiền đề và Chuẩn bị Môi trường

Để triển khai giải pháp này trên môi trường Production, máy chủ cần đáp ứng các tiêu chuẩn phần cứng và cấu hình mạng cơ bản sau:

  • Hệ điều hành: Ubuntu Server 24.04 LTS hoặc Ubuntu Server 22.04 LTS sạch.
  • Quyền quản trị: Root hoặc tài khoản người dùng có quyền sudo không mật khẩu.
  • Kết nối mạng nội bộ ổn định với bằng thông tối thiểu 1Gbps giữa các node.
  • Đã cấu hình Hostname và đồng bộ thời gian NTP qua chrony.

Trước tiên, khởi tạo cấu hình Hostname và cập nhật danh sách bản ghi DNS nội bộ trên từng máy chủ:

sudo hostnamectl set-hostname lb-node-01
sudo bash -c 'cat <<EOF >> /etc/hosts
192.168.10.11 lb-node-01
192.168.10.12 lb-node-02
192.168.10.21 web-node-01
192.168.10.22 web-node-02
192.168.10.100 vip-cluster
EOF'

Kích hoạt tính năng Non-local Binding và IP Forwarding trong Linux Kernel. Thiết lập này cho phép HAProxy bind và lắng nghe trên địa chỉ Virtual IP ngay cả khi IP này chưa gán trực tiếp vào interface mạng địa phương:

sudo bash -c 'cat <<EOF > /etc/sysctl.d/99-haproxy-ha.conf
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
EOF'
sudo sysctl --system

Cài đặt các Thành phần Cơ bản

Thực hiện cài đặt các gói dịch vụ Keepalived, HAProxy và psmisc (chứa công cụ killall kiểm tra tiến trình) trên cả hai node Load Balancer (lb-node-01 và lb-node-02):

sudo apt-get update
sudo apt-get install -y keepalived haproxy psmisc curl net-tools

Trên hai máy chủ Web Backend (web-node-01 và web-node-02), cài đặt dịch vụ Nginx để làm ứng dụng phía sau Load Balancer:

sudo apt-get update
sudo apt-get install -y nginx

Cấu hình Chi tiết Keepalived và HAProxy

1. Cấu hình Keepalived cho Master Node (lb-node-01)

Tạo kịch bản kiểm tra trạng thái HAProxy tại đường dẫn /etc/keepalived/check_haproxy.sh. Nếu tiến trình HAProxy bị dừng, script sẽ trả về giá trị lỗi để Keepalived giảm priority hoặc chuyển giao VIP:

sudo bash -c 'cat <<EOF > /etc/keepalived/check_haproxy.sh
#!/bin/bash
/usr/bin/killall -0 haproxy
EOF'
sudo chmod +x /etc/keepalived/check_haproxy.sh

Cấu hình tệp tin /etc/keepalived/keepalived.conf trên lb-node-01 (Master):

global_defs {
    router_id lb-node-01
    enable_script_security
    script_user root
}

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 Secr3tVrrpP@ss
    }

    virtual_ipaddress {
        192.168.10.100/24 dev eth0 label eth0:vip
    }

    track_script {
        check_haproxy
    }
}

2. Cấu hình Keepalived cho Backup Node (lb-node-02)

Tạo script kiểm tra tương tự trên lb-node-02:

sudo bash -c 'cat <<EOF > /etc/keepalived/check_haproxy.sh
#!/bin/bash
/usr/bin/killall -0 haproxy
EOF'
sudo chmod +x /etc/keepalived/check_haproxy.sh

Cấu hình tệp tin /etc/keepalived/keepalived.conf trên lb-node-02 (Backup) với priority thấp hơn (100) và state BACKUP:

global_defs {
    router_id lb-node-02
    enable_script_security
    script_user root
}

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 Secr3tVrrpP@ss
    }

    virtual_ipaddress {
        192.168.10.100/24 dev eth0 label eth0:vip
    }

    track_script {
        check_haproxy
    }
}

Quy trình VRRP Heartbeat và Layer 7 Health Check Probing

3. Cấu hình HAProxy Load Balancer

Áp dụng bản cấu hình HAProxy sản xuất đồng nhất trên cả lb-node-01lb-node-02 tại đường dẫn /etc/haproxy/haproxy.cfg. Cấu hình hỗ trợ phân tách HTTP/HTTPS, SSL termination, health checking và trang thống kê Stats Dashboard:

global
    log /dev/log local0
    log /dev/log local1 notice
    chroot /var/lib/haproxy
    user haproxy
    group haproxy
    daemon
    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
    stats timeout 30s
    maxconn 50000

defaults
    log global
    mode http
    option httplog
    option dontlognull
    option forwardfor
    option redispatch
    retries 3
    timeout connect 5s
    timeout client 50s
    timeout server 50s
    timeout http-request 10s

frontend stats_frontend
    bind *:9000
    stats enable
    stats uri /
    stats refresh 5s
    stats auth admin:ProductionP@ssw0rd!

frontend http_in
    bind 192.168.10.100:80
    bind 192.168.10.11:80
    bind 192.168.10.12:80
    default_backend nginx_web_cluster

backend nginx_web_cluster
    mode http
    balance roundrobin
    option httpchk GET /health
    http-check expect status 200
    cookie SERVERID insert indirect nocache
    server web-01 192.168.10.21:8080 check inter 2000ms rise 2 fall 3 cookie web01
    server web-02 192.168.10.22:8080 check inter 2000ms rise 2 fall 3 cookie web02

4. Cấu hình Web Backend Nginx

Thực hiện cấu hình trên cả hai máy chủ Web Backend để phục vụ trang nội dung và phản hồi endpoint health check tại cổng 8080. Cấu hình mẫu cho web-node-01:

sudo bash -c 'cat <<EOF > /etc/nginx/sites-available/default
server {
    listen 8080 default_server;
    server_name _;
    root /var/www/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location /health {
        access_log off;
        add_header Content-Type text/plain;
        return 200 "OK\n";
    }
}
EOF'

echo "

Backend Web Server 01 - IP 192.168.10.21

" | sudo tee /var/www/html/index.html sudo systemctl restart nginx

Thực hiện tương tự trên web-node-02 với nội dung định danh khác để dễ kiểm tra load balancing:

echo "

Backend Web Server 02 - IP 192.168.10.22

" | sudo tee /var/www/html/index.html sudo systemctl restart nginx

Cấu hình Bảo mật cho Môi trường Production

1. Thiết lập Firewall UFW và Cho phép Traffic VRRP

Trên môi trường Production, Firewall phải khóa toàn bộ các cổng không sử dụng và chỉ mở các luồng giao tiếp hợp lệ. Đặc biệt, giao thức VRRP (IP Protocol 112) phải được cho phép giữa hai node Keepalived:

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 9000/tcp
sudo ufw allow proto vrrp from 192.168.10.0/24
sudo ufw --force enable

2. Hardening Linux Kernel cho Load Balancer

Tối ưu hóa các thông số mạng kernel để chống lại các đợt tấn công từ chối dịch vụ (DDoS), chống SYN Flood và tối ưu tài nguyên socket mở rộng tại tệp /etc/sysctl.d/99-security-hardening.conf:

sudo bash -c 'cat <<EOF > /etc/sysctl.d/99-security-hardening.conf
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_synack_retries = 2
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
EOF'
sudo sysctl --system

Tối ưu hóa Hiệu năng (Performance Tuning)

Đối với hệ thống tải cao xử lý hàng chục nghìn kết nối đồng thời, cấu hình mặc định của Linux OS sẽ bị giới hạn bởi File Descriptor (số lượng tệp tin/socket mở tối đa). Cần điều chỉnh hạn ngạch tài nguyên tại /etc/security/limits.conf:

sudo bash -c 'cat <<EOF >> /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535
EOF'

Bảng Tối ưu Hiệu năng Kernel và Bảo mật Firewall Enterprise

Cấu hình tối ưu hóa các thông số TCP socket buffer cho HAProxy và Nginx trong tệp /etc/sysctl.d/99-performance-tuning.conf:

sudo bash -c 'cat <<EOF > /etc/sysctl.d/99-performance-tuning.conf
fs.file-max = 2097152
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
EOF'
sudo sysctl --system

Giám sát và Quan sát Hệ thống

Giám sát trạng thái hoạt động của Keepalived và HAProxy theo thời gian thực là yêu cầu bắt buộc khi vận hành Production. Sử dụng công cụ systemctl và journalctl để theo dõi log chi tiết:

sudo systemctl status keepalived
sudo systemctl status haproxy
sudo journalctl -u keepalived -u haproxy -f --no-hostname

Kiểm tra bảng phân bổ địa chỉ IP để xác nhận node hiện tại đang giữ địa chỉ Virtual IP (eth0:vip):

ip addr show eth0

Sử dụng công cụ socat để giao tiếp trực tiếp với HAProxy Unix Domain Socket và lấy thông tin thống kê hiệu năng:

echo "show stat" | sudo socat stdio /run/haproxy/admin.sock | cut -d ',' -f 1,2,5,18,34

Kiểm thử và Mô phỏng Sự cố (Validation & Failover Testing)

Trước khi đưa hệ thống vào hoạt động chính thức, cần tiến hành kiểm tra tính hợp lệ của cú pháp cấu hình và mô phỏng sự cố thực tế.

1. Kiểm tra Cú pháp Cấu hình

sudo haproxy -c -f /etc/haproxy/haproxy.cfg
sudo keepalived -t -f /etc/keepalived/keepalived.conf

2. Kiểm thử Phân phối Tải (Load Balancing Test)

Gửi liên tiếp các yêu cầu HTTP tới Virtual IP để xác nhận HAProxy điều phối traffic đều giữa hai backend server:

for i in {1..6}; do curl -s http://192.168.10.100 | grep "Backend Web Server"; done

3. Mô phỏng Failover Node Master

Giả lập sự cố ngắt kết nối hoặc lỗi dịch vụ trên Master node (lb-node-01) bằng cách dừng dịch vụ Keepalived:

sudo systemctl stop keepalived

Kiểm tra lập tức trên Backup node (lb-node-02) để xác nhận Virtual IP đã chuyển dịch thành công:

ip addr show eth0

Mô phỏng Chuyển dịch Virtual IP và Dashboard Giám sát Failover Realtime

Thực hiện lệnh curl từ máy khách để đảm bảo ứng dụng vẫn truy cập bình thường không có thời gian chết. Sau đó khởi chạy lại Keepalived trên lb-node-01 để kiểm tra cơ chế trả lại Virtual IP về Master gốc.

Checklist Vận hành Production

Đảm bảo tất cả các hạng mục dưới đây đã được kiểm tra và nghiệm thu trước khi chuyển trạng thái cụm máy chủ sang môi trường Production:

  • Đã kích hoạt tính năng auto-start dịch vụ khi reboot: sudo systemctl enable keepalived haproxy trên cả 2 node.
  • Đã xác nhận tính đúng đắn của chuỗi mật khẩu VRRP Authentication trong keepalived.conf.
  • Đã cấu hình UFW Firewall mở đúng các cổng và cho phép giao thức VRRP.
  • Đã điều chỉnh các thông số Linux Kernel sysctl về socket, SYN cookies và file limits.
  • Đã kiểm tra cơ chế Failover thành công trong khoảng thời gian dưới 1 giây.
  • Đã cấu hình đồng bộ thời gian NTP via Chrony trên toàn bộ các node thuộc cluster.
  • Đã phân quyền bảo mật cho HAProxy Stats Dashboard và đổi mật khẩu mặc định.
  • Đã thiết lập hệ thống thu thập log tập trung (Syslog/ELK/Loki) cho HAProxy và Keepalived.

Kết luận

Mô hình kết hợp giữa Keepalived, HAProxy và Nginx mang lại giải pháp cân bằng tải và chịu lỗi toàn diện cho hạ tầng Linux doanh nghiệp. Sự kết hợp giữa tốc độ xử lý gói tin của Keepalived ở tầng IP và khả năng phân phối lưu lượng thông minh ở tầng ứng dụng của HAProxy giúp hệ thống vừa duy trì được hiệu năng cao vừa loại bỏ hoàn toàn điểm nghẽn đơn lẻ SPOF. Việc tuân thủ đầy đủ quy trình cài đặt, tối ưu hóa kernel, thắt chặt bảo mật và kiểm thử failover nghiêm ngặt là nền tảng vững chắc cho bất kỳ hạ tầng hệ thống thông tin quy mô lớn nào trên môi trường Production.

Triển khai HA Load Balancing Keepalived HAProxy Nginx trên Ubuntu Server | thanhnh.id.vn