Завантажте балансування UDP-сервера


10

У мене є сервер udp, це центральна частина мого бізнес-процесу. щоб впоратися з навантаженнями, які я очікую у виробничому середовищі, можливо, мені знадобляться 2 або 3 екземпляри сервера. Сервер майже повністю без громадянства, він здебільшого збирає дані, і шар над ним знає, як обробляти мінімальну кількість несвіжих даних, які можуть виникати з декількох екземплярів сервера.

Моє запитання: як я можу реалізувати балансування навантаження між серверами? Я вважаю за краще розподіляти запити максимально рівномірно між серверами. Я також хотів би мати певну вірність, я маю на увазі, якщо клієнт X був спрямований на сервер y, то я хочу, щоб усі наступні запити X переходили на сервер Y, якщо це розумно і не перевантажує Y.

До речі, це система .NET ... що б ви порадили?


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

В даний час я пробую НЛБ MS, він працює добре, це робить справжню справу з коробки, але він створює шум у всій мережі ...

Також немає DNS ... О, це повністю костюмований протокол.


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

Відповіді:


4

У мене є сервер udp, [...] сервер майже повністю без громадянства [..] має деяку вірність, я маю на увазі, якщо клієнт X був переведений на сервер y, то я хочу, щоб усі наступні запити X переходили на сервер Y, як доки це розумно і не перевантажує Y.

Отже, ви використовуєте нерозкритий протокол програми, який зберігає деякий стан програми та працює над UDP? Ти ніби йдеш у важкому напрямку. UDP не є надійним транспортом даних, в цьому і вся суть - для надійного транспортування даних дивіться свого популярного друга TCP. Єдиний спосіб отримати «вірність» - це проксі-балансуючий навантаження, який розуміє протокол вашого додаткового рівня, і який знає, який ваш поточний стан програми, і може діяти відповідно.

Я бачу 3 підходи, які наближаються до того, що ви шукаєте:

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

  • Використовуйте DNS та використовуйте DNS Round Robin, як уже запропонував Метт Сіммонс.

  • Використовуйте вбудовану систему Windows Load балансування (NLB) . Чесно кажучи, я не знаю, як складеться сценарій аварійного режиму з NLB та вашою напівдержавною службою на базі UDP - вам доведеться розслідувати це самостійно, виходячи з того, як працює ваша програма. З іншого боку, NLB дуже легко налаштувати, безкоштовно з ліцензією Windows, зрілим та ефективним.


я відредагував своє запитання
Hellfrost

6

Віртуальний сервер Linux - це масштабований і високодоступний сервер, побудований на кластері реальних серверів. LVS підтримує протокол UDP та алгоритм хешування джерела (це використовується, коли ви бажаєте, щоб клієнт завжди відображався на одному реальному сервері).

Я використовую LVM для врівноваження DNS (rr), SIP (sh).


4

Цікаво. Більшість програмного забезпечення, яке я бачив, - це, правда, на основі TCP.

Більшість збалансованих навантажень для UDP, які я бачив у своєму мізерному досвіді, було засновано на DNS (тобто: сервери часу, DNS-сервери тощо). Чи є спосіб надати кілька записів A? Якщо це буде працювати, звичайний DNS Round Robin забезпечив би справедливий розподіл запитів (напевно, досить справедливий, у будь-якому випадку), а кешування клієнтів забезпечить збереження вірності (якщо припустити, що ви використовуєте платформу, засновану на кеші, на кінцевому рахунку клієнта).


взагалі немає DNS.
Hellfrost

2

Для цього ви можете використовувати будь-який балансир навантаження, апаратний або програмний, ви можете вибрати різні балансири навантаження залежно від того, що вам потрібно.

Балансир навантаження 3 рівня: завантажуватиме баланс лише переглядаючи вхідний IP та наявні резервні IP-адреси; такий тип балансира навантаження забезпечить липкість, завжди надсилаючи ту саму вхідну IP-адресу на той самий бекенд, хоча така стратегія може перевантажувати одну з резервних копій, якщо багато клієнтів приходять з одного IP-адреси (будь то проксі або корпоративний шлюз)

Балансир навантаження рівня 7: Балансир навантаження рівня 7 не тільки збалансуватиметься як балансир рівня 3, але й вивчить вміст пакету, що дасть вам набагато більше гнучкості для вашої політики балансування.

Зважаючи на те, що ви використовуєте UDP, обидва балансири повинні давати хороші показники, також глибока перевірка пакетів в UDP трохи обмежена, ніж у TCP (лише через причини протоколу).

Залежно від бюджету, ви можете почати з використання програмного балансира завантаження (наприклад, Linux + IPVS), а потім почати переходити до апаратних балансирів навантаження, таких як Cisco або Netapp


-1 для частини L7. Шар / Рівень 7 балансування навантаження працює на прикладному рівні - але так як OP використовує UDP, він не використовує звичайний старий HTTP, і він не розкрив , які програми він буде використовувати. Ми не можемо знати, що для використання протоколу OP використовується балансир навантаження L7.
Jesper M

1
Я просто коментував його варіанти в балансирах навантажень, і ми не знаємо, що він використовує над UDP, я думаю, що ви скорочуєте це занадто щільно;)
lynxman

Є щось середнє між NLB / linux та Cisco / netapp: балансоутримувачами KEMP. Ви можете отримати віртуальне видання, яке не коштує тонн грошей, ми його використовуємо, і ми дуже раді.
pauska

2

Відкритий джерело NGINX та платформа доставки додатків, NGINX Plus тепер підтримує балансування навантаження UDP. Нова можливість ґрунтується на наших існуючих можливостях TCP та HTTP, що робить NGINX потужним, простим у використанні та постійним інтерфейсом для ще більшого кола Інтернет-додатків та пристроїв.

Доступний у випуску nginx-1.9.13

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