Cấu hình Bonding và Teaming trên Linux: Tăng băng thông và dự phòng failover chuẩn sysadmin

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Khi một sợi cáp mạng kéo sập cả hệ thống

Khoảng 2 giờ sáng, một tiến trình backup 500GB dữ liệu khởi chạy. Ngay lập tức, đường truyền 1Gbps của card mạng đơn kịch tải 100%. Toàn bộ kết nối vào database nghẽn cứng, API timeout liên tục. Tệ hơn, nếu cổng mạng trên switch đột tử hoặc ai đó vô tình quẹt rơi đầu bấm RJ45, máy chủ của bạn sẽ biến mất khỏi hệ thống trong chớp mắt.

Điểm chết mạng (SPOF) ở tầng vật lý luôn là cơn ác mộng. Để xử lý rủi ro này, giải pháp tiêu chuẩn là gộp từ 2 đến 4 card mạng vật lý (NIC) thành một giao diện logic duy nhất. Thiết lập này mang lại hai lợi ích trực tiếp: tăng gấp đôi băng thông truyền tải và tự động kích hoạt card dự phòng trong vài chục mili-giây nếu xảy ra sự cố.

So sánh thực chiến: Bonding hay Network Teaming?

Cộng đồng quản trị Linux cung cấp hai công cụ chính: Bonding truyền thống và Network Teaming.

Bonding: Bền bỉ, trực tiếp từ Kernel Space

Bonding đã phục vụ Linux suốt hơn hai thập kỷ qua kernel module bonding.ko. Ưu điểm lớn nhất của nó là tính phổ biến. Dù bạn chạy Ubuntu, Debian, Alpine hay CentOS cũ, Bonding luôn hoạt động ổn định mà không cần cài thêm package bên ngoài.

Trước đây, Bonding bị xem là kém linh hoạt vì mọi thay đổi cấu hình đều nằm ở kernel space. Tuy nhiên, kể từ RHEL 9, Red Hat đã chính thức khuyến nghị quay lại dùng Bonding và ngừng phát triển mới (deprecated) cho Teaming. Lý do là nhân Linux hiện đại đã tối ưu hiệu năng của Bonding vượt trội hơn trước.

Teaming: Kiến trúc tách biệt hướng tới Module hóa

Network Teaming (chạy qua daemon teamd) xử lý dữ liệu ở kernel nhưng đẩy logic điều khiển ra userspace. Nhờ đó, việc cấu hình qua JSON trở nên trực quan hơn. Nó cũng hỗ trợ các thuật toán kiểm tra link nâng cao như arp_ping hay nsna_ping cho IPv6.

Nếu hệ thống của bạn đang vận hành trên RHEL 7, RHEL 8 hoặc CentOS Stream 8, Teaming vẫn là lựa chọn chạy rất mượt.

4 chế độ hoạt động cần nắm vững

  • active-backup (Mode 1): Tại một thời điểm, chỉ một card mạng truyền tải dữ liệu. Cổng thứ hai ở trạng thái chờ. Nếu cổng chính đứt link, cổng phụ tiếp quản ngay sau khoảng 100ms. Phù hợp nhất cho máy chủ database cần độ sẵn sàng cao (HA).
  • round-robin (Mode 0): Gói tin được phân phối tuần tự lần lượt qua các cổng. Băng thông lý thuyết tăng gấp đôi. Lưu ý: Chế độ này dễ gây xáo trộn thứ tự gói tin (packet reordering) trên các luồng TCP, làm giảm hiệu suất đường truyền nếu switch không hỗ trợ tối ưu.
  • 802.3ad / LACP (Mode 4): Chuẩn gộp đường truyền doanh nghiệp cao cấp nhất. Cả server lẫn switch cùng đàm phán phân tải qua giao thức LACP. Bạn cần cấu hình Port-Channel trên switch Cisco/Juniper trước khi bật chế độ này.
  • balance-tlb / balance-alb (Mode 5 & 6): Tự cân bằng tải theo địa chỉ MAC/ARP mà không đòi hỏi switch phải cấu hình đặc biệt.

Hướng dẫn thực hành bằng nmcli

Giả sử server vật lý của bạn có hai card mạng chưa dùng là enp1s0 và enp2s0. Mục tiêu là gộp chúng thành một giao diện mạng duy nhất có IP tĩnh 192.168.1.150/24.

Phương án 1: Triển khai Linux Bonding (Khuyên dùng cho mọi distro hiện nay)

Tạo giao diện ảo bond0 với chế độ active-backup, chu kỳ kiểm tra link (miimon) 100ms:

sudo nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=active-backup,miimon=100"

Gán hai card mạng vật lý vào nhóm bond0:

sudo nmcli connection add type ethernet con-name bond0-port1 ifname enp1s0 master bond0
sudo nmcli connection add type ethernet con-name bond0-port2 ifname enp2s0 master bond0

Cấu hình IP tĩnh, gateway và DNS cho bond0:

sudo nmcli connection modify bond0 ipv4.addresses 192.168.1.150/24 \
  ipv4.gateway 192.168.1.1 \
  ipv4.dns "1.1.1.1 8.8.8.8" \
  ipv4.method manual

Kích hoạt bond cùng các cổng thành viên:

sudo nmcli connection up bond0
sudo nmcli connection up bond0-port1
sudo nmcli connection up bond0-port2

Lưu ý an toàn: Khi thao tác trên máy chủ từ xa qua SSH, tuyệt đối không cấu hình trực tiếp trên card mạng bạn đang dùng để đăng nhập. Chỉ thao tác qua dải IP quản trị out-of-band (iLO, iDRAC) hoặc cổng console cứu hộ để tránh tự khóa mình ra ngoài.

Kiểm tra trạng thái liên kết trực tiếp từ kernel:

cat /proc/net/bonding/bond0

Tại dòng Currently Active Slave, hệ thống sẽ chỉ rõ card nào đang truyền tải dữ liệu chính.

Phương án 2: Triển khai Network Teaming với teamd

Nếu đang chạy RHEL/Rocky Linux 8, hãy cài đặt các gói phụ trợ:

sudo dnf install -y teamd NetworkManager-team

Tạo kết nối team0 với runner activebackup:

sudo nmcli connection add type team con-name team0 ifname team0 config '{"runner": {"name": "activebackup"}}'

Thêm hai cổng mạng vật lý vào nhóm:

sudo nmcli connection add type team-slave con-name team0-port1 ifname enp1s0 master team0
sudo nmcli connection add type team-slave con-name team0-port2 ifname enp2s0 master team0

Gán IP và khởi động giao diện:

sudo nmcli connection modify team0 ipv4.addresses 192.168.1.150/24 ipv4.gateway 192.168.1.1 ipv4.method manual
sudo nmcli connection up team0
sudo nmcli connection up team0-port1
sudo nmcli connection up team0-port2

Kiểm tra trạng thái bằng teamdctl:

sudo teamdctl team0 state

Thử nghiệm thực tế: Kịch bản đứt cáp đột ngột

Để kiểm chứng độ tin cậy, hãy mở một máy client khác trong cùng mạng LAN và chạy lệnh ping liên tục:

ping -i 0.2 192.168.1.150

Trên server, giả lập sự cố đứt cáp bằng cách tắt card mạng đang hoạt động chính (ví dụ enp1s0):

sudo ip link set dev enp1s0 down

Nhìn vào kết quả ping từ client: Kết nối chỉ rớt đúng 1 gói hoặc hoàn toàn liền mạch không mất gói nào (0% packet loss). Cổng enp2s0 lập tức nhận cờ active.

Khi khôi phục lại cổng mạng chính:

sudo ip link set dev enp1s0 up

Hệ thống tự động đưa cổng trở lại danh sách sẵn sàng mà không gây biến động đường truyền.

Tóm lược

Dự phòng mạng vật lý không chỉ bảo vệ server trước các sự cố đứt cáp ngớ ngẩn mà còn là nền tảng sống còn cho cụm hạ tầng Production. Nếu triển khai hệ thống mới trên Ubuntu, Debian hoặc RHEL 9+, hãy ưu tiên Bonding với nmcli để đảm bảo độ tương thích dài hạn. Trường hợp hạ tầng sẵn có trên RHEL 8 đang chạy ổn định với teamd, bạn hoàn toàn có thể tiếp tục duy trì cho tới vòng đời nâng cấp tiếp theo.

Share: