Bonding в режиме Active-backup

Thank you for reading this post, don't forget to subscribe!

Настрой­ка про­из­во­дит­ся на CentOS 6.3.

 

  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

 

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

 

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

 

DEVICE=eth0

ONBOOT=yes

BOOTPROTO=none

HWADDR=

NM_CONTROLLED=no

USERCTL=no

MASTER=bond0

SLAVE=yes

 

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

 

DEVICE=eth1

ONBOOT=yes

BOOTPROTO=none

HWADDR=

NM_CONTROLLED=no

USERCTL=no

MASTER=bond0

SLAVE=yes

 

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

 

#/etc/init.d/network restart

 

Долж­но быть active-backup

cat /proc/net/bonding/bond0

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

 

Bonding Mode: fault-tolerance (active-backup)

Primary Slave: None

Currently Active Slave: enp2s0f1

MII Status: up

MII Polling Interval (ms): 100

Up Delay (ms): 0

Down Delay (ms): 0

 

Slave Interface: enp2s0f1

MII Status: up

Speed: 1000 Mbps

Duplex: full

Link Failure Count: 0

Permanent HW addr: 10:1f:74:32:de:54

Slave queue ID: 0

 

Для того что­бы уда­лить интер­фейс из бон­дин­га нужно:

 

  1. Отре­дак­ти­ро­вать кон­фиг сете­вой кар­ты кото­рую необ­хо­ди­мо исключить
  2. Уда­лить дан­ный интер­фейс из онлайн кон­фи­гу­ра­ции бондинга:
  • echo "-<int name>"  >  /sys/class/net/bond0/bonding/slaves
  1. Пере­за­пу­стить служ­бу сети

 

 

Немно­го тео­рии

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               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