Ethernet bonding
Ethernet bonding — это объединение двух или более физических сетевых интерфейсов в один виртуальный для обеспечения отказоустойчивости и повышения пропускной способности.
Установка bonding
В большинстве современных дистрибутивов, драйверы уже присутствуют в ядре Linux в качестве модулей и для удобной работы с Ethernet bonding, желательно установить утилиту управления ifenslave.
# apt-get install ifenslave
Опции драйвера bonding
Опции модуля могут быть заданы как аргументы командной строки или указаны в файлах конфигурации /etc/modules.conf или /etc/modprobe.conf.
Существуют два способа диагностирования (мониторинга) связанности:
- с помощью статуса Media Independent Interface (MII);
- с помощью ARP-запросов и ответов.
miimon — определяет как часто производится мониторинг MII. 0 – мониторинг отключён (используется по-умолчанию). Рекомендуемое значение 100 мс.
arp_interval — с какой периодичностью в миллисекундах осуществлять ARP-мониторинг. Значение 0 — ARP-мониторинг выключен.
arp_ip_target — IP-адрес, по которому осуществлять ARP-мониторинг (в случае если значение arp_interval больше 0). Если с данного адреса нет ARP-ответов, значит канал, по которому посылались запросы, не работает.
downdelay — задержка в миллисекундах с момента, как было обнаружено, что связь утеряна, до момента, как данный канал перестанет быть активным. Задержка нужна, чтобы отфильтровывать кратковременные сбои. Например, после переключения кабеля. По-умолчанию используется значение 0 – нет задержки.
updelay — то же самое, что и downdelay, но определяет задержку по включению. На случай, когда сетевой коммутатор (switch) или концентратор (hub) "не до конца включились", напряжение на порт подано, а пакеты не принимаются.
max_bonds — определяет количество bond-интерфейсов, которые будут созданы при загрузке одного модуля. Значение по-умолчанию — 1.
primary — указывает подчинённый интерфейс (eth0, eth1 и прочие), который будет основным в связке. Указанный интерфейс всегда будет работать в активном режиме, когда это возможно. Особенно актуально это, когда скорость одного интерфейса больше других. Опция primary доступна только для режима active-backup.
primary_reselect — определяет условия выбора активного подчинённого интерфейса:
- always или 0 — первичный подчинённый интерфейс всегда становится активным, когда это возможно;
- better или 1 — интерфейс становится активным, если скорость и duplex-режим больше, чем скорость и дуплексный режим активного интерфейса;
- failure или 2 — интерфейс становится активным лишь в случае, когда текущий активный интерфейс становится недоступным.
Параметр primary_reselect не учитывается в двух случаях:
- если нет активных подчинённых интерфейсов, то первичный интерфейс всегда становится активным;
- при первоначальном создании bond-связки, первичный интерфейс всегда становится активным.
Режимы bonding
Round-robin balance. Этот режим используется по-умолчанию. Пакеты передаются последовательно в циклическом порядке с первого до последнего интерфейса из bonding-группы. В случае подключения сервера к разным коммутаторам, требуется их настройка. Режим обеспечивает распределение нагрузки и отказоустойчивость.
Active-backup. Активен только один интерфейс из группы, остальные находятся в режиме ожидания, при его отказе, на замену подключается другой интерфейс из группы. Режим применяется для повышения отказоустойчивости.
XOR. В этом режиме физический интерфейс для передачи пакетов вычисляется по формуле:
( source XOR destination ) % n_slaves
где:
- source — MAC-адрес отправителя;
- destination — MAC-адрес получателя;
- n_slaves — число работающих интерфейсов в bonding-е.
Интерфейс, отправляющий пакет зависит от MAC-адреса получателя, каждый физический сетевой интерфейс отправляет пакеты только определённой группе MAC-адресов, тем самым обеспечивая распределение нагрузки.
Broadcast. Широковещательный режим. Все пакеты передаются через все интерфейсы, что обеспечивает отказоустойчивость.
IEEE 802.3ad Dynamic link aggregation. Динамическое объединение соединений. В группы объединяются одинаковые по скорости и дуплексному режиму интерфейсы. Все интерфейсы используются одновременно в соответствии со спецификацией IEEE 802.3ad.
Необходимые условия выполнения:
- поддержка в ethtool определения скорости и дуплексного режима сетевых карт;
- коммутатор, поддерживающий стандарт IEEE 802.3ad Dynamic link aggregation.
Adaptive transmit load balancing. Адаптивная балансировка передачи. Исходящий трафик распределяется в соответствии с текущей нагрузкой (в зависимости от скорости) на интерфейсах.
Необходимые условия выполнения:
- поддержка в ethtool определения скорости и дуплексного режима сетевых карт.
Adaptive load balancing. Включает в себя balance-tlb плюс балансировку на приём (rlb) для IPv4. Не требует применения специальных коммутаторов. Балансировка на приём достигается на уровне протокола ARP. Драйвер перехватывает ARP ответы локальной системы и, в зависимости от загрузки, перезаписывает физический адрес на адрес одного из сетевых интерфейсов.
Настройка bonding при помощи утилиты ifenslave
Рассмотрим пример создания bonding-связки из двух сетевых интерфейсов eth0 и eth1 в режиме active-backup.
Загрузка модуля
# modprobe bonding max_bonds=1 mode=1 primary=eth0 miimon=100 downdelay=3000 updelay=1000
Со следующими параметрами:
- max_bonds=1 — один bond-интерфейс;
- mode=1 — режим active-backup;
- primary=eth0 — первичным подчинённым интерфейсом является eth0;
- miimon=100 — каждые 100мс проверяется состояние подключения интерфейса;
- downdelay=3000 — через три секунды после того как интерфейс теряет соединение, он становится неактивным и на его замену подключается резервный интерфейс;
- updelay=1000 — через одну секунду после того, как появляется соединение на интерфейсе, на него могу посылаться пакеты.
Проверить, что модуль появился:
# lsmod | grep bonding bonding 63220 0
Настройка интерфейса
Поднимаем интерфейс:
# ip link set bond0 up
Назначаем IPv4-адрес:
# ip address add 192.168.0.1/24 broadcast 192.168.0.255 dev bond0
Добавление интерфейсов в bonding
Добавляем интерфейсы в bonding-связку:
# ifenslave bond0 eth0 # ifenslave bond0 eth1
Вывод команды ifconfig выглядит следующим образом:
# ifconfig
bond0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:35759 errors:0 dropped:0 overruns:0 frame:0
TX packets:16381 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:21323250 (20.3 MiB) TX bytes:1322986 (1.2 MiB) eth0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:28148 errors:0 dropped:0 overruns:0 frame:0
TX packets:15823 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:20235049 (19.2 MiB) TX bytes:1286777 (1.2 MiB)
Interrupt:18 Base address:0xdc00 eth1 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:7611 errors:0 dropped:0 overruns:0 frame:0
TX packets:558 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1088201 (1.0 MiB) TX bytes:36209 (35.3 KiB)
Interrupt:16 Base address:0xcc00 lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:284 errors:0 dropped:0 overruns:0 frame:0
TX packets:284 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:66020 (64.4 KiB) TX bytes:66020 (64.4 KiB) Показать информацию через ifenslave обо всех интерфейсах, она достаточна минималистична:
# ifenslave -a The result of SIOCGIFFLAGS on lo is 49. The result of SIOCGIFADDR is 00.00.7f.00. The result of SIOCGIFHWADDR is type 772 00:00:00:00:00:00. The result of SIOCGIFFLAGS on eth0 is 1843. The result of SIOCGIFADDR is 00.00.ffffffc0.ffffffa8. The result of SIOCGIFHWADDR is type 1 XX.XX.XX.XX.XX.XX. The result of SIOCGIFFLAGS on eth1 is 1843. The result of SIOCGIFADDR is 00.00.ffffffc0.ffffffa8. The result of SIOCGIFHWADDR is type 1 XX.XX.XX.XX.XX.XX. The result of SIOCGIFFLAGS on bond0 is 1443. The result of SIOCGIFADDR is 00.00.ffffffc0.ffffffa8. The result of SIOCGIFHWADDR is type 1 XX.XX.XX.XX.XX.XX.
Посмотреть подробную информацию об интерфейсах можно используя следующую команду cat /proc/net/bondong/<BOND-NAME>, где <BOND-NAME> — название bond-интерфейса:
# cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.5.0 (November 4, 2008)
Bonding Mode: fault-tolerance (active-backup) Primary Slave: eth0 Currently Active Slave: eth0 MII Status: up MII Polling Interval (ms): 100 Up Delay (ms): 1000 Down Delay (ms): 3000
Slave Interface: eth0 MII Status: up Link Failure Count: 0 Permanent HW addr: XX:XX:XX:XX:XX:XX
Slave Interface: eth1 MII Status: up Link Failure Count: 0 Permanent HW addr: YY:YY:YY:YY:YY:YY
Из вывода можно понять об используемом режиме bonding первичного интерфейса, состоянии всех его интерфейсов, входящих в связку, о настройках задержек мониторинга интерфейсов.
Пример поведения bond-интерфейса в режиме active-backup
Рассмотрим ситуацию когда на интерфейсе eth0 пропадает соединение (когда вытащили не тот кабель и вставили обратно):
Начальное состояние интерфейса bond0, созданного с настройками, рассмотренными выше:
# cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.5.0 (November 4, 2008)
Bonding Mode: fault-tolerance (active-backup) Primary Slave: eth0 Currently Active Slave: eth0 MII Status: up MII Polling Interval (ms): 100 Up Delay (ms): 1000 Down Delay (ms): 3000
Slave Interface: eth0 MII Status: up Link Failure Count: 0 Permanent HW addr: XX:XX:XX:XX:XX:XX
Slave Interface: eth1 MII Status: up Link Failure Count: 0 Permanent HW addr: YY:YY:YY:YY:YY:YY
Пропадает сигнал. Через 100 мс мониторинг обнаруживает, что интерфейс eth0 потерял соединение и выставляет:
... MII Status: down ...
Так же отмечается, что было зафиксирована одна потеря соединения на интерфейсе:
... Link Failure Count: 1 ...
В течении 3-х секунд (Down Delay (ms): 3000) выдерживается задержка.
Если за этот промежуток времени соединение восстановлено, то спустя одну секунду задержки:
... Up Delay (ms): 1000 ...
MII Status принимает значение up:
... MII Status: up ...
И работа сетевого bond-интерфейса продолжается без изменений.
Если же за 3 секунды (Down Delay (ms): 3000) соединение не было восстановлено, то происходит активация следующего интерфейса из связки, в данном случае это интерфейс eth1:
# cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.5.0 (November 4, 2008)
Bonding Mode: fault-tolerance (active-backup) Primary Slave: eth0 Currently Active Slave: eth1 MII Status: up MII Polling Interval (ms): 100 Up Delay (ms): 1000 Down Delay (ms): 3000
Slave Interface: eth0 MII Status: down Link Failure Count: 1 Permanent HW addr: XX:XX:XX:XX:XX:XX
Slave Interface: eth1 MII Status: up Link Failure Count: 0 Permanent HW addr: YY:YY:YY:YY:YY:YY
При восстановлении соединения на интерфейсе eth0, так как он является первичным подчинённым интерфейсом в связке, спустя задержку в одну секунду (Up Delay (ms): 1000), происходит его активация на замену текущего активного интерфейса eth1.
Если первичный интерфейс не был задан, то активным интерфейсом остаётся интерфейс eth1 до следующего сбоя соединения. Назначить принудительно первичный интерфейс можно выполнив команду: ifenslave <BOND-NAME> -c <SLAVE-NAME>, где <BOND-NAME> — название bond-интерфейса, а <SLAVE-NAME> — название интерфейса в связке, который станет первичным:
# ifenslave bond0 -c eth0
Удаление интерфейсов из bonding
Удаление производится командой ifenslave <BOND-NAME> -d <SLAVE-NAME>:
# ifenslave bond0 -d eth0
Отключение bonding
Для отключения bonding, необходимо выполнить следующие действия:
- удалить из bonding-связки все интерфейсы:
# ifenslave bond0 -d eth0 # ifenslave bond0 -d eth1
- опустить интерфейс:
# ip link set bond0 down
- выгрузить модуль ядра:
# rmmod bonding
- Владимир Петухов (инженер-программист отдела исследования и разработки <vladimir.petukhov@etegro.com>)
