Hệ thống ‘đứt bóng’ ngay tại cửa ngõ: Khi HAProxy chạm giới hạn vật lý
Mình từng xử lý một cụm API gánh khoảng 500.000 kết nối đồng thời. Nghịch lý ở chỗ: trong khi các node backend vẫn đang “ngồi chơi xơi nước” với CPU chỉ 20%, thì con server chạy HAProxy lại gồng mình ở mức 95-98%. Độ trễ (latency) nhảy vọt từ 10ms lên tận 500ms. Vấn đề không nằm ở cấu hình, mà nằm ở kiến trúc userspace. Mỗi gói tin (packet) phải copy qua lại giữa kernel và tầng ứng dụng, gây ra tình trạng context switching liên tục khiến CPU quá tải dù băng thông chưa đầy.
Nếu bạn cần một bộ điều phối traffic ở Layer 4 (TCP/UDP) với tốc độ xử lý hàng triệu gói tin mỗi giây (PPS) thì IPVS (IP Virtual Server) là “vũ khí” bạn cần. Không cần cài đặt rườm rà, IPVS thực chất là một module có sẵn ngay trong nhân Linux, cho phép biến server thành một cỗ máy cân bằng tải hiệu năng cao.
Bí mật đằng sau tốc độ của IPVS
Điểm ăn tiền của IPVS là nó hoạt động trực tiếp bên trong Netfilter của kernel. Thay vì bắt gói tin phải “leo thang” lên tầng ứng dụng như Nginx hay HAProxy, IPVS chặn và điều hướng ngay tại tầng mạng.
Trong mô hình này, server đóng vai trò là Director. Nó tra cứu bảng băm (hash table) với tốc độ O(1) và đẩy gói tin đi gần như tức thời. Kết quả là bạn có thể xử lý luồng dữ liệu 10Gbps mà CPU vẫn cực kỳ thong thả.
Có 3 chế độ vận hành bạn cần lưu ý:
- NAT (Network Address Translation): Director sửa IP đích rồi đẩy cho Real Server. Cách này dễ làm nhưng Director dễ thành nút thắt cổ chai vì phải xử lý cả luồng đi lẫn luồng về.
- DR (Direct Routing): Đây là chế độ “thần thánh” nhất. Director chỉ sửa địa chỉ MAC. Real Server nhận gói tin và phản hồi thẳng cho Client, bỏ qua Director ở lượt về. Hiệu năng gần như không có đối thủ.
- TUN (IP Tunneling): Dùng khi các Real Server nằm ở các dải mạng khác nhau, kết nối qua VPN hoặc Internet.
Thực hành cấu hình IPVS với ipvsadm
Để điều khiển IPVS, chúng ta dùng công cụ ipvsadm. Hãy thử thiết lập chế độ NAT cho một cụm web server đơn giản.
1. Quy hoạch sơ đồ mạng
Chuẩn bị các thông số sau:
- Load Balancer (Director):
192.168.1.10 - Backend 1 & 2:
192.168.1.21và192.168.1.22 - Virtual IP (VIP):
10.0.0.100(Địa chỉ khách hàng truy cập)
Khi thiết kế dải IP cho các cụm Cluster lớn, việc tính toán subnet bằng tay rất dễ nhầm lẫn. Mình thường dùng toolcraft.app/vi/tools/developer/ip-subnet-calculator để chia nhanh các dải CIDR /27 hoặc /28, giúp quy hoạch IP tĩnh cho backend chuẩn xác ngay từ đầu.
2. Cài đặt và kích hoạt Kernel
Cài đặt công cụ quản lý trên Ubuntu:
sudo apt-get update && sudo apt-get install ipvsadm -y
Đừng quên bật tính năng chuyển tiếp gói tin, nếu không chế độ NAT sẽ không chạy:
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
3. Thiết lập luật cân bằng tải
Tạo một dịch vụ ảo chạy cổng 80, sử dụng thuật toán Round Robin (rr):
sudo ipvsadm -A -t 10.0.0.100:80 -s rr
Đưa hai server backend vào danh sách phục vụ với tham số -m (chế độ NAT):
sudo ipvsadm -a -t 10.0.0.100:80 -r 192.168.1.21:80 -m
sudo ipvsadm -a -t 10.0.0.100:80 -r 192.168.1.22:80 -m
4. Kiểm tra thành quả
Gõ lệnh sau để xem bảng điều phối thời gian thực:
sudo ipvsadm -L -n --stats
Bạn sẽ thấy số lượng Packet In/Out và Byte đang chảy qua hệ thống một cách minh bạch.
Khi nào nên dùng IPVS thay cho HAProxy?
Lựa chọn công cụ đúng quan trọng hơn việc chọn công cụ mạnh nhất. Hãy cân nhắc dựa trên tầng xử lý:
- Chọn HAProxy nếu: Bạn cần đọc Header, soi Cookie, chặn SQL Injection hoặc giải mã SSL (Layer 7). IPVS không “thông minh” đến mức đó vì nó chỉ nhìn thấy IP và Port.
- Chọn IPVS nếu: Bạn chỉ cần chuyển tiếp TCP/UDP thô với thông lượng cực lớn. IPVS hoạt động cực kỳ ổn định, gần như không bao giờ gặp lỗi tràn bộ nhớ (OOM) vì nó không duy trì quá nhiều trạng thái phức tạp ở userspace.
Các ông lớn như Wikipedia hay GitHub thường kết hợp cả hai: IPVS đứng ngoài cùng để chịu tải hàng triệu PPS, sau đó mới đẩy vào cụm HAProxy bên trong để xử lý logic ứng dụng.
Vận hành thực tế: Đừng quên Keepalived
Việc gõ lệnh ipvsadm chỉ là bước khởi đầu. Trong môi trường production, nếu node Director duy nhất bị sập, toàn bộ hệ thống sẽ “mất tích”.
Bạn nên kết hợp IPVS với Keepalived. Keepalived giúp tạo một cặp Director chạy Master-Backup. Nếu Master gặp sự cố, Backup sẽ tự động chiếm VIP chỉ trong vài giây. Đồng thời, Keepalived còn tự động kiểm tra sức khỏe (Health Check) các Real Server, đảm bảo gói tin không bị đẩy vào một server đang lỗi.
Tóm lại, nếu Load Balancer của bạn đang “thở dốc”, hãy đưa nó xuống tầng Kernel. Đó là cách tối ưu hiệu năng thông minh nhất mà không tốn một xu nâng cấp phần cứng.

