Giới thiệu về Keepalived
Keepalived là một dịch vụ phần mềm được thiết kế để nâng cao khả năng sẵn sàng (High Availability - HA) của hệ thống. Nó hoạt động dựa trên giao thức VRRP (Virtual Router Redundancy Protocol) để quản lý các địa chỉ IP ảo (VIP), cho phép các địa chỉ này "trôi" (failover) tự động giữa các máy chủ trong một cụm, đảm bảo dịch vụ luôn hoạt động ngay cả khi một máy chủ gặp sự cố.
Cấu trúc tệp cấu hình Keepalived
Tệp cấu hình Keepalived (thường là keepalived.conf) chứa các phần chính sau:
- dinh_nghia_toan_cau (global_defs): Chứa các cài đặt toàn cục như email thông báo, định danh router, và các tùy chọn bảo mật.
- vrrp_script: Định nghĩa các script để kiểm tra trạng thái của dịch vụ. Keepalived sẽ chạy các script này định kỳ để quyết định ưu tiên của máy chủ.
- vrrp_instance: Định nghĩa một phiên bản VRRP cụ thể, bao gồm vai trò (MASTER/BACKUP), ID router ảo, ưu tiên, địa chỉ IP ảo, và các cài đặt xác thực.
Dưới đây là một ví dụ về cấu hình, với các tên biến và script được đổi mới để minh họa:
global_defs {
# Định nghĩa toàn cục
notification_email {
admin@domain.com
}
notification_email_from alert@domain.com
smtp_server mail.domain.com
router_id NODE_A
}
vrrp_script kiem_tra_apache { # Script kiểm tra dịch vụ Apache
script "/usr/local/bin/check_apache.sh" # Đường dẫn đến script kiểm tra
interval 5 # Chạy script mỗi 5 giây
weight -20 # Giảm ưu tiên nếu script thất bại
}
vrrp_instance CLUSTER_VIP {
state MASTER # Vai trò của máy chủ
interface eth0 # Card mạng sử dụng
virtual_router_id 51 # ID router ảo, phải giống trên tất cả các node
priority 150 # Ưu tiên, số càng cao càng được chọn làm MASTER
advert_int 1 # Khoảng thời gian đồng bộ (giây)
authentication {
auth_type PASS
auth_pass mysecret
}
virtual_ipaddress {
192.168.1.100 # Địa chỉ IP ảo
}
track_script {
kiem_tra_apache # Theo dõi script kiểm tra dịch vụ
}
}
Triển khai Keepalived với Docker
Chúng ta sẽ triển khai Keepalived trên hai node: một node chính (MASTER) và một node dự phòng (BACKUP). Môi trường được giả định đã có Docker và Docker Compose.
Môi trường
| Node | Card mạng | Vai trò | IP ảo (VIP) |
|---|---|---|---|
| 192.168.56.100 | eth0 | Node chính | 192.168.56.120 |
| 192.168.56.101 | eth0 | Node dự phòng | 192.168.56.120 |
Phương pháp 1: Sử dụng biến môi trường
Đây là cách triển khai nhanh bằng cách truyền các tham số cấu hình qua biến môi trường.
Node chính
# Khởi động container Keepalived trên node chính
docker run -d \
--name keepalived-chinh \
--net=host \
-e MANG_LUOI="eth0" \
-e UU_TIEN="150" \
-e NUT_DOI_NHAT="#PYTHON2BASH:['192.168.56.100', '192.168.56.101']" \
-e IP_AO="192.168.56.120" \
-e TRANG_THAI="MASTER" \
--privileged=true \
osixia/keepalived:stable --loglevel debug
Node dự phòng
# Khởi động container Keepalived trên node dự phòng
docker run -d \
--name keepalived-du_phong \
--net=host \
-e MANG_LUOI="eth0" \
-e UU_TIEN="100" \
-e NUT_DOI_NHAT="#PYTHON2BASH:['192.168.56.100', '192.168.56.101']" \
-e IP_AO="192.168.56.120" \
-e TRANG_THAI="BACKUP" \
--privileged=true \
osixia/keepalived:stable --loglevel debug
Phương pháp 2: Sử dụng tệp cấu hình tùy chỉnh
Cách này linh hoạt hơn, cho phép bạn định nghĩa cấu hình chi tiết trong một tệp.
Node chính
# 1. Tạo thư mục và tệp cấu hình
mkdir -p /data/keepalived/conf/
cat > /data/keepalived/conf/keepalived.conf <<EOF
global_defs {
default_interface eth0
}
vrrp_instance CLUSTER_VIP {
interface eth0
state MASTER
virtual_router_id 51
priority 150
unicast_peer {
192.168.56.100
192.168.56.101
}
virtual_ipaddress {
192.168.56.120
}
authentication {
auth_type PASS
auth_pass d0cker
}
}
EOF
# 2. Khởi động container với tệp cấu hình
docker run -d \
--name keepalived-chinh \
-v /data/keepalived/conf/keepalived.conf:/container/service/keepalived/assets/keepalived.conf \
--net=host \
--privileged=true \
osixia/keepalived:stable --loglevel debug --copy-service
Node dự phòng
# 1. Tạo thư mục và tệp cấu hình
mkdir -p /data/keepalived/conf/
cat > /data/keepalived/conf/keepalived.conf <<EOF
global_defs {
default_interface eth0
}
vrrp_instance CLUSTER_VIP {
interface eth0
state BACKUP
virtual_router_id 51
priority 100
unicast_peer {
192.168.56.100
192.168.56.101
}
virtual_ipaddress {
192.168.56.120
}
authentication {
auth_type PASS
auth_pass d0cker
}
}
EOF
# 2. Khởi động container với tệp cấu hình
docker run -d \
--name keepalived-du_phong \
-v /data/keepalived/conf/keepalived.conf:/container/service/keepalived/assets/keepalived.conf \
--net=host \
--privileged=true \
osixia/keepalived:stable --loglevel debug --copy-service
Kiểm tra và mô phỏng lỗi
Sau khi khởi động, trên node chính, bạn có thể sử dụng lệnh ip a để thấy IP ảo 192.168.56.120 đã được gán cho card mạng eth0.
Để kiểm tra cơ chế failover, hãy dừng container trên node chính:
docker stop keepalived-chinh
Khi đó, IP ảo sẽ tự động "trôi" sang node dự phòng. Bạn có thể kiểm tra lại bằng lệnh ip a trên node dự phòng.
Các vấn đề thường gặp
- IP ảo không được giải phóng: Nếu cả hai node cùng giữ IP ảo sau khi dừng dịch vụ, bạn có thể xóa IP ảo thủ công bằng lệnh:
ip addr del 192.168.56.120/24 dev eth0. - Kiểm tra sức khỏe dịch vụ: Bạn có thể sử dụng script để kiểm tra trạng thái của một dịch vụ (ví dụ: Apache) và tự động hạ cấp ưu tiên hoặc tắt Keepalived nếu dịch vụ không hoạt động.