Агрегирование сетевых интерфейсов (bonding) в Ubuntu (обновлено 18.11.15)

Почти каждый сталкивался с ситуацией, когда поиск неисправности или сбоя после длительных мучений заканчивается обнаружением вытащенной вилки электропитания, отошедшего штекера, окисления контактов или другой мелочи. Если для обычной рабочей/домашней машины это чревато просто потеренным временем, то в случае, если компьютер используется в качестве сервера, это может привести к неприятным последствиям.

Если от сбоя дисковой подсистемы можно предохраниться использованием RAID, то для защиты от сбоя сетевого оборудования используют агрегацию каналов (или бондинг (bonding)). Как и в случае с RAID, существуют различные режимы, рассчитанные на увеличение пропускной способности или просто на включение второго канала в случае отказа первого. Например, при физическом случайном отключении кабеля из свитча, его обрыва / окисления контактов коннектора или банального выхода из строя сетевой карты. Я рассмотрю режим balance-xor, который можно считать оптимальным выбором в случае, когда необходимо  как сбалансировать нагрузку между интерфейсами и при этом защититься в случае отказа одного из каналов. Стоит сразу отметить, что данный режим должен поддерживаться на «другой стороне», т.к. управляемым свитчем / другим сервером, поэтому если у вас нет такого оборудования, вам скорее подойдет режим balance-alb, который (говоря простым языком)  «притворяется» одним интерфейсом для системы. Подробнее по режимам очень хорошо рассказано здесь.

  1. Установим поддержку агрегации:

sudo apt-get install ifenslave ethtool

и добавим ее в файл  /etc/modules для старта вместе с системой:

sudo  nano /etc/modules   (или любой ваш любимый редактор вместо  nano), куда ставим следующую строку:

bonding mode=2 miimon=100

и сохраняем. В данном случае, mode=2 — это наш режим balance-xor, для упомянутого выше balance-alb будет 6. Параметр miimon=100 указывает, что проверка работоспособности портов будет происходить каждый 100мс. Другие параметры тоже описаны по ссылке выше. Например, если объединенных интерфейсов будет 2, то нужно указать параметр  max_bonds=2

После этого вносим правки в /etc/network/interfaces согласно вашей конфигурации. Для Debian 8 читайте ниже! У меня выглядит примерно так:

auto lo
iface lo inet loopback

auto bond0
allow-hotplug bond0
iface bond0 inet static
address 10.10.16.5
netmask 255.255.255.0
gateway 10.10.16.254
dns-nameservers 10.10.16.1
dns-search site.local
up /sbin/ifenslave bond0 em1
up /sbin/ifenslave bond0 em2

где bond — наш агрегированный интерфейс из em1 и em2 — сетевых интерфейсов (обычно eth0 и eth1).

 

upd: Как оказалось, в Debian 8 этот способ уже не работает, поэтому нужно немного изменить interfaces. Этот же конфигурационный файл  примет такой вид:

auto lo
iface lo inet loopback

auto bond0
allow-hotplug bond0
iface bond0 inet static
address 10.10.16.5
netmask 255.255.255.0
gateway 10.10.16.254
dns-nameservers 10.10.16.1
dns-search site.local

# Отличия здесь:

slaves em1 em2
bond_mode 2
bond_miimon 100

Данный способ даже более аккуратен и должен работать  в других новых дистрибутивах.

После внесения правок перезагружаемся или же, выполняем сразу:

sudo modprobe bonding mode=2 miimon=100  (загружаем модуль)

sudo /etc/init.d/networking restart

Смотри ifconfig появился ли у нас bond0. Так же можем воспользоваться командой

ifenslave -a

Более детальную информацию можно посмотреть выводом

cat /proc/net/bonding/bond0

Вот так выглядит вывод, когда «все хорошо»:

Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: load balancing (xor)
Transmit Hash Policy: layer2 (0)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: em1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: хх:хх:хх:хх:хх:хx
Slave queue ID: 0

Slave Interface: em2
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: хх:хх:хх:хх:хх:хy
Slave queue ID: 0

А вот так, в случае отключения одного из кабелей:

Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: load balancing (xor)
Transmit Hash Policy: layer2 (0)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: em1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: хх:хх:хх:хх:хх:хх
Slave queue ID: 0

Slave Interface: em2
MII Status: down
Speed: Unknown
Duplex: Unknown
Link Failure Count: 4
Permanent HW addr: хх:хх:хх:хх:хх:хy
Slave queue ID: 0

Обратите внимание на выделенное полужирными в сравнении с предыдущим выводом.

Описанная настройка осуществлялась в Ubuntu 14.04 LTS

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *