Hướng dẫn cấu hình Keepalived: Xây dựng Virtual IP và High Availability trên Linux

Network tutorial - IT technology blog
Network tutorial - IT technology blog

Bạn đã bao giờ trải qua cảm giác lo lắng khi một dịch vụ quan trọng trên máy chủ đột ngột ngừng hoạt động? Tưởng tượng một website với hàng ngàn người truy cập bỗng dưng báo lỗi 500, hay một hệ thống thanh toán đang xử lý giao dịch lại bị gián đoạn.

Trong kinh doanh số hiện đại, hệ thống “sập” chỉ vài phút cũng gây thiệt hại lớn về doanh thu và uy tín. Mình cũng từng trăn trở nhiều về vấn đề này, đặc biệt với các dịch vụ cần online 24/7. Làm sao để đảm bảo dịch vụ luôn sẵn sàng, dù có bất kỳ sự cố nào xảy ra?

Vấn đề thực tế: Dịch vụ quan trọng đột ngột ngừng hoạt động thì sao?

Hãy hình dung thế này: bạn đang quản lý một trang web thương mại điện tử hoặc một ứng dụng nội bộ cực kỳ quan trọng cho công ty. Mọi thứ đang chạy ổn định, nhưng rồi một ngày, “đùng một cái”, máy chủ gặp sự cố. Có thể là do phần cứng, phần mềm, hay đơn giản chỉ là lỗi mạng. Khách hàng không thể truy cập, nhân viên không thể làm việc, và áp lực từ sếp cứ thế tăng lên. Cảm giác lúc đó thật sự không dễ chịu chút nào, đúng không?

Với hệ thống đòi hỏi tính sẵn sàng cao (High Availability – HA), mục tiêu là giảm tối đa thời gian gián đoạn. Một máy chủ duy nhất luôn tiềm ẩn rủi ro là điểm lỗi duy nhất (Single Point of Failure – SPoF). Nếu máy chủ đó gặp vấn đề, toàn bộ dịch vụ sẽ ngừng trệ. Đây là một kịch bản mà mình và nhiều anh em IT khác luôn muốn tránh.

Phân tích nguyên nhân: Tại sao một máy chủ lại rủi ro?

Một máy chủ độc lập, dù mạnh mẽ đến đâu, vẫn có thể trở thành “gót chân Achilles” của cả hệ thống. Các nguyên nhân phổ biến dẫn đến việc máy chủ ngừng hoạt động bao gồm:

  • Lỗi phần cứng: Ổ cứng hỏng, RAM lỗi, CPU quá nhiệt, hoặc thậm chí là card mạng “ngủm”. Những lỗi này có thể xảy ra bất cứ lúc nào mà không báo trước.
  • Lỗi phần mềm/hệ điều hành: Một bản cập nhật không tương thích, một lỗi trong ứng dụng, hoặc một sự cố bất ngờ của hệ điều hành có thể khiến máy chủ không thể hoạt động.
  • Sự cố mạng: Đường truyền bị đứt, router/switch gặp vấn đề, hoặc cấu hình mạng bị sai có thể làm máy chủ không thể tiếp cận được từ bên ngoài.
  • Lỗi con người: Đôi khi, chỉ một thao tác cấu hình sai của người quản trị cũng đủ để “đánh sập” cả hệ thống.

Khi sự cố xảy ra trên máy chủ chính, mọi lưu lượng truy cập đáng lẽ tới dịch vụ của bạn sẽ bị chặn. Khách hàng sẽ thấy trang web không thể truy cập, hoặc ứng dụng không phản hồi.

Các cách giải quyết: Làm sao để dịch vụ luôn “sống”?

Để chống lại các điểm lỗi duy nhất, ý tưởng cơ bản là phải có sự dự phòng (redundancy). Có nhiều cách tiếp cận để đạt được điều này:

  • Cân bằng tải (Load Balancing): Phân phối lưu lượng truy cập giữa nhiều máy chủ, tối ưu hiệu suất và tăng khả năng chịu lỗi. Nếu một máy chủ “chết”, các máy chủ còn lại vẫn có thể xử lý yêu cầu. Tuy nhiên, bản thân các giải pháp cân bằng tải nếu không được thiết kế HA cũng có thể trở thành SPoF.
  • Cụm máy chủ (Clustering): Sử dụng nhiều máy chủ hoạt động cùng nhau như một đơn vị logic. Các giải pháp clustering phức tạp hơn, thường bao gồm chia sẻ dữ liệu và quản lý trạng thái.
  • Sử dụng Virtual IP (VIP): Đây là một phương pháp rất hiệu quả và được nhiều người áp dụng. Thay vì cấp IP riêng cho từng máy chủ, chúng ta dùng một địa chỉ IP “ảo” (Virtual IP) đại diện cho dịch vụ. VIP này sẽ luôn thuộc về máy chủ active và tự động chuyển sang máy chủ dự phòng (standby) khi active gặp sự cố. Khách hàng luôn truy cập VIP mà không cần biết máy chủ vật lý nào đang xử lý yêu cầu.

Trong số các giải pháp trên, Virtual IP nổi bật là cách đơn giản nhưng cực kỳ mạnh mẽ để đạt High Availability, đặc biệt cho dịch vụ không cần chia sẻ trạng thái phức tạp. Và Keepalived chính là một công cụ xuất sắc giúp chúng ta triển khai VIP một cách dễ dàng trên Linux.

Keepalived: Giải pháp tối ưu bảo vệ dịch vụ của bạn

Khi mình cần một giải pháp HA gọn nhẹ, tin cậy cho các dịch vụ như web server, database (với replication), hay các proxy server, Keepalived luôn là lựa chọn hàng đầu. Nó giúp mình triển khai Virtual IP một cách tự động, đảm bảo dịch vụ gần như không gián đoạn.

Keepalived là gì?

Keepalived là một phần mềm mã nguồn mở cho Linux, được thiết kế để cung cấp tính năng High Availability và cân bằng tải. Tuy nhiên, tính năng nổi bật và được sử dụng nhiều nhất là triển khai VRRP (Virtual Router Redundancy Protocol) để tạo Virtual IP. Bên cạnh đó, Keepalived còn có thể theo dõi (monitor) trạng thái của các dịch vụ hoặc ứng dụng trên máy chủ. Nếu một dịch vụ nào đó ngừng hoạt động, Keepalived có thể tự động chuyển VIP sang máy chủ dự phòng.

VRRP hoạt động như thế nào?

VRRP là một giao thức chuẩn, cho phép một nhóm các router hoặc máy chủ chia sẻ một địa chỉ IP ảo (Virtual IP). Trong nhóm này, sẽ có một máy chủ được bầu làm Master, và các máy chủ còn lại là Backup. Nguyên tắc hoạt động đơn giản như sau:

  • Master: Máy chủ Master sẽ nắm giữ Virtual IP và chịu trách nhiệm xử lý tất cả các gói tin gửi đến VIP. Nó cũng định kỳ gửi các gói tin “advertisement” (quảng bá) tới các máy chủ Backup để thông báo rằng nó vẫn đang hoạt động.
  • Backup: Các máy chủ Backup sẽ lắng nghe các gói tin advertisement từ Master. Nếu không nhận được advertisement trong một khoảng thời gian nhất định (thường là vài giây), máy chủ Backup có quyền tự động trở thành Master và chiếm giữ Virtual IP.
  • Chuyển đổi (Failover): Khi Master gặp sự cố, VIP sẽ tự động chuyển sang một máy chủ Backup. Quá trình này diễn ra rất nhanh, thường chỉ trong vài giây, gần như trong suốt đối với người dùng cuối. Khi Master ban đầu hoạt động trở lại, nó có thể lấy lại VIP (preemption) hoặc tiếp tục là Backup tùy thuộc vào cấu hình.

Với cơ chế này, bạn chỉ cần trỏ các ứng dụng hoặc DNS records đến Virtual IP. Dù Master hay Backup đang hoạt động, dịch vụ vẫn luôn được truy cập qua cùng một địa chỉ IP.

Triển khai Keepalived: Hướng dẫn chi tiết

Chuẩn bị hệ thống

Mình sẽ hướng dẫn các bạn triển khai Keepalived trên hai máy chủ Linux. Ở đây, mình dùng Ubuntu Server, nhưng các bước cũng tương tự với CentOS hay các bản phân phối khác.

  • Server 1 (Master): IP 192.168.1.10
  • Server 2 (Backup): IP 192.168.1.11
  • Virtual IP: 192.168.1.100 (Đây là IP mà dịch vụ của bạn sẽ sử dụng)

Đảm bảo cả hai máy chủ có thể ping được nhau và cùng thuộc một subnet. Nếu bạn cần tính toán subnet nhanh chóng để xem network range, broadcast, hay số lượng host có thể sử dụng, mình hay dùng toolcraft.app/vi/tools/developer/ip-subnet-calculator. Bạn chỉ cần nhập CIDR vào là nó sẽ hiển thị đầy đủ thông tin, cực kỳ tiện lợi.

Kiểm tra cấu hình IP hiện tại trên máy chủ của bạn:

ip a show eth0 # hoặc tên card mạng của bạn
# Ví dụ output:
# 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
#     link/ether 00:0c:29:ab:cd:ef brd ff:ff:ff:ff:ff:ff
#     inet 192.168.1.10/24 brd 192.168.1.255 scope global eth0
#        valid_lft forever preferred_lft forever

Cài đặt Keepalived

Quá trình cài đặt Keepalived khá đơn giản. Bạn chỉ cần dùng trình quản lý gói của hệ điều hành:

Trên Ubuntu/Debian:

sudo apt update
sudo apt install keepalived -y

Trên CentOS/RHEL/Fedora:

sudo yum install epel-release -y # Cần EPEL repo cho CentOS/RHEL cũ
sudo yum install keepalived -y

Cấu hình Keepalived

File cấu hình chính của Keepalived nằm ở /etc/keepalived/keepalived.conf. Chúng ta sẽ tạo hai file cấu hình khác nhau cho máy chủ Master và Backup.

Cấu hình cho Server 1 (Master)

Mở file /etc/keepalived/keepalived.conf và dán nội dung sau. Hãy chú ý các phần cần điều chỉnh như tên interface mạng (eth0), IP ảo (192.168.1.100) và mật khẩu xác thực.

global_defs {
    router_id LVS_DEVEL # Đặt một ID duy nhất cho router này
    # LVS_DEVEL có thể được thay thế bằng tên hostname của server.
}

vrrp_instance VI_1 {
    state MASTER             # Trạng thái ban đầu là MASTER
    interface eth0           # Tên interface mạng mà VIP sẽ gắn vào
    virtual_router_id 51     # ID duy nhất cho cụm VRRP (giữa 1-255). Phải giống nhau trên cả Master và Backup.
    priority 101             # Độ ưu tiên của Master (cao hơn Backup)
    advert_int 1             # Khoảng thời gian gửi quảng bá (seconds)
    authentication {
        auth_type PASS       # Kiểu xác thực
        auth_pass 1111       # Mật khẩu xác thực (phải giống nhau trên cả hai server)
    }
    virtual_ipaddress {
        192.168.1.100/24     # Địa chỉ Virtual IP của bạn
    }

    # Theo dõi trạng thái dịch vụ (tùy chọn)
    # vrrp_script chk_httpd {
    #     script "killall -0 httpd" # Kiểm tra xem tiến trình httpd có chạy không
    #     interval 2 # Chạy script mỗi 2 giây
    #     weight -20 # Nếu script thất bại, giảm ưu tiên đi 20
    # }
    # track_script {
    #     chk_httpd
    # }
}
Cấu hình cho Server 2 (Backup)

Mở file /etc/keepalived/keepalived.conf trên Server 2 và dán nội dung sau. Điểm khác biệt chính là stateBACKUPpriority thấp hơn Master.

global_defs {
    router_id LVS_BACKUP # Đặt một ID duy nhất cho router này
}

vrrp_instance VI_1 {
    state BACKUP             # Trạng thái ban đầu là BACKUP
    interface eth0           # Tên interface mạng
    virtual_router_id 51     # ID duy nhất cho cụm VRRP (phải giống Master)
    priority 100             # Độ ưu tiên của Backup (thấp hơn Master)
    advert_int 1             # Khoảng thời gian gửi quảng bá (seconds)
    authentication {
        auth_type PASS       # Kiểu xác thực
        auth_pass 1111       # Mật khẩu xác thực (phải giống Master)
    }
    virtual_ipaddress {
        192.168.1.100/24     # Địa chỉ Virtual IP của bạn
    }

    # Theo dõi trạng thái dịch vụ (tùy chọn)
    # vrrp_script chk_httpd {
    #     script "killall -0 httpd" # Kiểm tra xem tiến trình httpd có chạy không
    #     interval 2 # Chạy script mỗi 2 giây
    #     weight -20 # Nếu script thất bại, giảm ưu tiên đi 20
    # }
    # track_script {
    #     chk_httpd
    # }
}

Lưu ý quan trọng: Để Keepalived gán Virtual IP cho một interface mà không phải IP chính, bạn cần bật ip_nonlocal_bind. Ngoài ra, việc bật ip_forward là cần thiết để máy chủ có thể chuyển tiếp gói tin, mặc dù không phải lúc nào cũng bắt buộc với chỉ VIP.

Thực hiện các lệnh sau trên cả hai máy chủ:

sudo sysctl net.ipv4.ip_nonlocal_bind=1
sudo sysctl net.ipv4.ip_forward=1
# Để các thay đổi này tồn tại sau khi khởi động lại:
echo "net.ipv4.ip_nonlocal_bind = 1" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p # Áp dụng các thay đổi từ sysctl.conf ngay lập tức

Khởi động và kiểm tra

Sau khi đã cấu hình xong trên cả hai máy chủ, hãy khởi động Keepalived và kiểm tra trạng thái.

Trên cả hai máy chủ:

sudo systemctl start keepalived
sudo systemctl enable keepalived # Đảm bảo Keepalived tự khởi động cùng hệ thống
sudo systemctl status keepalived # Kiểm tra trạng thái dịch vụ

Bây giờ, hãy kiểm tra xem Virtual IP đã được gán cho interface mạng trên máy Master hay chưa. Bạn sẽ thấy 192.168.1.100 xuất hiện trên interface eth0 của Master:

ip a show eth0
# Ví dụ output trên Master:
# 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
#     link/ether 00:0c:29:ab:cd:ef brd ff:ff:ff:ff:ff:ff
#     inet 192.168.1.10/24 brd 192.168.1.255 scope global eth0
#        valid_lft forever preferred_lft forever
#     inet 192.168.1.100/24 scope global secondary eth0 # <-- Đây là VIP!
#        valid_lft forever preferred_lft forever

Trên máy Backup, bạn sẽ không thấy VIP này cho đến khi Master gặp sự cố. Bạn có thể theo dõi log của Keepalived để xem nó hoạt động:

sudo journalctl -u keepalived -f # Xem log theo thời gian thực
# hoặc
sudo tail -f /var/log/syslog # Trên một số hệ thống

Từ một máy khác trong cùng mạng, hãy thử ping Virtual IP 192.168.1.100. Bạn sẽ thấy nó phản hồi.

ping 192.168.1.100

Kiểm tra tính năng Failover

Đây là bước quan trọng nhất để kiểm tra hệ thống HA của bạn. Chúng ta sẽ mô phỏng việc máy chủ Master gặp sự cố.

Trên Server 1 (Master):

sudo systemctl stop keepalived # Dừng dịch vụ Keepalived

Ngay lập tức, Server 2 (Backup) sẽ phát hiện Master không còn quảng bá, tự động chuyển thành Master và chiếm giữ Virtual IP. Kiểm tra lại bằng ip a show eth0 trên Server 2, bạn sẽ thấy 192.168.1.100 đã xuất hiện.

Đồng thời, lệnh ping từ máy client đến 192.168.1.100 có thể bị mất một vài gói tin (thường là 1-3 gói) trong quá trình chuyển đổi, nhưng sau đó sẽ tiếp tục phản hồi bình thường.

Khi bạn khởi động lại Keepalived trên Server 1 (Master), nó sẽ quay lại trạng thái Master và lấy lại VIP (do có priority cao hơn, đây gọi là preemption).

sudo systemctl start keepalived # Khởi động lại Master

Tích hợp Health Check cho dịch vụ

Keepalived không chỉ giám sát trạng thái của chính nó mà còn có thể giám sát các dịch vụ khác (ví dụ: Nginx, Apache, Database) trên máy chủ. Nếu dịch vụ đó ngừng hoạt động, Keepalived có thể tự động hạ thấp priority của máy chủ, buộc VIP phải chuyển sang máy Backup.

Ví dụ, để kiểm tra trạng thái của dịch vụ Nginx, bạn có thể tạo một script nhỏ:

sudo nano /etc/keepalived/check_nginx.sh

Dán nội dung sau vào file:

#!/bin/bash
if systemctl is-active --quiet nginx; then
    exit 0 # Nginx đang chạy, script thành công
else
    exit 1 # Nginx không chạy, script thất bại
fi

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

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

Sau đó, thêm phần vrrp_scripttrack_script vào file cấu hình /etc/keepalived/keepalived.conf trên cả hai máy chủ:

vrrp_instance VI_1 {
    # ... các cấu hình khác ...

    track_script {
        chk_nginx # Tên của script đã định nghĩa
    }
}

vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2 # Chạy script mỗi 2 giây
    weight -20 # Nếu script trả về lỗi (exit 1), giảm priority đi 20 điểm
    # Ví dụ: nếu Master có priority 101, Nginx sập -> priority còn 81.
    # Backup có priority 100 sẽ giành quyền Master.
}

Lưu lại file và khởi động lại Keepalived trên cả hai server: sudo systemctl restart keepalived. Bây giờ, nếu Nginx trên Master bị dừng, VIP sẽ tự động chuyển sang Backup. Đây là cơ chế linh hoạt, đảm bảo tính sẵn sàng cho ứng dụng, không chỉ riêng máy chủ vật lý.

Tổng kết

Xây dựng hệ thống sẵn sàng cao đã trở thành yêu cầu thiết yếu, không còn là lựa chọn, cho hầu hết các dịch vụ trực tuyến. Keepalived mang đến giải pháp đơn giản, hiệu quả, đáng tin cậy để triển khai Virtual IP và HA trên Linux. Với Keepalived, bạn giảm đáng kể thời gian gián đoạn dịch vụ, bảo vệ danh tiếng và đảm bảo trải nghiệm liền mạch cho người dùng. Mình tin rằng sau bài hướng dẫn này, bạn đã có đủ kiến thức và tự tin để đưa dịch vụ của mình lên một tầm cao mới về độ ổn định.

Share: