Quay lại danh sách
Tin tức công nghệ

Hướng Dẫn Cấu Hình Keepalived Và HAProxy Tạo VIP IP Cho 2 VPS Hetzner Không Hỗ Trợ Sẵn Phần Cứng

3 tháng 6, 2026

1. Đặt vấn đề: Bài toán High Availability trên hạ tầng Cloud VPS

Trong kỷ nguyên số, tính sẵn sàng cao (High Availability - HA) là tiêu chuẩn bắt buộc đối với các ứng dụng doanh nghiệp. Một phút gián đoạn dịch vụ (downtime) không chỉ gây thiệt hại về doanh nghiệp, doanh thu mà còn làm giảm uy tín thương hiệu nghiêm trọng. Để giải quyết bài toán này, kiến trúc phổ biến nhất là sử dụng một cụm máy chủ (cluster) gồm ít nhất 2 VPS hoạt động song song hoặc theo mô hình Active-Passive.

Thông thường, các nhà cung cấp cloud lớn như AWS, Google Cloud hay Azure đều cung cấp sẵn giải pháp Load Balancer phần cứng hoặc IP tĩnh dịch chuyển tự động (Floating IP) tích hợp sâu vào hạ tầng. Tuy nhiên, khi sử dụng các nhà cung cấp tối ưu chi phí như Hetzner Cloud (ở các gói VPS tiêu chuẩn không mua thêm dịch vụ định tuyến nâng cao), việc cấu hình IP ảo chuyển dịch tự động giữa các máy chủ gặp một số rào cản do cơ chế bảo mật cổng mạng (Port Security) và định tuyến của nhà cung cấp.

Bài viết này sẽ hướng dẫn quý doanh nghiệp và các kỹ sư hệ thống cách kết hợp Keepalived và HAProxy để tự xây dựng một hệ thống tạo IP VIP ảo (Virtual IP / Floating IP) hoàn chỉnh, giúp tự động chuyển dịch lưu lượng (failover) lập tức khi có sự cố xảy ra.

2. Tổng quan về các công cụ trong giải pháp

Để triển khai giải pháp này, chúng ta kết hợp hai công cụ mã nguồn mở mạnh mẽ và có độ ổn định cao nhất hiện nay trong việc quản trị hệ thống:

  • HAProxy (High Availability Proxy): Là bộ cân bằng tải (Load Balancer) và proxy ngược (Reverse Proxy) cực kỳ mạnh mẽ cho các ứng dụng dựa trên TCP và HTTP. HAProxy nổi tiếng với tốc độ xử lý nhanh, sử dụng ít tài nguyên và khả năng chịu tải tốt. Trong mô hình này, HAProxy chịu trách nhiệm phân phối lưu lượng đến các Web Server phía sau và kiểm tra sức khỏe (health check) của chúng.
  • Keepalived: Là phần mềm định tuyến dựa trên giao thức VRRP (Virtual Router Redundancy Protocol). Nhiệm vụ chính của Keepalived là giám sát trạng thái hoạt động của các nút (node) trong cụm máy chủ HAProxy. Nếu node chính (MASTER) gặp sự cố, Keepalived sẽ tự động dịch chuyển địa chỉ IP ảo (VIP) sang node phụ (BACKUP) để tiếp tục duy trì kết nối mạng mà người dùng không hề nhận ra sự gián đoạn.

3. Mô hình kiến trúc và chuẩn bị hệ thống

Giả sử chúng ta có 2 VPS Linux (Ubuntu Server 22.04 LTS) cùng nằm trong một mạng nội bộ (Private Network) của Hetzner hoặc kết nối trực tiếp internet với thông số cấu hình như sau:

  • Node 1 (MASTER): IP 192.168.1.10
  • Node 2 (BACKUP): IP 192.168.1.20
  • Virtual IP (VIP) mong muốn: IP 192.168.1.100
Lưu ý quan trọng đối với Hetzner Cloud: Do hạ tầng Hetzner khóa chặn các gói tin ARP lạ để chống giả mạo IP (IP Spoofing), việc gán IP VIP theo cách thông thường của VRRP sẽ không hoạt động ngoài Internet nếu không sử dụng tính năng "Floating IP" hoặc "Aliased IP" thông qua API của Hetzner. Trong bài viết này, chúng tôi hướng dẫn cấu hình định tuyến nội bộ kết hợp script gọi API Hetzner để chuyển giao IP Floating trên bảng điều khiển một cách tự động khi xảy ra Failover.

4. Hướng dẫn cấu hình chi tiết

Bước 1: Cài đặt HAProxy và Keepalived trên cả 2 Node

Đầu tiên, cập nhật hệ thống và tiến hành cài đặt các gói phần mềm cần thiết trên cả Node 1 và Node 2:

sudo apt update
sudo apt install -y haproxy keepalived curl jq

Bước 2: Cấu hình cân bằng tải với HAProxy

Mở file cấu hình HAProxy tại đường dẫn /etc/haproxy/haproxy.cfg trên cả hai máy chủ và cấu hình phân phối lưu lượng mẫu cho một dịch vụ Web (Cấu hình này giống nhau trên cả 2 node):

global
    log /dev/log local0
    log /dev/log local1 notice
    chroot /var/lib/haproxy
    user haproxy
    group haproxy
    daemon

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

frontend web_frontend
    bind 192.168.1.100:80
    mode http
    default_backend web_servers

backend web_servers
    mode http
    balance roundrobin
    option httpchk GET /health
    server web01 10.0.0.1:80 check
    server web02 10.0.0.2:80 check

Lưu ý: Dòng lệnh bind 192.168.1.100:80 yêu cầu HAProxy lắng nghe trên địa chỉ IP VIP. Để cấu hình này có thể khởi động khi IP VIP chưa được gán thực tế vào máy chủ, chúng ta cần cho phép hệ điều hành bind vào các IP không tồn tại (non-local IP) bằng lệnh sau:

echo "net.ipv4.ip_nonlocal_bind=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

Bước 3: Cấu hình Keepalived xử lý IP ảo (VIP)

Tại Node 1 (MASTER), tạo hoặc chỉnh sửa file cấu hình /etc/keepalived/keepalived.conf:

vrrp_script check_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass Secr3tPassW0rd
    }
    virtual_ipaddress {
        192.168.1.100/24
    }
    track_script {
        check_haproxy
    }
    notify_master "/etc/keepalived/failover_hetzner.sh"
}

Tại Node 2 (BACKUP), cấu hình file tương tự nhưng thay đổi thuộc tính trạng thái và độ ưu tiên:

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass Secr3tPassW0rd
    }
    virtual_ipaddress {
        192.168.1.100/24
    }
    track_script {
        check_haproxy
    }
    notify_master "/etc/keepalived/failover_hetzner.sh"
}

Bước 4: Viết kịch bản Tích hợp API Hetzner Cloud (Giải quyết bài toán phần cứng)

Vì Hetzner không tự chuyển tiếp kết nối mạng tới IP ảo nếu cấu hình thuần bằng VRRP, chúng ta cần dùng API Hetzner để tái định tuyến Floating IP trên hạ tầng của họ sang ID của VPS đang giữ quyền MASTER. Tạo file /etc/keepalived/failover_hetzner.sh:

#!/bin/bash
HETZNER_API_TOKEN="KIEU_TOKEN_API_HETZNER_CUA_BAN"
FLOATING_IP_ID="ID_CUA_FLOATING_IP"
SERVER_ID="ID_CUA_VPS_HIEN_TAI"

curl -X POST \
  -H "Authorization: Bearer $HETZNER_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "{\"server\": $SERVER_ID}" \
  "https://api.hetzner.cloud/v1/floating_ips/$FLOATING_IP_ID/actions/assign"

Cấp quyền thực thi cho kịch bản script vừa tạo trên cả hai node:

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

5. Khởi động hệ thống và kiểm tra khả năng chịu lỗi (Failover Test)

Sau khi hoàn tất cấu hình, khởi động lại dịch vụ Keepalived và HAProxy để áp dụng các thay đổi:

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

Để kiểm tra tính năng Failover, bạn có thể mô phỏng sự cố bằng cách tắt dịch vụ HAProxy hoặc tắt hẳn mạng của Node 1 (MASTER). Theo dõi log hệ thống trên Node 2 (BACKUP) bằng lệnh tail -f /var/log/syslog, bạn sẽ thấy Node 2 nhanh chóng nhận biết Node MASTER đã chết và tự động chuyển trạng thái lên MASTER, đồng thời thực thi script gọi API Hetzner để kéo IP Floating về phía nó trong vòng dưới 3 giây.

6. Kết luận và các khuyến nghị vận hành

Việc triển khai cụm High Availability sử dụng Keepalived kết hợp HAProxy trên môi trường VPS Hetzner tuy có phần phức tạp hơn do rào cản kỹ thuật của hạ tầng mạng ảo hóa, nhưng khi tích hợp thành công thông qua API, giải pháp này mang lại độ ổn định tuyệt vời tương đương các hệ thống Enterprise đắt tiền khác. Doanh nghiệp vừa tối ưu được chi phí vận hành, vừa đảm bảo ứng dụng luôn trong trạng thái sẵn sàng phục vụ khách hàng mà không lo sợ sự cố phần cứng đơn lẻ.

Hướng Dẫn Cấu Hình Keepalived Và HAProxy Tạo VIP IP Cho 2 VPS Hetzner Không Hỗ Trợ Sẵn Phần Cứng | DPTCloud