Кластер (практичне керівництво) :: Channel bonding

Розглянемо більш докладно яким чином з декількох мережевих інтерфейсів можна створити один віртуальний швидкісний канал.

Для збільшення ефективної пропускної здатності мережі кластера рекомендується використовувати так зване зв'язування каналів або channel bonding Для збільшення ефективної пропускної здатності мережі кластера рекомендується використовувати так зване "зв'язування каналів" або channel bonding. Це такий спосіб об'єднання вузлів кластера в мережу, коли кожен вузол під'єднується до комутатора більш ніж одним каналом. Щоб досягти цього, вузли треба оснастити або декількома мережевими платами, або багатопортовими платами Fast Ethernet. Зв'язати можна і гігабітні канали. Зв'язування каналів аналогічно режиму транкинга при з'єднанні комутаторів, який використовується для збільшення швидкості передачі даних між двома або кількома комутаторами. Застосування зв'язування каналів в вузлах під управлінням ОС Linux дозволяє організувати рівномірний розподіл навантаження прийому / передачі між відповідними каналами.

Channel bonding пораждает деякі проблеми пов'язані з вибором комутаторів і їх налаштування. Комутатор повинен вміти працювати з пов'язаними каналами інакше можуть відбуватися всілякі помилки при побудові комутатори таблиць маршрутизації пакетів або таблиць MAC-адрес. Тобто, як уже було згадано раніше, в якості сетів обладнання треба вибирати такий ethernet switсh, який підтримує для своїх портів функції Link Aggregation або IEEE 802.3ad. Іншим рішенням проблеми я вляется вибір комутатора з можливістю підтримки режиму віртуальних локальних мереж (VLAN). Застосування VLAN покликане допомогти уникнути "дублювання" у внутрішніх таблицях комутаторів MAC-адрес багатопортових мережевих плат. Втім, є повідомлення, що і підтримка VLAN не завжди допомагає, ви можете спробувати цей варіант, але на свій страх і ризик.

Замість використання спеціалізованого мережевого устаткування, що підтримує зв'язування каналів, можна розділити канали за допомогою подвійного (потрійного і т.д.) набору звичайних хабів або світчей на непересічні мережеві сегменти таким чином, щоб кожен канал утворював свою власну мережу, фізично не пов'язану з мережами інших каналів.

Організація в системі мережевого ітерфеса за методом channel bonding досить проста. Потрібно тільки слідувати одному правилу. Усі приєднані машини повинні мати однаковий набір bonded networks, тобто не можна в одній машині використовувати 2х100BaseTx, а в інший 10Base і 100BaseTx. Режим роботи мережевих карт теж повинен бути однаковий. Іншими словами, неприпустимий варіант, коли одна карта працює в full duplex, а інша в напівдуплексному режимі. У кожній же окремій машині можна встановлювати карти різних виробників, але працюють обов'язково в одному стандарті. Channel bonding вимагає наявності як мінімум двох фізичних підмереж. Але, при бажанні пов'язаний канал можна побудувати на основі трьох або більше мережевих карт.

Для зв'язування мережевих карт в один канал (одну віртуальну карту) необхідно або скомпілювати ядро ​​системи з підтримкою cannel bonding, або завантажити в систему модуль ядра bonding.o.

У Linux починаючи з ядер 2.4.x channel bonding є стандартною включається опцією.Наприклад в дистрибутиві Alt Linux Master 2.2 channel bonding поставляється в вигляді завантаження модуля ядра.

Для конфігурації пов'язаного каналу вам буде потрібно стандартна команда ifconfig і, можливо, додаткова команда ifenslave. Програма 'ifenslave' копіює установки першого інтерфейсу на всі інші додаткові інтерфейси. Цією ж командою можна при бажанні будь-які інтерфейси конфігурувати в режимі Rx-only.

Покажемо процес налаштування channel bonding на прикладі використання двох мережевих карт. Мережевий інтерфейс для першої карти повинен бути заздалегідь сконфігурен і повністю працездатний. Для додавання в систему другої карти і об'єднання її з першої в пов'язаний канал потрібно виконати деякі досить прості дії. Попередньо бажано остановть мережеві інтерфейси вашої системи за допомогою команди

/etc/rc.d/init.d/network stop

Після цього переходимо власне до конфігурації пов'язаного каналу. Для початку вам потрібно змінити файл /etc/modules.conf, додавши в нього наступний рядок.

alias bond0 bonding

Зроблене нами додавання говорить системі про те, що при завантаженні необхідно завантажити модуль bonding.o, який впізнається так само по АЛІАС bond0. Щоб не перезавантажувати систему, вручну завантажимо модуль:

modprobe bonding

Тепер йдемо в каталог / etc / sysconfig / network-scripts і перейменовуємо файл опису нашого першого інтерфейсу ifcfg-eth0 в ifcfg-bond0:

cp ifcfg-eth0 ifcfg-bond0

Отриманий нами файл ifcfg-bond0 ми повинні відредагувати так, щоб він прийняв приблизно такий вигляд:

DEVICE = bond0
IPADDR = 192.168.1.1
NETMASK = 255.255.255.0
NETWORK = 192.168.1.0
BROADCAST = 192.168.1.255
ONBOOT = yes
BOOTPROTO = none
USERCTL = no

Природно ви повинні вказати свої власні ip-адреса, маску, адреса мережі та broadcast замість 192.168.1 тощо. Треба зауважити, що ми не видаляла ніяких рядки з цього файлу, просто зробили зміни в потрібних місцях і може бути додали щось. Таким чином ми створили файл опису нашого віртуального мережевого інтерфейсу. Наступним кроком буде створення файлів опису для двох наших реальних фізичних інтерфейсів eth0 і eth1, в яких ми вкажемо, що вони входять до складу пов'язаного каналу. Файли ifcfg-eth0 і ifcfg-eth1 у нас повинні мати наступне вміст:

файл ifcfg-eth0 файл ifcfg-eth1 DEVICE = eth0 DEVICE = eth1 USERCTL = no USERCTL = no ONBOOT = yes ONBOOT = yes MASTER = bond0 MASTER = bond0 SLAVE = yes SLAVE = yes BOOTPROTO = none BOOTPROTO = none

Тепер нам залишилося тільки підняти мережевий інтерфейс виконавши команду

/etc/rc.d/init.d/network start

Якщо дистрибутив вашої системи не дозволяє застосовувати master / slave нотифікацію при конфігурації мережевих інтерфейсів, то вам доведеться піднімати інтерфейс пов'язаного каналу вручну, використовуючи наступну послідовність команд:

/ Sbin / ifconfig bond0 192.168.1.1 up netmask 255.255.255.0 / sbin / ifenslave bond0 eth0 / sbin / ifenslave bond0 eth1

Відповідно замість 192.168.1.1 ви повинні використовувати той ip-адреса, який вам потрібен, і вказати правильну маску підмережі; наведені вище рядки тільки приклад. Щоб не виконувати ці команди вручну кожен раз, запишіть їх у який-небудь startup-скрипт, наприклад в /etc/rc.d/rc.local, або замініть ними ту частину скрипта /etc/rc.d/init.d/network , яка відповідальність за підняття мережевого інтерфейсу.

Як ви помітили, для ручного підняття інтерфейсу ми використовували команду ifenslave. Це не стандартна системна команда. Програма ifenslave була розроблена в рамках проекту Beowulf і вам доведеться скомпілювати її з вихідних кодів, які ви можете взяти безпосередньо на сайті проекту http://beowulf.org/software/ifenslave.c або з сайту проекту Debian: ifenslave_0.07.orig.tar.gz , ifenslave_0.07-1.diff.gz . Природно, все це ви можете знайти в розділі Download цього сайту. Компіляція програми відбувається за допомогою такої команди:

gcc -Wall -Wstrict-prototypes -O -I / usr / src / linux / include ifenslave.c -o ifenslave

Не забудьте тільки покласти отриманий виконуваний файл в / usr / sbin.

Якщо з якихось причин вам потрібно, щоб всі мережеві драйвери були завантажені до завантаження bonding-драйвера, додайте нижче наведену рядок в файл /etc/modules.conf. Ця інструкція вкаже системі, що в разі підняття інтерфейсу bond0 утиліта modprobe повинна спочатку завантажити драйвери для всіх ваших мережевих інтерфейсів.

probeall bond0 eth0 eth1 bonding

Власне на цьому настройка channel bonding закінчена. Якщо мережевий інтерфейс піднявся без помилок, то перевірити цей знаменний факт можна використовуючи звичайну команду ifconfig. Запустивши її без параметрів ви повинні побачити щось подібне:

[Root] # / sbin / ifconfig bond0 Link encap: Ethernet HWaddr 00: C0: F0: 1F: 37: B4 inet addr: 192.168.1.1 Bcast: 192.168.1.255 Mask: 255.255.255.0 UP BROADCAST RUNNING MASTER MULTICAST MTU 1500 Metric : 1 RX packets: 7224794 errors: 0 dropped: 0 overruns: 0 frame: 0 TX packets: 3286647 errors: 1 dropped: 0 overruns: 1 carrier: 0 collisions: 0 txqueuelen: 0 eth0 Link encap: Ethernet HWaddr 00: C0: F0: 1F: 37: B4 inet addr: 192.168.1.1 Bcast: 192.168.1.255 Mask: 255.255.255.0 UP BROADCAST RUNNING SLAVE MULTICAST MTU 1500 Metric: 1 RX packets: 3573025 errors: 0 dropped: 0 overruns: 0 frame: 0 TX packets: 1643167 errors: 1 dropped: 0 overruns: 1 carrier: 0 collisions: 0 txqueuelen: 100 Interrupt: 10 Base address: 0x1080 eth1 Link encap: Ethernet HWaddr 00: C0: F0: 1F: 37: B4 inet addr: 192.168 .1.1 Bcast: 192.168.1.255 Mask: 255.255.255.0 UP BROADCAST RUNNING SLAVE MULTICAST MTU 1500 Metric: 1 RX packets: 3651769 errors: 0 dropped: 0 overruns: 0 frame: 0 TX packets: 1643480 errors: 0 dropped: 0 overruns : 0 carrier: 0 collisions: 0 txqueuelen: 100 Interrupt: 9 Ba se address: 0x1400 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: 1110 Отримати errors: 0 dropped: 0 overruns: 0 frame: 0 TX packets: 1110 Отримати errors: 0 dropped: 0 overruns: 0 carrier: 0 collisions: 0 txqueuelen: 0

Якщо ви побачили щось подібне на екрані монітора, можете себе привітати, ви успішно сконфигурировали пов'язаний канал. Як бачите, ip- і MAC-адреси всіх мережевих інтерфейсів у нас вийшли однаковими. Щоб switch міг нормально працювати з таким каналом вам необхідно налаштувати Link Aggrigation. Як це робити ви можете прочитати в документації вашого комутатора. Для різних моделей коммутатров і різних версій їх програмного забезпечення це може робитися по-різному. Тому в даній книзі ми опустимо питання настройки Link Aggrigation на комутаторах.

В інтернеті зустрічаються повідомлення, що в деяких випадках, після підняття віртуального мережевого інтерфейсу додаткові канали не можуть відразу відповісти на вхідний покети. Це може статися через те, що новий MAC-адресу додаткових каналів не прописується фізично в EPROM мережевої карти, в результаті чого при старті комп'ютера свитч не знає про те, що цей MAC-адресу приєднаний до більш ніж одному порту. Для того, щоб повідомити свитчу правильний набір MAC-адрес досить нпосредственно після підняття інтерфейсу виконати кілька пінгів. Після того, як ICMP-пакети пройдуть через комутатор по всім віртуальним каналам, внутрішня таблиця комутатора прийме правильний вид і надалі проблем з прийомом пакетів не буде.

Дополнительная информация

rss
Карта