Який типовий метод масштабування балансира завантаження програмного забезпечення?


22

Я часто бачу архітектури веб-додатків із SLB / reverse-proxy перед купою серверів додатків.

Що станеться, коли кількість підключень до SLB вимагає занадто багато ресурсів, щоб одна SLB ефективно працювала? Для конкретного, але найвищого прикладу розглянемо 2 мільйони стійких HTTP-з'єднань. Очевидно, що один SLB не може впоратися з цим.

Яка рекомендована конфігурація для масштабування з більш SLB?

Чи типово створювати групу / кластер LBs? Якщо так, як розподіляється навантаження клієнтів між групою LB?


z8000, Ви можете сказати, який програмний балансир завантаження ви використовуєте? Крім того, якщо можливо, який алгоритм / протокол він використовує для балансування навантаження.
Мартін

Я не маю переваги. Я оновив питання, щоб було зрозуміліше.
z8000

Мені незрозуміло, чому балансир навантаження по суті не може обробити 2 мільйони стійких HTTP-з'єднань.
живіт

Відповіді:


10

Балансири навантажень не можна легко змінити за допомогою інших балансирів навантаження, оскільки в ланцюзі десь буде підтримуватися один балансир навантаження, де підтримуються з'єднання. Однак, балансири, такі як LVS або HAProxy, мають абсурдні можливості в діапазоні Gbps. Після того, як ви вийдете за межі можливостей одного балансира навантаження (програмне забезпечення, апаратне забезпечення, будь-яке інше), вам потрібно буде перейти до інших методів, таких як DNS-круїн DNS.


Правильно! Наявність єдиного ЛБ - "проблема". Я згоден, що пропускна здатність взагалі не буде проблемою. Але мене турбують інші ресурси, такі як ОЗУ, які в моєму випадку обмежені. Є лише стільки з’єднань, які можна розмістити на одному SLB до вичерпання оперативної пам'яті.
z8000

HAProxy може підтримувати близько 20k-60k активних сеансів на ГБ оперативної пам’яті. Я вважаю, що LVS може зробити набагато більше, оскільки збережених даних сеансу менше. Якщо у вас не вистачає оперативної пам’яті, то оновіть її або побудуйте інший балансир навантаження, який перебуває в системі DNS з круглим завантаженням.
Хіпі

1
"Балансири навантажень не можна легко змінити за допомогою інших балансирів навантаження" - насправді один балансир навантаження на базі ASIC часто може бути розміщений перед парою балансирів навантаження L7 на основі HTTP з відмінними результатами. Той самий основний принцип застосовується і для програм, що реалізуються лише для програмного забезпечення, наприклад, LVS Linux перед nignx.
Jesper M

19

Гаразд, вже є прийнята відповідь, але є що додати .. Найпоширенішими "класичними" способами масштабування рівня балансира навантаження є (не в конкретному порядку):

  • DNS Round Robin для розміщення кількох IP-адрес для домену. Для кожної IP-адреси застосовуйте високодоступну серверну пару (2 сервери, що працюють над тим, щоб підтримувати роботу однієї IP-адреси постійно). Кожна IP-адреса відповідає одному кластеру балансирування навантажень, використовуючи прилади або сервери з програмним забезпеченням балансування навантаження. Масштабуйте горизонтально, додаючи по мірі необхідності більше пар балансира навантаження.

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

  • Шар балансирів навантаження рівня IP перед шаром балансирів навантаження рівня HTTP . Врівноваження навантаження IP-шару може бути реалізовано в ASIC / кремнію і може бути швидко злим для деяких речей. Таким чином, одна пара балансира навантаження IP може часто «йти в ногу» з кількома балансирами навантаження на рівні HTTP / HTTPS і забезпечувати багатогігабітні рівні продуктивності, зберігаючи архітектуру приємною та простою.

Поглиблений глибокий шлях до різних способів вимагає дуже довгої відповіді. Але загалом масштабувати рівень збалансованості навантажень не так важко , але набагато складніше масштабувати рівень сервера додатків і особливо рівень рівня баз даних.

Незалежно від того, чи вибираєте ви фактор форми пристрою (F5, Cisco, A10) або загальний сервер (програмне забезпечення Windows / Linux +), важливіше значення. Основні міркування при зменшенні шару балансира навантаження:

  • Повна держава проти громадянства. Вам абсолютно потрібні липкі сеанси, чи можна жити без? Не дотримання стану робить все простішим.
  • "Апаратне забезпечення" (ASIC) та "програмне забезпечення" (сервери загального призначення) для збалансування навантаження. Кожен має свої плюси і мінуси, дивіться документацію з огляду HAProxy, що пов'язана вище.
  • Врівноваження навантаження L3 / 4 (IP / TCP / IP) порівняно з балансуванням навантаження L7 (HTTP) . Знову плюси і мінуси, HAProxy doc забезпечує хороший огляд.
  • Закінчення SSL , де на веб-вузлах або на балансирі навантаження.

Як правило, вам не потрібно турбуватися з цього приводу, перш ніж ваш веб-сайт стане дуже великим - єдиний сучасний сервер з fx nginx буде обробляти десятки тисяч простих запитів HTTP в секунду. Тому не робіть передчасної оптимізації, не займайтеся цим, перш ніж вам доведеться.


Насправді вам не потрібно, щоб кожна IP-адреса була високодоступною за допомогою DNS RR. Загалом, браузери повернуться до іншого IP-адреси, якщо вони доступні, коли вони не зможуть підключитися. Але якщо у вас є загальнодоступні веб-сервіси, вам знадобиться HA для кожної IP-адреси, оскільки багато бібліотек веб-служб не оброблять невідповідність іншим IP-адресам автоматично.
rmalayter

9

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

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

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

Правда, те, що я тут описую, реалізувати набагато складніше, ніж те, що описано в інших відповідях, але це справді найсучасніший, якщо у вас є веб-сайт із високою торгівлею людьми з великими проблемами масштабованості та вимогами щодо доступності понад 99,9% . За умови, що у вас вже є інженер мережевого типу інженер на борту, налаштування та запуск (як у capex, так і opex) коштує менше, ніж прилади для балансування навантажень, і його можна масштабувати далі майже без додаткових витрат (порівняно з придбанням нового, навіть більше дорогий прилад, коли ви переростаєте поточну модель).

Перша стратегія: з брандмауером

Імовірно, у вас є пара маршрутизаторів, на яких підключені ваші Інтернет-провайдери. Ваш Інтернет-провайдер надає 2 посилання (активне / пасивне, використовуючи VRRP). На своїх маршрутизаторах ви також використовуєте VRRP, і ви спрямовуєте трафік, що йде у вашу загальнодоступну мережу, на брандмауер. Брандмауери ( FW 1і FW 2нижче) також є активними / пасивними, і вони фільтруватимуть трафік та відправлятимуть кожен потік на здоровий інтерфейсний сервер (ваші балансові навантаження HTTP FE 1та FE 2нижче).

      + -------------- + + -------------- +
      | Маршрутизатор ISP A | | Маршрутизатор ISP B |
      + -------------- + + -------------- +
             | |
           == # ====================== # == (громадська мережа)
             | |
      + --------------- + + --------------- +
      | Ваш маршрутизатор A | | Ваш маршрутизатор B |
      + --------------- + + --------------- +
             | |
           == # ===== # ========== # ===== # == (приватна мережа RFC 1918)
             | | | |
       + ------ + + ------ + + ------ + + ------ +
       | FW 1 | | ЗВ 1 | | ЗВ 2 | | FW 2 |
       + ------ + + ------ + + ------ + + ------ +

Мета полягає в тому, щоб потік виглядав так:

  1. Інтернет-провайдер здійснює маршрутизацію трафіку до вашого IP-адреси до вашого активного маршрутизатора.
  2. Ваші маршрутизатори направляють трафік на VIP, який використовує адресу RFC 1918 . Цей VIP належить активному брандмауеру, як і VRRP. Якщо ви використовуєте OpenBSD для своїх брандмауерів, тоді ви можете використовувати CARP , не патентовану альтернативу VRRP / HSRP.
  3. Ваш брандмауер застосовує фільтр (наприклад, "дозволити лише 80 / tcp та 443 / tcp для цієї конкретної IP-адреси").
  4. Ваш брандмауер також діє як маршрутизатор і пересилає пакети до здорового інтерфейсу.
  5. Ваш інтерфейс припиняє TCP-з'єднання.

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

Ваш брандмауер знає список фронтів ( FE 1і FE 2), і він вибере один із них, виходячи з певного аспекту потоку (наприклад, шляхом хешування джерела IP та порту, серед інших заголовків). Але також потрібно переконатися, що він перенаправляє трафік на здоровий інтерфейс, інакше ви будете переробляти трафік. Наприклад, якщо ви використовуєте OpenBSD, ви можете використовувати relayd. Щоrelaydце просто: він перевіряє всі ваші інтерфейси (наприклад, надсилаючи їм запит HTTP-зонда), і коли фронтенд здоровий, він додає його до таблиці, яку брандмауер використовує для вибору наступного скаку пакетів заданого потоку. . Якщо інтерфейс не проводить перевірки стану здоров'я, його видаляють зі столу і більше не надсилаються пакети. Під час переадресації пакету на фронтленд все брандмауер робить підміну міняючої MAC-адресою пакета таким чином, щоб він був обраний на фронтенді.

На кроці 5 пакети від користувача отримує ваш балансир завантаження (будь то лак, nginx або інше). На даний момент пакет все ще призначений для вашої загальнодоступної IP-адреси, тому вам потрібно псевдоніми ваших VIP-адрес на інтерфейсі петлі. Це називається DSR (Direct Server Return), оскільки ваші інтерфейси припиняють TCP-з'єднання, і міжмережевий екран між ними бачить тільки симплексний трафік (лише вхідні пакети). Ваш маршрутизатор буде направляти вихідні пакети безпосередньо до маршрутизаторів провайдера. Це особливо добре для HTTP-трафіку, оскільки запити, як правило, менші, ніж відповіді, іноді суттєво. Просто для того, щоб бути зрозумілим: це не є специфікою для OpenBSD і широко використовується на веб-сайтах з високою торгівлею людьми.

Отримав:

  • Кінцеві користувачі безпосередньо підключаться до ваших серверів інтерфейсу, оскільки ви використовуєте DSR. Можливо, це вже було так, але якщо цього не було, потрібно переконатися, що вони забезпечені належним чином.
  • Якщо ви використовуєте OpenBSD, будьте обережні, що ядро ​​є однопоточним, тому продуктивність одного ядра CPU обмежить пропускну здатність брандмауера. Це може бути проблемою в залежності від вашого типу NIC та швидкості передачі, яку ви бачите. Існують способи вирішення цієї проблеми (докладніше про це нижче).

Друга стратегія: без брандмауера

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

Вам знадобляться маршрутизатори, які підтримують ACL на порт L3 / L4, BGP та ECMP та маршрутизацію на основі політики (PBR). Тільки маршрутизатори високого класу підтримують ці функції, і вони часто мають додаткові ліцензійні плати за використання BGP. Зазвичай це все-таки дешевше, ніж апаратні балансири навантаження, а також набагато простіше масштабувати. Хороша річ у цих маршрутизаторах високого класу - це те, що вони мають тенденцію до лінійної швидкості (наприклад, вони завжди можуть максимізувати посилання навіть на інтерфейсах 10GbE, оскільки всі рішення, які вони приймають, зроблені апаратно ASIC).

На портах, на яких у вас є посилання на Інтернет-провайдера, застосуйте ACL, який раніше знаходився в брандмауері (наприклад, "дозволяти лише 80 / tcp та 443 / tcp для цієї конкретної IP-адреси"). Потім дозвольте кожному з ваших фронталів підтримувати сеанс BGP разом із маршрутизатором. Ви можете використовувати відмінний OpenBGPD (якщо ваші фронти на OpenBSD) або Quagga . Ваш маршрутизатор передасть трафік на здорові кордони (тому що вони підтримують свої сеанси BGP). Маршрутизатор також буде належним чином відправляти трафік за допомогою PBR.

Удосконалення

  • З рішенням пара брандмауера добре, якщо ви можете синхронізувати стан TCP через брандмауері, так що коли один брандмауер виходить з ладу, все перестає плавно переходити на інший. Ви можете досягти цього за допомогою pfsync.
    • Майте на увазі, що pfsyncзазвичай удвічі збільшуватиметься частота пакетів ваших брандмауерів.
    • HTTP - це протокол без стану, тому це не кінець світу, якщо ви скинете всі з'єднання під час відмови від брандмауера, оскільки ви не використовуєте pfsync.
  • Якщо ви переростите один брандмауер, ви можете використовувати ECMP на своєму маршрутизаторі, щоб спрямувати трафік на більш ніж пару брандмауерів.
  • Якщо ви використовуєте більше однієї пари брандмауера, ви можете також зробити їх активними / активними. Цього можна досягти, якщо брандмауери підтримують сеанс BGP з маршрутизаторами, як і потрібні фронтендам, щоб вони підтримували другу програму без брандмауерів.

Зразок relaydконфігурації

Дивіться також HOWTO за адресою https://calomel.org/relayd.html

vip = "1.2.3.4" # Ваша загальнодоступна IP-адреса
               # (можна мати більше одного, але цього не потрібно)
fe1 = "10.1.2.101"
fe2 = "10.1.2.102"
fe3 = "10.1.2.103"
fe4 = "10.1.2.104" # Ви можете мати будь-яку кількість фронтенів.
int_if = "em0"
table <fe> {$ fe1 повторити 2, $ fe2 повторити 2, $ fe3 повторити 2, $ fe4 повторити 2}
table <fallback> {127.0.0.1}

перенаправлення веб-трафіку {
        слухати на $ vip порт 80
        тайм-аут сесії 60
        маршрут до <fe> перевірити http "/healthcheck.html" дайджест "(sha1sum Healthcheck.html)" інтерфейс $ int_if
}

2

Особисто я переходжу до більш простих, менш налаштованих апаратних балансирів навантаження - такі речі, як ACE / ASA компанії Cisco, ливарні сервісні залізи, можливо, навіть Zeus ZXTM (SW LB, розроблений для дуже великих навантажень).


Іншими словами масштабироваться до ? Такий LB все ще буде розміщуватися на деякій кількості з'єднань (тощо). Що тоді? Це справді моє запитання. Спасибі!
z8000

1
Насправді великі сайти просто використовують безліч важких LB, які працюють під якоюсь формою DNS-кругозора - це досить добре на даний момент для більшості і може обробити сотні мільйонів з'єднань. Це сказав, що виникає питання, чому так багато з’єднань потрібно залишатись відкритими звичайно ...
Chopper3

Це внутрішній RRDNS ви маєте на увазі? Акуратний, я про це не думав. Re: відкриті з’єднання ... Я вивчаю варіанти програми, яка вимагає надсилання оновлень підключеним клієнтам протягом певного часу, оскільки події відбуваються десь на бекенді. Я розірваний між користувацьким сервером TCP або безліччю відкритих HTTP-з'єднань за SLB. Дякую за ваші коментарі.
z8000

Я думаю, що це повинен бути зовнішній RRDNS. Наприклад, Twitter.com використовує RRDNS для вирішення та розповсюдження запитів до одного з багатьох великих LB, який потім розподіляє навантаження на сервери.
Роберт

Так, Роберт, ти маєш рацію, наприклад, ми використовуємо коробки Cisco GSS, щоб робити RR від сайту до сайту.
Chopper3

1

Можливо, замість того, щоб постійно підтримувати стільки відкритих з’єднань, щоб надсилати відповіді, кодуйте вашу програму таким чином, щоб клієнти періодично опитували ваші сервери так часто, як це необхідно?

Чи все, що ви робите, насправді вимагає відповіді в цю саму мілісекунду чи може клієнт чекати 15/20 секунд до наступного періоду опитування?


0

Типовим підходом було б створення кластера, достатньо великого для обробки необхідного навантаження, та використання SLB, який може робити детерміновану балансування навантаження (у випадку стійких з'єднань).

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


Те, що ви заявляєте про коропа, настільки далеко від того, як він працює, я не знав би з чого почати! + -0 для згадування IPVS.
3моло

@ 3molo ... так? див. net.inet.carp.arpbalance за адресою linux.com/archive/feed/35482 "..CARP source-хеширует вихідний IP-запит. Хеш потім використовується для вибору віртуального хоста з доступного пулу для обробки запиту . "
Пол
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.