Cấu hình cụm nginx với keepalived cho tính sẵn sàng cao

Keepalived là một công cụ mã nguồn mở hỗ trợ xây dựng hệ thống dịch vụ có khả năng chịu lỗi và tự phục hồi, dựa trên giao thức VRRP (Virtual Router Redundancy Protocol) và cơ chế kiểm tra trạng thái đa lớp. Nó hoạt động ở ba tầng của mô hình OSI: lớp mạng (Layer 3), lớp vận chuyển (Layer 4), và lớp ứng dụng (Layer 5), cho phép phát hiện sự cố và chuyển đổi vai trò giữa các nút một cách tự động — không cần can thiệp thủ công.

Nguyên lý hoạt động theo từng lớp

  • Lớp 3 (IP Layer): Keepalived gửi yêu cầu ICMP định kỳ tới địa chỉ IP của từng máy chủ. Nếu không nhận được phản hồi trong thời gian quy định, nút đó bị coi là không khả dụng và bị loại khỏi nhóm phục vụ.
  • Lớp 4 (TCP/UDP Layer): Kiểm tra trạng thái cổng dịch vụ (ví dụ: cổng 80 cho HTTP). Nếu cổng không lắng nghe, keepalived sẽ đánh dấu máy chủ tương ứng là lỗi và ngừng phân phối lưu lượng đến nó.
  • Lớp 5 (Application Layer): Cho phép tích hợp kịch bản tùy chỉnh để kiểm tra logic nghiệp vụ — như gọi API, đọc file log, hoặc xác minh trạng thái tiến trình. Kết quả kiểm tra quyết định việc giữ hay loại bỏ máy chủ khỏi cụm.

VRRP và cơ chế bầu chọn vai trò

VRRP giải quyết điểm nghẽn đơn (single point of failure) trong kiến trúc định tuyến tĩnh bằng cách tạo ra một "bộ định tuyến ảo" gồm nhiều thực thể vật lý. Trong nhóm VRRP, một nút được bầu làm MASTER — chịu trách nhiệm xử lý lưu lượng qua địa chỉ IP ảo (VIP). Các nút còn lại đóng vai trò BACKUP, giám sát tín hiệu quảng bá (advertisement) từ MASTER. Khi MASTER mất kết nối hoặc ngừng gửi tín hiệu, nút có độ ưu tiên cao nhất trong số còn lại sẽ lên thay thế — toàn bộ quá trình diễn ra trong vài giây.

Cài đặt và cấu hình nginx + keepalived

Môi trường thử nghiệm

  • node-a: 192.168.80.133 — vai trò MASTER ban đầu
  • node-b: 192.168.80.134 — vai trò BACKUP ban đầu
  • VIP chung: 192.168.80.250

Cài đặt keepalived

Khuyến khích sử dụng gói nhị phân để đảm bảo tương thích:

yum install -y keepalived

Nếu cài từ mã nguồn, cần cài đặt phụ thuộc trước:

yum install -y libnl3-devel openssl-devel popt-devel

Cấu hình keepalived.conf cho mô hình chủ-tủ

Trên node-a (MASTER):

! Configuration File for keepalived

global_defs {
    router_id node_a
}

vrrp_script chk_nginx {
    script "/opt/scripts/health_check.sh"
    interval 3
    weight 3
    fall 2
    rise 2
}

vrrp_instance VI_HTTP {
    state MASTER
    interface ens33
    virtual_router_id 88
    priority 100
    advert_int 1
    authentication {
        auth_type AH
        auth_pass sec123
    }
    virtual_ipaddress {
        192.168.80.250/24 dev ens33 label ens33:0
    }
    track_script {
        chk_nginx
    }
}

Trên node-b (BACKUP):

! Configuration File for keepalived

global_defs {
    router_id node_b
}

vrrp_script chk_nginx {
    script "/opt/scripts/health_check.sh"
    interval 3
    weight 3
    fall 2
    rise 2
}

vrrp_instance VI_HTTP {
    state BACKUP
    interface ens33
    virtual_router_id 88
    priority 85
    advert_int 1
    authentication {
        auth_type AH
        auth_pass sec123
    }
    virtual_ipaddress {
        192.168.80.250/24 dev ens33 label ens33:0
    }
    track_script {
        chk_nginx
    }
}

Kịch bản kiểm tra dịch vụ nginx

Tạo tập lệnh tại /opt/scripts/health_check.sh với nội dung sau:

#!/bin/bash
# Kiểm tra tiến trình nginx và cổng 80
if ! pgrep -x "nginx" > /dev/null || ! ss -tln | grep -q ":80"; then
    systemctl stop keepalived
    exit 1
fi
exit 0

Phân quyền thực thi:

chmod +x /opt/scripts/health_check.sh

Mô hình kép (dual-master) để tối ưu tài nguyên

Thay vì để một nút luôn ở trạng thái chờ, có thể triển khai hai VIP riêng biệt — mỗi nút vừa là MASTER cho một VIP, đồng thời là BACKUP cho VIP còn lại. Điều này giúp cân bằng tải và tận dụng toàn bộ công suất phần cứng.

Cấu hình trên node-a:

vrrp_instance VI_HTTP_A {
    state MASTER
    interface ens33
    virtual_router_id 88
    priority 100
    ...
    virtual_ipaddress { 192.168.80.250/24 }
}

vrrp_instance VI_HTTP_B {
    state BACKUP
    interface ens33
    virtual_router_id 89
    priority 85
    ...
    virtual_ipaddress { 192.168.80.251/24 }
}

Cấu hình trên node-b:

vrrp_instance VI_HTTP_A {
    state BACKUP
    interface ens33
    virtual_router_id 88
    priority 85
    ...
    virtual_ipaddress { 192.168.80.250/24 }
}

vrrp_instance VI_HTTP_B {
    state MASTER
    interface ens33
    virtual_router_id 89
    priority 100
    ...
    virtual_ipaddress { 192.168.80.251/24 }
}

Lưu ý vận hành

  • Mỗi instance VRRP phải có virtual_router_id duy nhất trong cùng một phân đoạn mạng.
  • Hai VIP nên được ánh xạ tới tên miền khác nhau hoặc sử dụng DNS round-robin để phân bổ người dùng.
  • Khuyến nghị giám sát trạng thái VIP bằng công cụ như Zabbix hoặc Prometheus với exporter keepalived.
  • Đảm bảo tường lửa cho phép giao tiếp VRRP (gói IP protocol 112) và ICMP giữa các nút.

Thẻ: keepalived nginx vrrp high-availability linux

Đăng vào ngày 27 tháng 5 lúc 15:02