Tối ưu hóa lưu lượng với Linux Virtual Server (LVS): Cân bằng tải Layer 4 hiệu năng cao

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

Tại sao Cân bằng tải Layer 4 lại quan trọng khi mở rộng hệ thống?

Hầu hết các nhà phát triển bắt đầu với HAProxy hoặc Nginx. Chúng rất tuyệt vời cho logic Layer 7 (HTTP), nhưng chúng chạy ở user-space. Điều này yêu cầu mọi gói tin phải đi từ card mạng, qua kernel, vào ứng dụng và ngược lại. Ở mức 10.000 yêu cầu mỗi giây, việc chuyển đổi ngữ cảnh (context switching) này vẫn có thể kiểm soát được. Tuy nhiên, khi bạn đẩy lên hơn 100.000 kết nối đồng thời hoặc làm nghẽn đường truyền 10Gbps, chi phí tài nguyên đó sẽ trở thành một nút thắt cổ chai CPU khổng lồ.

Linux Virtual Server (LVS) giải quyết vấn đề này bằng cách nằm bên trong kernel thông qua module ipvs. Nó hoạt động ở Layer 4, xử lý các gói tin TCP/UDP mà không cần can thiệp vào HTTP header hay cookie. Bằng cách duy trì trong kernel, LVS có thể chuyển tiếp các gói tin với tốc độ gần như tốc độ đường truyền (wire speed). Trong môi trường production của tôi, việc chuyển sang LVS đã giảm tải CPU gần 40% so với các proxy ở user-space dưới cùng một lượng lưu lượng.

Thiết lập LVS chế độ NAT

LVS NAT (Network Address Translation) là cấu hình đơn giản nhất. Bộ cân bằng tải đóng vai trò là gateway. Nó nhận yêu cầu, viết lại IP đích thành một máy chủ backend và xử lý lưu lượng phản hồi. Nó đơn giản, nhưng hãy nhớ: băng thông của bộ cân bằng tải giới hạn cả dữ liệu đầu vào và đầu ra.

1. Cài đặt công cụ quản lý

Bạn cần ipvsadm để quản lý các bảng IPVS của kernel. Cài đặt nó trên Ubuntu hoặc Debian bằng một lệnh:

sudo apt update && sudo apt install ipvsadm -y

2. Bật IP Forwarding

Bộ cân bằng tải phải định tuyến các gói tin giữa các mạng. Hãy bật tính năng này trong kernel ngay lập tức:

sudo sysctl -w net.ipv4.ip_forward=1

3. Cấu hình Dịch vụ ảo (Virtual Service)

Giả sử Load Balancer (VIP) của bạn là 192.168.1.10 và các backend là 10.0.0.10110.0.0.102.

# Xóa các quy tắc hiện có
sudo ipvsadm -C

# Định nghĩa VIP trên cổng 80 sử dụng thuật toán Round Robin (-s rr)
sudo ipvsadm -A -t 192.168.1.10:80 -s rr

# Ánh xạ các máy chủ thực (real server) bằng chế độ NAT (-m)
sudo ipvsadm -a -t 192.168.1.10:80 -r 10.0.0.101:80 -m
sudo ipvsadm -a -t 192.168.1.10:80 -r 10.0.0.102:80 -m

Chạy sudo ipvsadm -ln để kiểm tra. Bây giờ bạn đã có một bộ phân phối lưu lượng tốc độ cao chạy ở cấp độ kernel.

Sức mạnh thực sự: Chế độ Direct Routing (DR)

Chế độ NAT có một điểm yếu: bộ cân bằng tải là nút thắt cổ chai cho các phản hồi. Trong hầu hết các ứng dụng web, phản hồi (như một hình ảnh 2MB) lớn hơn nhiều so với yêu cầu (một lệnh GET 1KB). Direct Routing (DR) khắc phục điều này bằng cách cho phép các máy chủ backend phản hồi trực tiếp cho khách hàng.

Ở chế độ DR, bộ cân bằng tải chỉ thay đổi địa chỉ MAC của gói tin và đưa nó trở lại đường truyền. Máy chủ backend nhận gói tin, xử lý và gửi phản hồi thẳng đến người dùng. Điều này cho phép một node LVS duy nhất quản lý một cụm máy chủ khổng lồ, vì nó không bao giờ chạm vào lưu lượng phản hồi nặng nề.

Triển khai LVS-DR để đạt hiệu năng tối đa

Để DR hoạt động, tất cả các máy chủ phải dùng chung một phân đoạn Layer 2 (cùng một switch hoặc VLAN). Đây là tiêu chuẩn cho các kiến trúc trung tâm dữ liệu hiệu năng cao.

Bước 1: Cấu hình Bộ cân bằng tải

# Sử dụng Weighted Least Connections (-s wlc) để phân phối tốt hơn
sudo ipvsadm -A -t 192.168.1.50:80 -s wlc

# Thêm các máy chủ ở chế độ DR (-g)
sudo ipvsadm -a -t 192.168.1.50:80 -r 192.168.1.101:80 -g
sudo ipvsadm -a -t 192.168.1.50:80 -r 192.168.1.102:80 -g

Bước 2: Giải quyết “Vấn đề ARP” trên các Backend

Mỗi backend cần VIP trên giao diện loopback của nó để chấp nhận lưu lượng. Tuy nhiên, chúng không được phản hồi các yêu cầu ARP cho VIP đó, nếu không, chúng sẽ tranh chấp IP với bộ cân bằng tải. Thêm VIP vào loopback:

sudo ip addr add 192.168.1.50/32 dev lo

Sau đó, yêu cầu kernel giữ im lặng về IP này trên mạng:

sudo sysctl -w net.ipv4.conf.all.arp_ignore=1
sudo sysctl -w net.ipv4.conf.all.arp_announce=2
sudo sysctl -w net.ipv4.conf.lo.arp_ignore=1
sudo sysctl -w net.ipv4.conf.lo.arp_announce=2

Các mẹo tối ưu cho môi trường Production

1. Tự động hóa kiểm tra sức khỏe với Keepalived

Bản thân ipvsadm khá “thụ động”. Nó sẽ tiếp tục gửi lưu lượng đến một máy chủ đã bị sập. Hãy sử dụng Keepalived để giám sát các backend của bạn. Nó thực hiện các bài kiểm tra sức khỏe định kỳ (như kết nối TCP hoặc HTTP GET) và tự động cập nhật bảng ipvs nếu một node gặp sự cố.

2. Chọn thuật toán phù hợp

  • rr (Round Robin): Tốt nhất nếu tất cả backend có phần cứng giống hệt nhau.
  • wlc (Weighted Least Connections): Lựa chọn mặc định thông minh. Nó gửi lưu lượng đến các máy chủ có ít công việc đang xử lý hơn.
  • sh (Source Hashing): Cần thiết nếu bạn cần duy trì phiên (session persistence) dựa trên địa chỉ IP của khách hàng.

3. Giám sát số liệu thống kê thời gian thực

Sử dụng cờ stats để xác định các vấn đề về thông lượng hoặc lỗi cấu hình:

sudo ipvsadm -ln --stats

Nhìn vào cột “OutPkts”. Nếu bạn đang ở chế độ DR và con số này trên bộ cân bằng tải bằng không, thì cấu hình của bạn đang hoạt động chính xác — các backend đang tự xử lý lưu lượng đầu ra.

4. Lưu ý về Firewall

LVS can thiệp vào kernel trước nhiều chuỗi iptables. Nếu bạn gặp bế tắc, hãy tạm thời tắt ufw hoặc firewalld để xác nhận logic định tuyến hoạt động. Sau khi xác nhận, bạn có thể thêm các quy tắc cụ thể để cho phép lưu lượng truy cập trên các cổng VIP và máy chủ thực.

Việc chuyển cân bằng tải vào kernel với LVS giúp giảm độ trễ và tiết kiệm CPU cho ứng dụng của bạn. Nó vẫn là một công cụ cốt lõi cho bất kỳ cơ sở hạ tầng nào yêu cầu thông lượng lớn và ổn định trên Linux.

Share: