ИНФОРМАЦИЯ

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

НОВОСТИ

Последние новости