So sánh các phương pháp: DNS Round-Robin vs VRRP vs BGP Anycast
Vào lúc 2:14 sáng, bộ cân bằng tải chính (primary load balancer) ở tủ rack A bị treo hoàn toàn. Lưu lượng truy cập biến mất vào một “hố đen” (black hole). Do các DNS resolver công cộng đã lưu cache bản ghi trong 300 giây, hơn 40.000 yêu cầu đã bị rớt trước khi traffic kịp chuyển sang node phụ. Trong môi trường production, cơ chế failover của bạn sẽ quyết định liệu bạn có thể ngủ ngon qua một sự cố nhỏ hay phải thức trắng buổi sáng để viết báo cáo sự cố (post-mortem).
Khi mở rộng quy mô các dịch vụ quan trọng như authoritative DNS (UDP) hoặc reverse proxy biên (TCP), các đội ngũ hạ tầng thường cân nhắc giữa ba mô hình:
- DNS Round-Robin / GeoDNS: Đơn giản để cấu hình. Bạn ánh xạ một hostname tới nhiều bản ghi A/AAAA. Tuy nhiên, các DNS resolver trung gian thường cache bản ghi rất lâu và bỏ qua mức TTL 60 giây của bạn. Nếu một máy chủ bị sập, client sẽ vẫn tiếp tục gửi yêu cầu tới IP đã chết đó trong nhiều phút hoặc thậm chí hàng giờ.
- Virtual Router Redundancy Protocol (VRRP / Keepalived): Đáng tin cậy cho tính sẵn sàng cao cục bộ (local high availability). Các node chia sẻ một Virtual IP (VIP) thông qua các gói tin multicast heartbeat định kỳ mỗi giây. Dù VRRP có thể chuyển giao IP chỉ trong 1 đến 3 giây, nó vẫn bị giới hạn trong phạm vi một Layer 2 broadcast domain duy nhất. Nếu switch Top-of-Rack (ToR) mất nguồn, VIP cũng sẽ chết theo.
- BGP Anycast: Nhiều máy chủ độc lập cùng quảng bá (announce) chính xác một địa chỉ IP (prefix /32 IPv4 hoặc /128 IPv6) tới các router thượng tầng (upstream) qua BGP. Các router sẽ sử dụng các metric định tuyến IP tiêu chuẩn để điều hướng gói tin đến node đang hoạt động ở gần nhất về mặt topo mạng. Khi một node gặp sự cố, tuyến đường (route) sẽ được thu hồi (withdraw), và hạ tầng mạng sẽ định tuyến lại các gói tin đến trong vòng vài mili giây.
| Tiêu chí | DNS Round-Robin | VRRP (Keepalived) | BGP Anycast |
|---|---|---|---|
| Tốc độ Failover | Vài phút đến vài giờ (phụ thuộc TTL) | 1 đến 3 giây | Dưới một giây (với BFD) đến 6 giây |
| Phạm vi ảnh hưởng (Blast Radius) | Gián đoạn toàn cầu với các client bị cache | Giới hạn trong một rack hoặc subnet L2 | Cô lập trong đường dẫn mạng cục bộ |
| Phân phối lưu lượng | Ngẫu nhiên phía client (kém chính xác) | Cặp Active/Passive | ECMP ở tốc độ đường truyền (line-rate) trên toàn bộ các node |
| Khả năng hấp thụ DDoS | Đánh đều vào tất cả mục tiêu | Làm nghẽn đường truyền active duy nhất | Phân tán theo vị trí địa lý tại rìa mạng (edge) |
Ưu và nhược điểm của BGP Anycast
BGP Anycast giúp đơn giản hóa việc phân phối lưu lượng, nhưng việc chuyển cơ chế cân bằng tải từ Layer 4 xuống Layer 3 cũng mang lại một số ràng buộc vận hành nhất định.
Ưu điểm
- Thông lượng không qua proxy (Zero-Proxy Throughput): Các switch thượng tầng phân phối lưu lượng bằng cách dùng Equal-Cost Multi-Path (ECMP). Gói tin đi thẳng từ ASIC của switch tới card mạng của máy chủ ở tốc độ đường truyền 40 Gbps hoặc 100 Gbps mà không cần proxy phần mềm làm trung gian.
- Tự động cô lập phạm vi ảnh hưởng: Các cuộc tấn công DDoS quy mô lớn (volumetric DDoS) sẽ được định tuyến tới node ở gần các thiết bị botnet nhất về mặt topo mạng. Một đợt flood 50 Gbps tại Frankfurt sẽ được giữ lại ở châu Âu thay vì tràn sang làm tê liệt cụm máy chủ của bạn tại Ashburn.
- Khả năng phục hồi phi trạng thái (Stateless Resilience): Router sẽ lập tức loại bỏ các node bị lỗi khỏi bảng định tuyến ngay khi phiên BGP đóng lại hoặc nhận được gói tin rút route (withdrawal).
Nhược điểm và các điểm đánh đổi
- Reset phiên TCP khi đổi route: Các switch tính toán đường đi ECMP dựa trên hash 5-tuple của gói tin (IP nguồn, IP đích, port nguồn, port đích, giao thức). Nếu một máy chủ trong nhóm ECMP bị sập, switch sẽ tính toán lại hash cho tất cả các node còn lại. Các kết nối TCP duy trì lâu—chẳng hạn như tải lên tệp 400 MB hoặc luồng WebSocket—sẽ bị điều hướng sang máy chủ mới và lập tức bị ngắt với gói tin TCP RST.
- Hình phạt do Route Flapping: Nếu một health check bị lỗi liên tục bật/tắt quảng bá BGP sau mỗi vài giây, các nhà mạng transit sẽ kích hoạt cơ chế BGP route dampening và chặn dải prefix của bạn lên đến 30 phút.
- Yêu cầu BGP Peering: Trung tâm dữ liệu hoặc nhà cung cấp hạ tầng phải cấp quyền thiết lập phiên peering riêng biệt với switch Top-of-Rack của họ qua eBGP hoặc iBGP.
Kiến trúc khuyến nghị cho BIRD trên Linux
Khi lưu lượng vượt quá khả năng xử lý của một cặp thiết bị phần cứng chuyên dụng, chạy BGP trực tiếp trên các host Linux là cách tiếp cận tiêu chuẩn trong ngành. Mô hình tối ưu nhất là triển khai BIRD 2 (Border Internet Routing Daemon) trên máy chủ vật lý (bare metal) hoặc máy ảo (VM), thiết lập peering chéo với hai switch Top-of-Rack.
Tổng quan mô hình topo
- Anycast VIP:
192.0.2.53/32được gán vào một interfacedummy0riêng trên mỗi node. - Subnet vật lý:
10.10.10.0/24trêneth0dùng cho quản trị node và BGP peering. - Node 1: IP
10.10.10.11(AS 65001) peering với ToR Switch 1 (10.10.10.1, AS 65000). - Node 2: IP
10.10.10.12(AS 65001) peering với ToR Switch 2 (10.10.10.2, AS 65000). - Watchdog giám sát sự cố: Một agent nội bộ sẽ kiểm tra độ phản hồi của tiến trình (truy vấn DNS tới port 53 hoặc mã HTTP 200 trên port 80). Nếu daemon gặp sự cố, script sẽ gỡ bỏ địa chỉ trên
dummy0. BIRD sẽ phát hiện điều này ngay lập tức qua Linux netlink và gửi bản tin BGPWITHDRAW.
Đối với lưu lượng TCP (như Nginx hoặc Envoy), hãy cấu hình kernel sysctl net.ipv4.ip_nonlocal_bind = 1. Cấu hình này cho phép web server có thể bind vào 192.0.2.53:443 ngay cả khi dummy interface chưa được bật trong quá trình khởi động ban đầu.
Hướng dẫn triển khai: Cấu hình BIRD từng bước trên Linux
Bước 1: Cấu hình Dummy Anycast Interface
Tuyệt đối không gán trực tiếp IP Anycast vào interface vật lý. Một dummy interface giúp tách biệt service VIP khỏi sự thay đổi trạng thái đường truyền (link-state) của kết nối vật lý.
# Nạp kernel module dummy
sudo modprobe dummy
# Tạo dummy interface
sudo ip link add dev dummy0 type dummy
sudo ip link set dev dummy0 up
# Gán IP Anycast dưới dạng địa chỉ host /32
sudo ip addr add 192.0.2.53/32 dev dummy0
Để duy trì cấu hình này sau khi khởi động lại hệ thống, hãy tạo tệp /etc/systemd/network/10-dummy0.netdev:
[NetDev]
Name=dummy0
Kind=dummy
Tiếp theo, định nghĩa cấu hình mạng trong /etc/systemd/network/10-dummy0.network:
[Match]
Name=dummy0
[Network]
Address=192.0.2.53/32
Kích hoạt daemon systemd-networkd để áp dụng interface:
sudo systemctl enable --now systemd-networkd
Bước 2: Kích hoạt Packet Forwarding và ARP Filtering trong Kernel
Khi nhiều máy chủ chia sẻ cùng một IP trong subnet của trung tâm dữ liệu, chúng sẽ cùng phản hồi các yêu cầu ARP cho IP đó. Ngăn ngừa xung đột ARP trùng lặp bằng cách thắt chặt các cờ kernel sysctl:
sudo tee /etc/sysctl.d/99-anycast.conf << 'EOF'
# Bật tính năng chuyển tiếp gói tin (packet forwarding)
net.ipv4.ip_forward = 1
# Cho phép các dịch vụ bind vào IP chưa được gán cho interface
net.ipv4.ip_nonlocal_bind = 1
# Ngăn máy chủ phản hồi truy vấn ARP của dummy0 trên interface vật lý eth0
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
EOF
sudo sysctl --system
Bước 3: Cài đặt và cấu hình BIRD 2
Cài đặt gói BIRD 2:
sudo apt-get update && sudo apt-get install -y bird2
Thay thế nội dung /etc/bird/bird.conf bằng cấu hình chuẩn production sau. BIRD sẽ theo dõi dummy0 và quảng bá prefix 192.0.2.53/32 tới switch ToR:
# /etc/bird/bird.conf
log syslog all;
router id 10.10.10.11;
define ANYCAST_IP = 192.0.2.53/32;
protocol device {
scan time 5;
}
# Đọc các route và IP được cấu hình trên dummy0 qua netlink
protocol direct direct_anycast {
interface "dummy0";
}
# Filter: Chỉ quảng bá prefix /32 Anycast
filter anycast_export {
if net = ANYCAST_IP then accept;
reject;
}
# Phiên peering tới Top-of-Rack Switch 1
protocol bgp tor_switch1 {
local 10.10.10.11 as 65001;
neighbor 10.10.10.1 as 65000;
ipv4 {
import none;
export filter anycast_export;
};
# Hold time 6s, keepalive 2s để phát hiện lỗi nhanh trong vòng 6 giây
hold time 6;
keepalive time 2;
}
Kiểm tra cú pháp cấu hình và khởi động lại dịch vụ:
sudo bird -p
sudo systemctl restart bird
sudo systemctl enable bird
Bước 4: Tự động hóa việc thu hồi route bằng Health Check
Việc tiếp tục quảng bá route BGP khi dịch vụ đã chết sẽ tạo ra một “hố đen” nghiêm trọng. Cơ chế health check nội bộ cần phải gỡ bỏ địa chỉ IP khỏi dummy0 khi kiểm tra thất bại, từ đó kích hoạt BIRD thu hồi prefix.
Tạo một script thực thi tại /usr/local/bin/anycast-healthcheck.sh:
#!/usr/bin/env bash
set -euo pipefail
ANYCAST_IP="192.0.2.53/32"
INTERFACE="dummy0"
CHECK_HOST="127.0.0.1"
# 1. Kiểm tra DNS phản hồi cục bộ trong vòng 500ms
check_dns() {
dig +time=1 +tries=1 @"$CHECK_HOST" health.check.local A > /dev/null 2>&1
}
# 2. Kiểm tra endpoint healthz của Nginx / Envoy trả về HTTP 200 trong vòng 1s
check_http() {
curl -s -f -o /dev/null --connect-timeout 1 "http://$CHECK_HOST/healthz"
}
if check_dns && check_http; then
# Dịch vụ hoạt động tốt: đảm bảo IP đã được gán vào dummy0
if ! ip addr show dev "$INTERFACE" | grep -q "$ANYCAST_IP"; then
ip addr add "$ANYCAST_IP" dev "$INTERFACE"
logger -t anycast-healthcheck "Các dịch vụ hoạt động bình thường. Đã thêm $ANYCAST_IP vào $INTERFACE."
fi
else
# Dịch vụ gặp sự cố: gỡ bỏ IP để kích hoạt thu hồi route BGP
if ip addr show dev "$INTERFACE" | grep -q "$ANYCAST_IP"; then
ip addr del "$ANYCAST_IP" dev "$INTERFACE"
logger -t anycast-healthcheck "Kiểm tra thất bại! Đã gỡ $ANYCAST_IP để thu hồi route BGP."
fi
fi
Cấp quyền thực thi cho script:
sudo chmod +x /usr/local/bin/anycast-healthcheck.sh
Thực thi script kiểm tra này định kỳ 2 giây một lần bằng systemd timer hoặc vòng lặp orchestration. Đối với các cụm máy chủ production lớn, hãy cân nhắc sử dụng các công cụ chuyên dụng như anycast-healthchecker hoặc exabgp có tích hợp sẵn tính năng giám sát trạng thái.
Bước 5: Xác minh Peering và mô phỏng sự cố Node
Sử dụng trình tương tác dòng lệnh của BIRD (birdc) để kiểm tra trạng thái phiên:
# Kiểm tra trạng thái phiên BGP
sudo birdc show protocols
# Kiểm tra các route được export
sudo birdc show route export tor_switch1
Kết quả từ console xác nhận phiên BGP đã ở trạng thái Established và 192.0.2.53/32 đang được quảng bá:
Name Proto Table State Since Info
device1 Device master4 up 02:30:12
direct_anycast Direct master4 up 02:30:12
tor_switch1 BGP master4 up 02:30:15 Established
192.0.2.53/32 unicast [direct_anycast 02:30:12] * (240)
Bây giờ hãy kiểm tra khả năng xử lý sự cố. Dừng dịch vụ DNS cục bộ:
sudo systemctl stop named
sudo /usr/local/bin/anycast-healthcheck.sh
Ngay khi script gỡ bỏ 192.0.2.53/32 khỏi dummy0, Linux kernel sẽ phát ra một sự kiện xóa địa chỉ netlink. BIRD sẽ bắt sự kiện này ngay lập tức và gửi một khung (frame) BGP WITHDRAW tới switch ToR. Trong vòng 50 mili giây, switch dừng chuyển gói tin tới Node 1 và tái phân phối lưu lượng sang Node 2. Không có độ trễ do DNS TTL. Không cần can thiệp thủ công.

