Зачем bonding
Один сетевой интерфейс - один SPOF. На серверах ставят 2-4 NIC и объединяют:
- High availability - один порт лёг, второй держит линк (active-backup)
- Throughput - 2×10G физически, до 20G на один логический интерфейс (LACP с правильным хэшированием)
- Load balancing - распределить пропускную способность между исходящими сессиями
Linux реализует это через драйвер bonding, создающий bond0 поверх
физических slave'ов. Альтернатива - team (более модульная), но
bonding исторически популярнее.
Режимы
| mode | Имя | Описание |
|---|---|---|
| 0 | balance-rr | round-robin: пакеты по очереди в каждый slave. Хорош для throughput, плох для порядка - reorder вызывает retransmit'ы |
| 1 | active-backup | один активный, остальные standby. Свитч не нужно настраивать. Универсальный default |
| 2 | balance-xor | хэш(src-MAC ^ dst-MAC) → slave. Стабильный «один поток - один путь» |
| 3 | broadcast | всё во все slave'ы. Для special HA-кейсов |
| 4 | 802.3ad (LACP) | агрегация по стандарту, нужен LAG на свитче |
| 5 | balance-tlb | Transmit Load Balancing - исходящий по slave с меньшей загрузкой |
| 6 | balance-alb | то же + входящий через ARP-tricks (без поддержки свитча) |
Самые распространённые: mode 1 (active-backup) для простоты и mode 4 (LACP) для производительности.
active-backup (mode 1)
Простой и универсальный - со свитчем настраивать ничего не надо.
ip link add bond0 type bond mode active-backup miimon 100
ip link set eth0 master bond0
ip link set eth1 master bond0
ip link set bond0 up
ip addr add 10.0.0.5/24 dev bond0
- miimon 100 - проверять линк каждые 100мс через MII (PHY-status)
- При обрыве линка на active slave - failover за ~200мс на backup
- MAC-адрес bond'а = MAC активного slave'а (при failover может смениться - ARP-update в сеть)
LACP (mode 4) - 802.3ad
Стандартный механизм. На свитче настраивается port-channel / LAG с теми же портами:
ip link add bond0 type bond mode 802.3ad miimon 100 \
lacp_rate fast xmit_hash_policy layer3+4
- lacp_rate fast - LACPDU каждую секунду (vs 30с по дефолту)
- xmit_hash_policy layer3+4 - хэш по src/dst IP + порт. Один поток идёт по одному slave'у, разные потоки распределяются.
Важно: один TCP-flow всегда через один slave. То есть от 1 клиента получишь максимум 10G на 2×10G LACP. Несколько клиентов - до 20G.
Hash policy
| xmit_hash_policy | Хэш |
|---|---|
| layer2 | src+dst MAC |
| layer2+3 | + IP-адреса |
| layer3+4 | IP + порт (наиболее распределяет) |
layer3+4 нарушает 802.3ad строго, но в реальности всё работает - свитчам пофиг как ты выбираешь slave для исходящего.
Конфигурация в systemd-networkd
# /etc/systemd/network/10-bond.netdev
[NetDev]
Name=bond0
Kind=bond
[Bond]
Mode=802.3ad
LACPTransmitRate=fast
TransmitHashPolicy=layer3+4
MIIMonitorSec=100ms
# /etc/systemd/network/20-bond-eth0.network
[Match]
Name=eth0
[Network]
Bond=bond0
# /etc/systemd/network/30-bond-ip.network
[Match]
Name=bond0
[Network]
Address=10.0.0.5/24
Gateway=10.0.0.1
Bonding + VLAN
Чтобы поднять VLAN'ы поверх bond'а - сначала bond, потом VLAN:
ip link add bond0 type bond mode 802.3ad
ip link add link bond0 name bond0.10 type vlan id 10
Получаешь LACP-агрегацию + теги [[vlan-and-trunk|802.1Q]] поверх.
Bonding + bridge
В виртуализации (KVM, libvirt): bond + bridge - стандартная
конфигурация. VM'ы видят br0, наружу через bond:
eth0 ──┐
├─ bond0 ── br0 ── (vnetX к VM'кам)
eth1 ──┘
Когда что-то пошло не так
- LACP не сходится - на свитче LAG не настроен / не active mode.
Проверить:
cat /proc/net/bonding/bond0показывает per-slave LACP-state - Нет роста throughput - один TCP-flow, hash policy layer2. Сменить на layer3+4 + несколько потоков
- Failover медленный - miimon слишком велик; ставь 100ms
- MAC меняется при failover - использовать
fail_over_mac=active(новый MAC) илиfail_over_mac=follow(всегда MAC primary) - Bridge поверх bond ругается -
net.ipv4.conf.all.arp_filter=1илиarp_ignore=1нужны на bonding-интерфейсе