Вопрос: Балансировка нагрузки на UDP-сервер


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

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

Кстати, это .NET-система ... что бы вы порекомендовали?


состояние является внутренним внутри серверов, а не транзакцией какого-либо рода. состояние - это некоторые данные, которые агрегируются сервером из данных, которые они получают, и могут быть связаны с простым WCF WebService. Приложение основано на UDP, и хотя я не согласен с этим решением, его «выше моего уровня оплаты»,

В настоящее время я тестирую NLB MS, он работает нормально, он делает верность из коробки, но он генерирует шум во всей сети ...

Также нет DNS ... О, и это полностью костюмный протокол.


10
2018-01-30 14:24


Источник


Просто примечание для будущей справки - вопросы могут быть перемещены между сайтами stackexchange во многих случаях модераторами и пользователями с высокой репутацией. Это помогает сохранить любые ответы, которые уже были размещены, поэтому он обычно лучше, чем повторное отправление (если нет ответов, и в этом случае удалять старый вопрос, чтобы никто случайно не ответил на него). Если вы согласны с предложением переместить, просто добавьте комментарий к этому эффекту и (если возможно) отметьте свой пост для внимания модератора, и сообщение должно быть перенесено для вас. - bdonlan


Ответы:


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

Итак, вы используете нераскрытый протокол приложения, который поддерживает какое-либо состояние приложения и работает поверх UDP? Вы как бы идете в трудное русло. UDP не является надежным переносом данных, в этом весь смысл - для надежного переноса данных см. его популярный друг TCP. Единственный способ получить свою «верность» - это наличие прокси-сервера для балансировки нагрузки, который понимает ваш протокол уровня приложения и который знает что ваше текущее состояние приложения и может действовать соответствующим образом.

Я вижу 3 подхода, которые приближаются к тому, что вы ищете:

  • Статически распространять входящие соединения на 3 IP-адреса, исходя из источник (конечного пользователя). Таким образом, данный пользователь всегда будет перенаправлен на тот же сервер. Большинство профессиональных брандмауэров могут сделать это за вас. Возможно, вам придется сделать 3 сервера высокодоступными, так как большинство брандмауэров не будут делать проверки работоспособности для вас.

  • Используйте DNS и используйте DNS Round Robin, как уже было предложено Мэттом Симмонсом.

  • Использовать встроенный Windows Балансировка сетевой нагрузки (NLB), Честно говоря, я не знаю, как сценарий перехода на другой ресурс будет воспроизводиться с помощью NLB и вашего полунаселенного сервиса на основе UDP - вам придется исследовать это самостоятельно, основываясь на том, как ваше приложение обрабатывает состояние. С положительной стороны, NLB очень легко настроить, бесплатно с лицензией Windows, зрелым и хорошо работающим.


4
2018-01-31 01:38



я редактировал мой вопрос - Hellfrost


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

Я использую LVM для балансировки DNS (rr), SIP (sh).


6
2018-01-30 14:35





Интересно. Большинство прокси-программ, которые я видел, по общему мнению, основаны на TCP.

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


4
2018-01-30 14:34



DNS вообще отсутствует. - Hellfrost


Вы можете использовать любой балансировщик нагрузки для этого, будь то аппаратное или программное обеспечение, вы можете выбирать из разных балансиров нагрузки на основе того, что вам нужно.

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

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

Учитывая, что вы используете UDP, оба балансиратора должны обеспечивать хорошую производительность, а также глубокая проверка пакетов в UDP немного ограничена, чем на TCP (только по причинам протокола).

В зависимости от вашего бюджета вы можете начать с использования балансировки нагрузки программного обеспечения (например, linux + IPVS), а затем начать работу с балансировщиками оборудования, такими как Cisco или Netapp


2
2018-01-30 14:36



-1 для части L7. Балансировщик уровня Layer / Level 7 работает на уровне приложения - но поскольку OP использует UDP, он не использует простой старый HTTP, и он не раскрыл, какое приложение он является с помощью. Мы не можем знать, что существует балансировка нагрузки L7 для протокола OP. - Jesper Mortensen
Я просто комментировал его варианты в балансировщиках нагрузки, и мы не знаем, что он использует над UDP, я думаю, вы слишком сильно обрезаете это;) - lynxman
Есть что-то между NLB / linux и Cisco / netapp: KEMP loadbalancers. Вы можете получить виртуальную версию, которая не стоит тонны денег, мы ее используем, и мы очень счастливы. - pauska


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

Доступен в выпуске nginx-1.9.13 


2
2018-04-05 13:24