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

Giải Pháp Độ Sẵn Sàng Cao: Cấu Hình Failover IP Thủ Công Bằng Keepalived Giữa 2 Nhà Cung Cấp VPS Khác Nhau

30 tháng 5, 2026

1. Đặt vấn đề: Thách thức High Availability giữa các đám mây (Multi-Cloud)

Trong kỷ nguyên số, tính liên tục của dịch vụ trực tuyến là yếu tố sống còn đối với mọi doanh nghiệp. Một phút gián đoạn hệ thống có thể dẫn đến thiệt hại nặng nề về cả doanh thu lẫn uy tín thương hiệu. Để đạt được độ sẵn sàng cao (High Availability - HA), các kỹ sư hệ thống thường triển khai cơ chế Failover IP (IP dự phòng lỗi). Thông thường, tính năng này được các nhà cung cấp VPS/Cloud hỗ trợ sẵn trong cùng một trung tâm dữ liệu (Data Center).

Tuy nhiên, chuyện gì sẽ xảy ra nếu toàn bộ hạ tầng của nhà cung cấp đó gặp sự cố nghiêm trọng (như sự cố cáp quang, cháy trung tâm dữ liệu hoặc lỗi định tuyến diện rộng)? Để giải quyết triệt để Điểm lỗi đơn lẻ (Single Point of Failure - SPOF) ở cấp độ nhà cung cấp, giải pháp tối ưu là triển khai hệ thống HA kiểm soát luồng traffic giữa hai nhà cung cấp VPS hoàn toàn khác nhau.

Bài viết này sẽ hướng dẫn bạn cách thiết lập cơ chế Failover IP thủ công (Manual Failover IP) sử dụng Keepalived và kịch bản script tự động chuyển hướng thông qua API của nhà cung cấp DNS hoặc đơn vị nắm giữ IP.

2. Kiến trúc giải pháp Failover IP liên đám mây

Khi triển khai Keepalived trên cùng một mạng nội bộ (LAN/VLAN), giao thức VRRP (Virtual Router Redundancy Protocol) sẽ sử dụng địa chỉ multicast để bầu chọn node Master và Backup, sau đó tự động gán IP ảo (VIP) vào giao diện mạng của node Master.

Tuy nhiên, giữa hai nhà cung cấp VPS khác nhau (ví dụ: DigitalOcean và Linode/Akamai), hai VPS không nằm trong cùng một phân đoạn mạng Layer 2. Do đó, chúng ta cần một kiến trúc kết hợp:

  • Kênh giao tiếp VRRP: Sử dụng cơ chế Unicast của Keepalived để cho phép hai VPS trao đổi gói tin kiểm tra trạng thái (Heartbeat) qua Internet (Layer 3) một cách bảo mật.
  • Cơ chế Failover IP chuyển đổi: Thay vì dịch chuyển IP tĩnh nội bộ, chúng ta sẽ sử dụng một Floating IP từ bên thứ ba (hoặc cập nhật bản ghi DNS A record bằng API) khi có sự cố xảy ra. Trong bài hướng dẫn này, chúng ta sẽ tập trung vào giải pháp tối ưu nhất: Sử dụng một IP định tuyến linh hoạt hoặc Script tự động cập nhật API DNS (Cloudflare/Route53) với TTL cực thấp để định tuyến lại traffic.
Mô hình giả định:
- Node Master (VPS A - Nhà cung cấp 1): IP: 192.0.2.10
- Node Backup (VPS B - Nhà cung cấp 2): IP: 198.51.100.20
- Virtual IP / DNS Endpoint: Địa chỉ kết nối của người dùng.

3. Các bước chuẩn bị hệ thống

Trước khi bắt đầu cấu hình, hãy đảm bảo rằng bạn đã chuẩn bị sẵn sàng các yếu tố sau trên cả hai máy chủ VPS:

  1. Hai VPS chạy hệ điều hành Ubuntu Server 22.04 LTS hoặc 24.04 LTS nằm ở hai nhà cung cấp khác nhau.
  2. Các ứng dụng (ví dụ: Nginx, Apache hoặc DB) đã được cấu hình đồng bộ dữ liệu hoàn toàn giữa hai bên.
  3. Quyền truy cập API của nhà cung cấp DNS (như Cloudflare) để thực hiện cập nhật IP tự động.
  4. Mở các cổng tường lửa (Firewall) cần thiết. Cụ thể, bạn cần cho phép giao thức VRRP (IP protocol 112) hoặc cổng UDP tùy chỉnh nếu cấu hình unicast giữa hai IP công cộng của VPS.

4. Cấu hình chi tiết Keepalived qua môi trường Unicast

Bước 1: Cài đặt Keepalived

Chạy lệnh sau trên cả hai máy chủ VPS A và VPS B để cài đặt gói Keepalived mới nhất:

sudo apt update
sudo apt install keepalived -y

Bước 2: Cấu hình Keepalived trên Node Master (VPS A)

Tạo hoặc chỉnh sửa file cấu hình tại đường dẫn /etc/keepalived/keepalived.conf trên VPS A:

global_defs {
    router_id vps_master
}

vrrp_script check_app {
    script "/usr/local/bin/check_services.sh"
    interval 2
    weight 2
}

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

    # Cấu hình Unicast thay vì Multicast
    unicast_src_ip 192.0.2.10
    unicast_peer {
        198.51.100.20
    }

    authentication {
        auth_type PASS
        auth_pass Secr3tP@ss
    }

    track_script {
        check_app
    }

    notify_master "/usr/local/bin/failover_trigger.sh MASTER"
    notify_backup "/usr/local/bin/failover_trigger.sh BACKUP"
    notify_fault "/usr/local/bin/failover_trigger.sh FAULT"
}

Bước 3: Cấu hình Keepalived trên Node Backup (VPS B)

Tương tự, cấu hình file /etc/keepalived/keepalived.conf trên VPS B với độ ưu tiên (priority) thấp hơn:

global_defs {
    router_id vps_backup
}

vrrp_script check_app {
    script "/usr/local/bin/check_services.sh"
    interval 2
    weight 2
}

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

    unicast_src_ip 198.51.100.20
    unicast_peer {
        192.0.2.10
    }

    authentication {
        auth_type PASS
        auth_pass Secr3tP@ss
    }

    track_script {
        check_app
    }

    notify_master "/usr/local/bin/failover_trigger.sh MASTER"
    notify_backup "/usr/local/bin/failover_trigger.sh BACKUP"
    notify_fault "/usr/local/bin/failover_trigger.sh FAULT"
}

5. Xây dựng Script kiểm tra dịch vụ và kích hoạt Failover thủ công

Vì hai VPS nằm ở hai nhà cung cấp khác nhau, việc gán một IP ảo nội bộ (VIP) lên card mạng sẽ không giúp điều hướng traffic từ Internet vào được. Do đó, chúng ta tận dụng tính năng notify_master và notify_backup của Keepalived để kích hoạt script thay đổi định tuyến thông qua API.

Xây dựng script kiểm tra dịch vụ (`check_services.sh`)

Script này giúp Keepalived nhận biết ứng dụng chính (ví dụ: Nginx) có đang hoạt động tốt hay không. Tạo file tại /usr/local/bin/check_services.sh:

#!/bin/bash
killall -0 nginx > /dev/null 2>&1

Cấp quyền thực thi cho script: sudo chmod +x /usr/local/bin/check_services.sh

Xây dựng script chuyển đổi Failover IP qua DNS API (`failover_trigger.sh`)

Khi trạng thái thay đổi, script này sẽ gọi API của nhà cung cấp DNS để cập nhật bản ghi A Record về IP của VPS đang nắm quyền MASTER. Dưới đây là ví dụ minh họa logic xử lý:

#!/bin/bash

TYPE=$1
CLOUDFLARE_ZONE_ID="your_zone_id"
CLOUDFLARE_RECORD_ID="your_record_id"
CLOUDFLARE_API_TOKEN="your_api_token"

case $TYPE in
    MASTER)
        # Lấy IP hiện tại của chính máy này
        CURRENT_IP=$(curl -s [https://api.ipify.org](https://api.ipify.org))
        # Gọi API để cập nhật bản ghi DNS指向 CURRENT_IP
        curl -X PUT "[https://api.cloudflare.com/client/v4/zones/$CLOUDFLARE_ZONE_ID/dns_records/$CLOUDFLARE_RECORD_ID](https://api.cloudflare.com/client/v4/zones/$CLOUDFLARE_ZONE_ID/dns_records/$CLOUDFLARE_RECORD_ID)" \
             -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
             -H "Content-Type: application/json" \
             --data "{\"type\":\"A\",\"name\":\"api.yourdomain.com\",\"content\":\"$CURRENT_IP\",\"ttl\":60,\"proxied\":false}"
        ;;
    BACKUP|FAULT)
        # Không thực hiện hành động, đợi node kia lên Master hoặc xử lý thủ công
        ;;
esac

Cấp quyền thực thi: sudo chmod +x /usr/local/bin/failover_trigger.sh

6. Khởi động và kiểm tra kịch bản Failover (Testing)

Sau khi đã hoàn tất cấu hình, khởi động dịch vụ Keepalived trên cả hai máy chủ:

sudo systemctl start keepalived
sudo systemctl enable keepalived

Để kiểm tra tính năng hoạt động, bạn có thể thực hiện kiểm thử theo các kịch bản sau:

  • Kịch bản 1: Giả lập lỗi ứng dụng. Tắt dịch vụ Nginx trên VPS A (Master) bằng lệnh sudo systemctl stop nginx. Kiểm tra log hệ thống bằng lệnh sudo tail -f /var/log/syslog. Bạn sẽ thấy Keepalived trên VPS A chuyển sang trạng thái FAULT, và VPS B tự động chuyển từ BACKUP lên MASTER, kích hoạt script cập nhật DNS sang IP của VPS B.
  • Kịch bản 2: Giả lập sập nguồn máy chủ. Tắt hoàn toàn VPS A. VPS B không nhận được gói tin heartbeat unicast sau thời gian timeout sẽ lập tức chiếm quyền Master và thực thi lệnh cập nhật IP.

7. Những lưu ý quan trọng khi triển khai Multi-Cloud Failover

Mặc dù giải pháp này mang lại độ sẵn sàng cao vượt trội, ngăn ngừa được rủi ro từ phía nhà cung cấp hạ tầng, bạn vẫn cần lưu ý các điểm cốt lõi sau để đảm bảo hệ thống vận hành mượt mà:

  • Độ trễ của DNS (DNS Propagation Time): Khi sử dụng giải pháp Failover qua DNS, thời gian chuyển đổi phụ thuộc vào trị số TTL (Time to Live). Bạn nên đặt TTL ở mức thấp nhất có thể (ví dụ: 60 giây hoặc sử dụng proxy như Cloudflare để ẩn IP gốc và tận dụng cơ chế failover tức thì của họ).
  • Bảo mật gói tin Unicast: Vì các gói tin VRRP Unicast được truyền tải qua môi trường Internet công cộng, hãy đảm bảo bạn đã cấu hình chuỗi mã hóa mật khẩu mạnh trong mục authentication của Keepalived, đồng thời giới hạn Firewall chỉ cho phép IP của VPS đối tác gửi gói tin đến.
  • Đồng bộ hóa dữ liệu: Failover IP chỉ giải quyết được phần ngọn là định tuyến traffic. Phần gốc là dữ liệu (Database, Storage) phải được đồng bộ liên tục (Real-time replication) giữa 2 nhà cung cấp VPS để đảm bảo khi sập Node A, Node B có sẵn dữ liệu mới nhất để phục vụ người dùng.

8. Lời kết

Cấu hình cơ chế Failover IP thủ công bằng Keepalived giữa 2 nhà cung cấp VPS khác nhau là một giải pháp nâng cao mang lại tính độc lập tối đa cho hạ tầng mạng của doanh nghiệp. Vượt qua giới hạn của mô hình HA truyền thống trong cùng một Data Center, giải pháp này giúp hệ thống của bạn đứng vững trước các thảm họa hạ tầng diện rộng. Hãy bắt tay vào triển khai và thử nghiệm nghiêm ngặt để đảm bảo ứng dụng của bạn luôn sẵn sàng phục vụ khách hàng trong mọi tình huống.

Giải Pháp Độ Sẵn Sàng Cao: Cấu Hình Failover IP Thủ Công Bằng Keepalived Giữa 2 Nhà Cung Cấp VPS Khác Nhau | DPTCloud