четверг, 14 июля 2016 г.

Настройка Bonding в режиме Active-backup на CentOS

1. В директории /etc/sysconfig/network-scripts/ создадим файл ifcfg-bond0 с таким содержанием:

DEVICE=bond0
IPADDR=
NETMASK=
NETWORK=
BROADCAST=
GATEWAY=
DNS1=
DNS2=
BONDING_OPTS=miimon=100 mode=active-backup
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
NM_CONTROLLED=no
IPV6INIT=no

Значения поставьте свои.


2. Меняем содержимое /etc/sysconfig/network-scripts/ifcfg-eth0 на:

DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
HWADDR=
NM_CONTROLLED=no
USERCTL=no
MASTER=bond0
SLAVE=yes

3. Меняем содержимое /etc/sysconfig/network-scripts/ifcfg-eth1 на:

DEVICE=eth1
ONBOOT=yes
BOOTPROTO=none
HWADDR=
NM_CONTROLLED=no
USERCTL=no
MASTER=bond0
SLAVE=yes

4. Перезапускаем сетевые интерфейсы:

#/etc/init.d/network restart







Немного теории если интересно.

Ethernet bonding — это объединение нескольких сетевых каналов в один. Главным образом используется для обеспечение избыточности и балансировки нагрузки. Я обычно объединяю в бондинг интерфейсы там, где обычно присутствующий на сервере второй сетевой интерфейс не используется явным образом. Модуль ядра в линукс поддерживает несколько типов бондинга.

mode=0 (balance-rr) — Передача ведется через каждый доступный интерфейс последовательно (по кругу). Обеспечивает балансировку нагрузки и отказоустойчивость.

mode=1 (active-backup) — Передача ведется через один интерфейс, другой (или другие) интерфейс начинает работать только когда первый интерфейс выходит из строя.

mode=2 (balance-xor) — Нагрузка распределяется согласно формуле (MAC отправителя XOR MAC получателя)% интерфейсов. Получается что каждый интерфейс зависит от определенного MAC адреса получателя, чем и достигается равномерное распределение нагрузки.

mode=3 (broadcast) — Передача ведется через все интерфейсы при этом обеспечивается балансировки нагрузки.

mode=4 (802.3ad) — Классическая агрегация каналов 802.3ad. При этом требуется чтобы коммутатор поддерживал 802.3ad и драйвера сетевых интерфейсов поддерживали восстановление скорости и дуплекса.

mode=5 (balance-tlb) — Исходящий трафик распределяется согласно текущей нагрузке между каждым интерфейсом, входящий же получает только один (активный) интерфейс.

mode=6 (balance-alb) — Обеспечивается балансировка нагрузки передачи и приема IPv4 через ARP. Необходима возможность изменять MAC интерфейса.

Установка 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               632200

Настройка интерфейса.

Поднимаем интерфейс:

# 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 выглядит следующим образом:

# ifconfigbond0     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:0xdc00eth1      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:0xcc00lo        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): 3000Slave Interface: eth0
MII Status: up
Link Failure Count: 0
Permanent HW addr: XX:XX:XX:XX:XX:XXSlave 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): 3000Slave Interface: eth0
MII Status: up
Link Failure Count: 0
Permanent HW addr: XX:XX:XX:XX:XX:XXSlave 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): 3000Slave Interface: eth0
MII Status: down
Link Failure Count: 1
Permanent HW addr: XX:XX:XX:XX:XX:XXSlave 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