Як саме та конкретно працює хешування 3-го місця призначення адреси LACP?


54

На підставі попереднього питання, що був рік тому ( мультиплексований Ethernet 1 Гбіт / с? ), Я пішов і налаштував нову стійку з новим провайдером з LACP-посиланнями в усьому місці. Це нам потрібно, тому що у нас є індивідуальні сервери (одна програма, один IP), які обслуговують тисячі клієнтських комп'ютерів по всьому Інтернету із сукупністю 1 Гбіт / с.

Ця ідея LACP повинна дозволяти нам зламати бар'єр 1 Гбіт / с, не витрачаючи багатства на 10GoE комутатори та NIC. На жаль, у мене виникли деякі проблеми щодо розподілу вихідного трафіку. (Це, незважаючи на попередження Кевіна Куфаля у вищезазначеному питанні.)

Маршрутизатор ISP - це якась Cisco. (Я вивів це з MAC-адреси.) Мій перемикач - HP ProCurve 2510G-24. А сервери - це HP DL 380 G5s під керуванням Debian Lenny. Один сервер є гарячим режимом очікування. Наш додаток не може бути кластеризованим. Ось спрощена мережева схема, яка включає всі відповідні мережеві вузли з IP-адресами, MAC та інтерфейсами.

alt текст

Хоча в ньому є всі деталі, з цим трохи важко працювати та описувати мою проблему. Отже, для простоти, ось мережева схема, зведена до вузлів та фізичних посилань.

alt текст

Тож я пішов і встановив свій комплект на новій стійці і підключив кабель провайдера від їх маршрутизатора. На обох серверах LACP посилається на мій комутатор, а комутатор має LACP-посилання на маршрутизатор ISP. З самого початку я зрозумів, що моя конфігурація LACP невірна: тестування показало, що весь трафік на та з кожного сервера переходить через одне фізичне посилання GoE виключно між обома серверами-комутаторами та перемикачем на маршрутизатор.

alt текст

З деякими пошуковими функціями Google і великою кількістю RTMF часу щодо NIC-зв’язку Linux, я виявив, що можу керувати NIC-зв’язкою, модифікуючи /etc/modules

# /etc/modules: kernel modules to load at boot time.
# mode=4 is for lacp
# xmit_hash_policy=1 means to use layer3+4(TCP/IP src/dst) & not default layer2 
bonding mode=4 miimon=100 max_bonds=2 xmit_hash_policy=1

loop

Це призвело до того, що трафік залишає мій сервер над обома NIC, як очікувалося. Але трафік рухається від комутатора до маршрутизатора через тільки один фізичний канал, до сих пір .

alt текст

Нам потрібен той трафік, що перетинає обидва фізичні зв’язки. Прочитавши та перечитавши посібник з управління та налаштування 2510G-24 , я знаходжу:

[LACP використовує] адреси адрес-джерела призначення (SA / DA) для розподілу вихідного трафіку по магістральних посиланнях. SA / DA (адреса джерела / адреса призначення) призводить до того, що комутатор розподіляє вихідний трафік посиланнях в межах групи магістралей на основі пар адрес джерела / місця призначення. Тобто комутатор надсилає трафік з однієї адреси джерела на ту саму адресу призначення через ту саму транскрибовану ланку, а трафік з тієї самої адреси джерела на іншу адресу призначення через іншу посилання, залежно від обертання присвоєння шляху серед посилання в багажнику.

Здається, що зв’язане посилання представляє лише одну MAC-адресу, і тому мій шлях від сервера до маршрутизатора завжди буде проходити через один шлях від перемикача на маршрутизатор, оскільки комутатор бачить лише один MAC (а не два - один з кожен порт) для обох посилань LACP.

Зрозумів. Але це те, що я хочу:

alt текст

Дорожчий комутатор HP ProCurve - це 2910al, використовуючи джерела та адреси призначення рівня 3 у своєму хеші. У розділі "Розподіл вихідного трафіку по всім посиланням" Посібника з управління та конфігурації ProCurve 2910al :

Фактичний розподіл трафіку через магістраль залежить від обчислення за допомогою бітів з адреси джерела та адреси призначення. Якщо доступна IP-адреса, обчислення включає останні п'ять бітів IP-адреси джерела та IP-адреси призначення, інакше використовуються MAC-адреси.

ГАРАЗД. Отже, щоб це працювало так, як я хочу, адреса призначення є ключовою, оскільки моя адреса джерела виправлена. Це призводить до мого питання:

Як саме та конкретно працює хешування LACP рівня 3?

Мені потрібно знати, яка адреса призначення використовується:

  • IP клієнта , кінцеве призначення?
  • Або IP маршрутизатора , наступне місце передачі фізичної лінії зв'язку.

Ми ще не вийшли з ладу та купили вимикач для заміни. Будь ласка, допоможіть мені зрозуміти, чи потрібне хешування 3-го місця призначення LACP або не те, що мені потрібно. Придбати інший марний комутатор - це не варіант.


13
Відмінне, добре вивчене питання! На жаль, я не знаю відповіді ...
Дуг Луксем,

Чи можете ви подивитись на вартість прольотного дерева кожного мосту / стовбура на ProCurve?
dbasnett

Також держава та пріоритет? Здається, що коли HP <---> Cisco, то магістралі можуть не мати однакового пріоритету і в кінцевому підсумку блокуються. Реклама для не змішування постачальників ????
dbasnett

6
Це, мабуть, найкраще відформатоване запитання, яке я бачив у
помилках

Я сподіваюся, що хтось може піклуватися про відповідь, як це було визначено на запитання.
Ніл Тропден

Відповіді:


14

Те, що ви шукаєте, зазвичай називається "передача хеш-політики" або "передача хеш-алгоритму". Він контролює вибір порту з групи сукупностей портів, з якими передавати кадр.

Отримати свої руки за стандартом 802.3ad виявилося важким, оскільки я не готовий витрачати на це гроші. Сказавши це, я зміг отримати деяку інформацію з офіційного джерела, яка проливає трохи світла на те, що ви шукаєте. Згідно з цією презентацією 2007 року в Оттаві, штат Офіс , Каліфорнія, IEEE High Speed ​​Study Group, що відповідає стандарту 802.3ad, не передбачено конкретних алгоритмів для "розповсюджувача кадрів":

Цей стандарт не передбачає жодного конкретного алгоритму розподілу; однак будь-який алгоритм розподілу повинен гарантувати, що коли кадри приймаються колектором кадрів, як зазначено в 43.2.3, алгоритм не повинен викликати а) неправильне впорядкування кадрів, що є частиною будь-якої розмови, або б) дублювання кадрів . Вищезазначена вимога підтримувати впорядкованість кадру, забезпечуючи, щоб усі кадри, які складають певну розмову, передавались по одному посиланню в порядку, який вони генеруються клієнтом MAC; отже, ця вимога не передбачає додавання (або зміни) будь-якої інформації до кадру MAC, а також будь-яку буферизацію або обробку з боку відповідного колектора кадрів з метою повторного замовлення кадрів.

Отже, незалежно від алгоритму, який комутатор / драйвер NIC використовує для розподілу переданих кадрів, повинен відповідати вимогам, викладеним у цій презентації (що, імовірно, цитується зі стандарту). Не визначений конкретний алгоритм, визначено лише відповідна поведінка.

Хоча алгоритм не вказаний, ми можемо розглянути конкретну реалізацію, щоб зрозуміти, як може працювати такий алгоритм. Наприклад, у драйвері Linux "bonding" драйвера ядра є сумісна 802.3ad хеш-політика передачі, яка застосовує цю функцію (див. Bonding.txt у довідковому документі \ мережевому каталозі джерела ядра):

Destination Port = ((<source IP> XOR <dest IP>) AND 0xFFFF) 
    XOR (<source MAC> XOR <destination MAC>)) MOD <ports in aggregate group>

Це призводить до того, що IP-адреси джерела та призначення, а також MAC-адреси джерела та місця призначення впливають на вибір порту.

Цільова IP-адреса, яка використовується в цьому типі хешування, буде адресою, яка присутня у кадрі. Подумайте над цим. ІР-адреса маршрутизатора в заголовку кадру Ethernet від вашого сервера до Інтернету ніде не інкапсульована в такому кадрі. MAC-адреса маршрутизатора присутня в заголовку такого кадру, але IP-адреса маршрутизатора не є. IP-адреса призначення, інкапсульована у корисному навантаженні кадру, буде адресою Інтернет-клієнта, який робить запит на ваш сервер.

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

Діаграми показують запити, що надходять безпосередньо на сервери з Інтернету, але варто вказати, що може зробити проксі-сервер у цій ситуації. Якщо ви звертаєтесь до клієнтських запитів до своїх серверів, про що, як говорить Кріс у своїй відповіді, ви можете викликати вузькі місця. Якщо цей проксі-сервер робить запит зі своєї IP-адреси власного джерела, а не з IP-адреси Інтернет-клієнта, у вас буде менше можливих "потоків" у строго шарі 3-хеш-хеш-політики передачі.

Політика хешування передачі також може враховувати інформацію рівня 4 (номери портів TCP / UDP), якщо вона відповідає вимогам стандарту 802.3ad. Такий алгоритм є в ядрі Linux, як ви посилаєтесь у своєму запитанні. Будьте уважні, що документація для цього алгоритму попереджає, що через фрагментацію трафік може необов’язково протікати по тому самому шляху і, як такий, алгоритм не суворо сумісний з 802.3ad.


Так, я розібрав "політику хешування передачі" сервера Linux . (Дуже освітянський досвід, який зробив це питання можливим.) Мене на проклятому перемикачі перебуває в солінні. Дякую за інформацію про IP-кадри - я трохи слабкий із тим, як складаються нижні рівні мережі. На мій погляд, кадр був адресований маршрутизатору, з призначенням глибше корисного навантаження. : P
Стю Томпсон

5

дуже дивно, що кілька днів тому наше тестування показало, що xmit_hash_policy = layer3 + 4 не матиме жодного ефекту між двома безпосередньо підключеними Linux-серверами, увесь трафік буде використовувати один порт. обидва запускають xen з 1 мостом, який має пристрій зв'язку. Очевидно, що міст може спричинити проблему, лише те, що НЕ ВІДМОВУЄ ВСЕ, враховуючи, що хеш-пам'ять на базі ip + буде використовуватися.

Я знаю, що деяким людям вдається пересунути 180MB + через зв’язані посилання (тобто користувачі ceph), тому це взагалі працює. Можливі речі, на які слід звернути увагу: - Ми використовували старий CentOS 5.4 - Приклад ОЗ означав би, що другий LACP "роз'єднує" зв'язки - чи має це сенс коли-небудь?

Що показало мені ця тема та читання документації тощо тощо:

  • Як правило, про це знають багато, добре читати теорію з методів зв'язку або навіть стандартів IEEE, тоді як практичного досвіду майже немає.
  • Документація RHEL в кращому випадку неповна.
  • Документація на облігацію складається з 2001 року і недостатньо актуальна
  • Режим layer2 + 3, мабуть, не в CentOS (він не відображається в modinfo, і в нашому тесті він знизив увесь трафік при включенні)
  • Не допомагає, що SUSE (BONDING_MODULE_OPTS), Debian (-o bondXX) та RedHat (BONDING_OPTS) мають різні способи визначення параметрів режиму облігації
  • Модуль ядра CentOS / RHEL5 є "безпечним для SMP", але не є "SMP здатним" (див. Розмову у Facebook щодо високої продуктивності) - він НЕ масштабується вище одного процесора, тому при приєднанні більш високого тактового процесора> багато ядер

Якщо хтось закінчує гарне високоефективне налаштування зв’язків або справді знає, про що вони говорять, було б приголомшливо, якби їм знадобилося півгодини, щоб написати новий невеликий хаут, який документує ОДИН робочий приклад за допомогою LACP, без дивних речей та пропускної здатності. > одне посилання


Це стає гірше: різні версії Debian мають різні методи налаштування зв'язку! Я фактично задокументував, як налаштовую зв’язок у дописі на блозі, який, схоже, отримує гідний трафік.
Стю Томпсон

2

Якщо ваш комутатор бачить справжнє місце призначення L3, він може хеш на цьому. В основному, якщо у вас є 2 посилання, подумайте, що посилання 1 призначене для непарних нумерованих напрямків, посилання 2 - для цілих нумерованих напрямків. Я не думаю, що вони ніколи не використовують IP-код наступного скаку, якщо не налаштовано так, але це майже те саме, що використовувати MAC-адресу цілі.

Проблема, з якою ви зіткнетеся, полягає в тому, що залежно від вашого трафіку адресою завжди буде єдина IP-адреса одного сервера, тому ви ніколи не будете використовувати це інше посилання. Якщо пунктом призначення є віддалена система в Інтернеті, ви отримаєте рівномірний розподіл, але якщо це щось на зразок веб-сервера, де ваша система є адресою призначення, комутатор завжди буде надсилати трафік лише по одному з доступних посилань.

Ви опинитесь у ще гіршій формі, якщо десь там буде балансир навантаження, адже тоді "віддалений" IP завжди буде IP-адресою балансира навантаження або сервером. Ви могли трохи обійти це, використовуючи безліч IP-адрес на балансирі завантаження та сервері, але це хак.

Ви можете трохи розширити свій горизонт постачальників. Інші постачальники, такі як екстремальні мережі, можуть робити хеш на такі речі, як:

Алгоритм L3_L4 - рівень 3 та рівень 4, комбіновані IP-адреси вихідних та цільових IP-адрес, номери TCP та UDP-портів джерела та призначення. Доступний на комутаторах серій SummitStack та Summit X250e, X450a, X450e та X650.

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

Навіть хешування для IP-джерела та місця призначення буде достатньо, щоб уникнути гарячих точок, доки у вас не буде балансира навантаження в суміші.


Дякую. Без балансування навантаження І мене не турбує вхідний трафік - у нас співвідношення трафіку> 50: 1. (Це веб-відео-додаток.)
Стю Томпсон

Я думаю, що у вашому випадку хеш-адреса не отримає вам нічого, оскільки комутатор буде бачити призначення як ваш сервер. Інженерія трафіку L2 просто не дуже гарна. І "хеш" у такому додатку буде досить примітивним - мабуть, найкраще зробити - це скласти всі біти за будь-якою адресою, і якщо результат 0, перейдіть по одному посиланню або 1 вийди інший.
chris

Як я розумію з вищенаведеної цитати ProCurve 2910al, хеш знаходиться на останніх п'яти бітах джерела та місця призначення. Отже, незалежно від того, чи встановлено один (мій сервер), інший буде змінюватися майже для кожного клієнта на рівні 3 рівня 2? Це моя поточна проблема - проти хешування є лише одне джерело та одна адреса призначення.
Стю Томпсон

0

Я здогадаюсь, що це відключений клієнтський IP, а не маршрутизатор. Реальні вихідні та цільові IP-адреси будуть з фіксованим зміщенням у пакеті, і це швидко зробить хеширование. Захоплення IP маршрутизатора вимагає пошуку на основі MAC, правда?


-1

Оскільки я щойно закінчився тут, я дізнався кілька речей: Щоб уникнути сивини, вам потрібен гідний комутатор, який підтримує політику шару 3 + 4, і те саме в Linux.

У багатьох випадках стандартний вимикач, що називається ALB / SLB (режим 6), може працювати краще. Операційно це смокче, хоча.

Сам я намагаюся використовувати 3 + 4 там, де це можливо, оскільки я часто хочу, щоб пропускна здатність між двома сусідніми системами.

Я також пробував з OpenVSwitch і колись інстанціював, коли цей порушений потік трафіку (втрачається кожен перший пакет ... я поняття не маю)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.