воскресенье, 13 декабря 2009 г.

Обеспечение безотказной работы сети в RedHat Linux (bonding) длянескольких IP сетей



Один из важнейших элементов обеспечения бесперебойной работы ответственных серверов ( работающих по схемам 24/7 или 365/24/7 ) это резервирование сетевых интерфейсов. В самом деле, какой смысл в дорогом оборудовании, RAID 1+0, spare disks, если сервер соединен со свичем через один адаптер, один кабель, один порт? Да и свич тоже может выйти из строя.

Пусть мы имеем следующие исходные параметры:

  • сервер подключен к свичам через два адаптера

  • в нашей сети имеются два диапазона IP адресов - 192.168.1.0/24 и 192.168.2.0/24

  • эти сети разделены при помощи VLAN, ID сетей 10 и 20 соответственно

  • адреса интерфейсов сервера - 192.168.1.10, 192.168.2.10

  • ОС - RedHat 5 или совместимые - CentOS 5, Oracle Linux 5

Хочу обратить внимание. В данном примере (в отличие от классического варианта bonding) нам не нужно удваивать количество сетевых карт - мы будем использовать те, что есть (network teaming). Главное, что карт более одной.


Обязательно наличие прямого доступа к консоли - iLO card, KVM или подобное! Это связано с тем, что после перенастройки свичей и до перенастройки сетевых настроек сервера доступ к серверу через ssh будет невозможен.

Для начала попросим нашего network engineer подать на порты свичей оба VLAN'а, чтобы они были доступны с обоих сетевых адаптеров.

Останавливаем сеть:
# service network stop

После этого настроим сетевые адаптеры для принятия VLAN'ов. Для этого произведем изменения в файлах /etc/sysconfig/network-scripts/ifcfg-eth0 и /etc/sysconfig/network-scripts/ifcfg-eth1. Переходим в каталог /etc/sysconfig/network-scripts/ (нам там предстоит много работы ;) ). В любимом текстовом редакторе комментируем все параметры, за исключением двух - DEVICE и ONBOOT. Т.е. содержимое файлов будет следующим:
=======
ifcfg-eth0:

DEVICE=eth0
ONBOOT=yes

=======
ifcfg-eth1

DEVICE=eth1
ONBOOT=yes

=======


Далее создаем файлы с описанием интерфейсов VLAN. Имена файлов выглядят как: ifcfg-.
Нам нужно будет создать четыре файла (по два на каждый интерфейс): ifcfg-eth0.10, ifcfg-eth0.20, ifcfg-eth1.10, ifcfg-eth1.20

Содержимое данных файлов будет сразу содержать инструкции, позволяющие использовать bonding - обїединение нескольких интерфейсов в один. Сам bonding настраивать будем несколько позже. Сейчас просто берем на заметку, что у нас будет два логических интерфейса bond0 (для обеспечения работы 192.168.1.10) и bond1 (192.168.2.10 соответственно)

Сразу создаем два файла ifcfg-bond0 и ifcfg-bond1 - они нам понадобятся очень скоро.

Итак, возвращаемся к VLAN'ам. Последовательно наполняем содержимым файлики с описанием интерфейсов для VLAN.

=======
ifcfg-eth0.10:

DEVICE=eth0.10
ONBOOT=yes
BOOTPROTO=none
VLAN=yes
TYPE=Ethernet
USERCTL=no
MASTER=bond0
SLAVE=yes

=======
ifcfg-eth0.20:

DEVICE=eth0.20
ONBOOT=yes
BOOTPROTO=none
VLAN=yes
TYPE=Ethernet
USERCTL=no
MASTER=bond1
SLAVE=yes

=======
ifcfg-eth1.10:

DEVICE=eth1.10
ONBOOT=yes
BOOTPROTO=none
VLAN=yes
TYPE=Ethernet
USERCTL=no
MASTER=bond0
SLAVE=yes

=======
ifcfg-eth1.20:

DEVICE=eth1.20
ONBOOT=yes
BOOTPROTO=none
VLAN=yes
TYPE=Ethernet
USERCTL=no
MASTER=bond1
SLAVE=yes

=======

Хочу обратить внимание. При использовании bonding параметр HWADDR в ifcfg-ethX.X и в ifcfg-bondX указывать нельзя, т.к. возникнут проблемы при запуске сети. Однако можно (и иногда нужно) указывать в ifcfg-ethX.

Таким образом, мы привязываем VLAN 10 на bond0, VLAN 20 - на bond1

Последний этап - конфигурирование bond-интерфейсов. Сначала заполняем файлики ifcfg-bond0 и ifcfg-bond1:
=======
ifcfg-bond0

DEVICE=bond0
IPADDR=192.168.1.10
NETWORK=192.168.1.0
NETMASK=255.255.255.0
USERCTL=no
BOOTPROTO=none
ONBOOT=yes

=======
ifcfg-bond1

DEVICE=bond1
IPADDR=192.168.2.10
NETWORK=192.168.2.0
NETMASK=255.255.255.0
USERCTL=no
BOOTPROTO=none
ONBOOT=yes

=======

Но пока не торопимся запускать сеть! Осталось совсем немного - нужно определить параметры модуля bonding.
Для этого идем в /etc/, и редактируем /etc/modprobe.conf. Добавляем туда строки:


alias bond0 bonding
alias bond1 bonding
options bond0 miimon=100 mode=active-backup max_bonds=2
options bond1 miimon=100 mode=active-backup max_bonds=2


В данном случае параметры означают: проверять состояние линков к свичам каждые 100мс, работать в режиме active-standby (одна карта активна, другая подключается только в случае проблем с первой), максимальное количество bond-интерфейсов - два (bond0 и bond1)

Полный список параметров модуля можно найти в документации к ядру или здесь

Ну, настройка собственно завершена. Осталось запустить сеть:
# service network start

Все должно работать.

Состояние виртуальных адаптеров можно посмотреть командой:


# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.2.4 (January 28, 2008)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth0.10
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth0.10
MII Status: up
Link Failure Count: 2
Permanent HW addr: 00:12:34:56:78:90

Slave Interface: eth1.10
MII Status: up
Link Failure Count: 1
Permanent HW addr: 00:12:34:56:78:91



PS. В качестве полезного дополнения крайне рекомендую прочитать также еще одну мою статью на эту же тему. В ней имеются важные дополнения, в частности, как определить primary interface для бондинга (через который идет трафик по умолчанию), что может быть очень важным при использовании множества интерфейсов и VLAN'ов одновременно.

8 комментариев:

  1. Очень качественная статья! Набрел в Гугле, пока искал решение подобной задачи. Очень помогла. Спасибо за работу.

    ОтветитьУдалить
  2. Спасибо. Практически все статьи блога (за исключением 1-2х) - результат собственных исследований, причем проверенных на реальных задачах и реальном железе.

    ОтветитьУдалить
  3. Отличная статья, спасибо. Помогла мне в моих изысканиях.

    Однако я поднял VLANы через bond0.xxx не плодя дополнительных eth0.xxx и т.п.

    И еще, в последних версиях CentOS необязательно править /etc/modprobe.conf, соответственно опции бондинга можно задать в описании интерфеса

    напр.

    BONDING_OPTS="mode=balance-tlb miimon=100"

    ОтветитьУдалить
  4. > Однако я поднял VLANы через bond0.xxx не плодя дополнительных eth0.xxx и т.п.

    Спасибо за идею. Попробую. Я не знал, что так заработает.

    > И еще, в последних версиях CentOS необязательно править /etc/modprobe.conf

    Увы, обязательно. См. http://localhost/linux-unix/43.html
    Без такой правки у меня интерфейсы нормально не поднялись

    ОтветитьУдалить
  5. А у меня почему-то не сработал этот метод.
    Правда при загрузке ОС с моей рабочей станции прошли только два пинга и всё.
    Сервер пингует своих соседей по сети, шлюз по-умолчанию, а вот дальше никуда не идёт.
    Куда копать - ума не приложу.

    ОтветитьУдалить
  6. Шлюз задан в файле: /etc/sysconfig/network

    ОтветитьУдалить
  7. Если шлюз пингуется - значит, почти наверняка, сеть на машине настроена верно. нужно смотреть в сторону маршрутизации. А именно:
    - локальные таблицы маршрутов
    - правильность имен интерфейсов
    - настройки маршрутизации на шлюзе и "за ним"

    Если бы сеть не работала, шлюз бы тоже был недоступен

    ОтветитьУдалить
  8. Да, ОБЯЗАТЕЛЬНО стоит прочесть продолжение:
    http://localhost/linux-unix/43.html

    ОтветитьУдалить