Vì sao dùng unicast VRRP trên OpenStack?
OpenStack (Neutron) thường block multicast/LL-mcast nên VRRP mặc định (multicast 224.0.0.18, proto 112) hay bị chặn → gây split-brain (cả 2 node cùng nhận VIP). Giải pháp phổ biến: dùng VRRP unicast (Keepalived hỗ trợ) + tạo port VIP và Allowed Address Pair để cho VM bind IP không có mặt trong port ban đầu.
1) Tạo port VIP (OpenStack CLI)
Ví dụ network id, VIP 192.168.1.40
(thay bằng network/VIP bạn dùng):
Lưu ý: port này giữ fixed IP cho VIP, tuy nhiên bạn không attach VM trực tiếp tới port vip-port — thay vào đó ta thêm VIP vào Allowed Address Pair của port VM.
2) Thêm Allowed Address Pair vào port của VM (cho phép VM bind VIP)
Giả sử port của 2 VM là PORT1
và PORT2
:
Alternative: nếu muốn chỉ accept từ 1 MAC cụ thể thì có cú pháp thêm MAC, nhưng thông thường chỉ IP là đủ khi port security cho phép.
Quan trọng: nếu cloud của bạn bật port_security = True và anti-spoofing, allowed_address_pairs
là cách chuẩn cho phép VM giả địa chỉ IP khác (VIP).
3) Bật ip_nonlocal_bind trên cả 2 VM
Để HAProxy/nginx/keepalived có thể bind VIP mặc dù IP đó không phải local ngay lúc khởi động:
4) Security Group — mở VRRP (protocol 112) & rules tối thiểu
Mở VRRP (protocol number 112) giữa 2 node (khuyến nghị giới hạn source chỉ 2 IP/ CIDR của private subnet):
Ví dụ CLI (cho security group my-sg
):
Các rule bổ sung (recommended):
-
SSH (TCP 22) từ admin IP.
-
HTTP/HTTPS (TCP 80/443) cho client.
-
ICMP (optional) cho debug ping.
Không mở 0.0.0.0/0 nếu không cần thiết — phạm vi chỉ giữa 2 node hoặc private CIDR là an toàn hơn.
5) File keepalived.conf (unicast) — mẫu cho 2 node
Lưu ý: loại bỏ
debug 3
khỏiglobal_defs
(một số bản keepalived báoUnknown keyword 'debug'
).
VM01 (MASTER preference)
vi /etc/keepalived/keepalived.conf
squid02 (BACKUP)
vi /etc/keepalived/keepalived.conf
Giải thích một số tuỳ chọn quan trọng
-
virtual_router_id
: ID cho cluster VRRP (1–255). KHÔNG trùng với bất kỳ cluster nào khác trong cùng subnet. -
unicast_src_ip
: buộc Keepalived dùng IP nguồn cụ thể (tránh 169.254.x.x link-local). -
unicast_peer
: IP thật (fixed IP) của peer — không dùng VIP ở đây. -
virtual_ipaddress { 1.2.3.4/32 dev eth0 }
: /32 +dev
giúp gán chuẩn cho interface. -
authentication.auth_pass
: dùng mật khẩu đủ mạnh để tránh bị nhồi gói giả mạo.
6) Script healthcheck (ví dụ check_nginx.sh)
Tạo /usr/local/bin/check_nginx.sh
:
weight -20
trongvrrp_script
sẽ giảm priority khi script fail (keepalived sẽ so sánh priority để chuyển VIP).
7) Khởi động, enable service
Để debug trực tiếp (foreground, verbose):
8) Kiểm tra & test
Kiểm tra VIP hiện tại
Trên mỗi node:
Chỉ 1 node phải có dòng với VIP (MASTER).
Bắt gói VRRP (xem giao tiếp unicast)
Trên node nào đó:
Bạn sẽ thấy gói:
Test failover (thực tế)
-
Test 1 (stop keepalived):
-
Trên MASTER:
sudo systemctl stop keepalived
-
Trên BACKUP:
ip a
=> VIP phải nhảy sang BACKUP.
-
-
Test 2 (stop service health):
-
Giả sử check_nginx sẽ return non-0 → MASTER giảm priority → BACKUP giành VIP.
-
-
Restore:
-
Start lại keepalived trên MASTER, nó sẽ reclam VIP nếu priority cao hơn.
-
Với OpenStack, unicast VRRP + Allowed Address Pair + ip_nonlocal_bind + SG cho VRRP là combo chuẩn để chạy VIP/HA cho LB (HAProxy/nginx) trên VM.