2014-11-18 9 views
4

Текущая ситуация: Я написал сервер приложений C#, которые взаимодействуют с некоторыми приложениями (компьютер/смартфон/сеть). Теперь у меня есть проблема, что сервер приложений должен иметь дело с большим количеством запросов, и это будет очень медленно.Балансировщик нагрузки как прокси-сервер или перенаправитель

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

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

+0

Вы не можете использовать существующие инструменты? Облачные сервисы обеспечивают балансировку нагрузки для вас (Microsoft Azure, Amazon EC2, Google Cloud) ... –

+2

Сторона примечания: «и это будет очень медленно» - вы действительно пытались измерить? Понятно, что вы ищете (поскольку писать балансировщик нагрузки, который формирует трафик, основанный на загрузке серверов, очень интересен и должен создавать сложный и интересный для наблюдения/отладки/тестовый код), но на самом деле вам, вероятно, будет лучше с выключенным - решение для балансировки нагрузки на шельфе. –

+0

Да, я могу использовать существующие инструменты. Я просто подумал, что лучше реализовать его как собственный модуль на моем сервере приложений. Спасибо! – BendEg

ответ

5

На самом деле есть готовые продукты, которые выполняют именно то, что вы ищете, один из самых установленных - HAProxy, который действует как прокси-сервер нагрузки HTTP/TCP/HA, он может выбирать подходящие серверные на предыдущих клиентских запросах (например, cookie-insertion, он поддерживает другие методы), который, я считаю, делает именно то, что вам нужно.

вернуться к вопросу,

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

Прокси-реализация - это нормальный маршрут, и перенаправление не является такой хорошей идеей и вызывает некоторые проблемы, вызывающие беспокойство на специальных браузерах на стороне клиента (например, закладки не будут работать по назначению), и я бы сказал, что это не будет иметь большого выигрыша используя прокси (кроме удаления узла балансировки нагрузки при балансировке это будет сделано на client-side)

, что я не знаю, как писать балансировки нагрузки

Короткий ответ вам не нужно писать свой собственный, как я уже говорил есть хорошо зарекомендовавшие себя продукты в этой области, однако, если вы хотите написать свой собственный HAProxy Architecture manual и Writing a load balancer proxy from ground up, это будет хорошим началом.

2

Перенаправление изменило бы URL-адрес для конечного пользователя, что обычно не очень хорошо.

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

Для вашей ситуации я бы рекомендовал встроенную балансировку сетевой нагрузки Microsoft. Он выполняет большую часть случайной балансировки нагрузки, но он выполняет свою работу, и для подавляющего большинства приложений случайное распределение запросов приводит к довольно равномерной нагрузке.

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

3

Ответ на две части:

  1. Вам нужен прокси функциональность, а не редирект или маршрутизатор функцию. Переадресация откроет клиенту IP/URL для вашего сервера backend , которого вы, разумеется, не хотите. Клиенты всегда могут обойти ваш LB, как только они узнают о внутренних адресах. Таким образом, весь трафик должен проходить через прокси.

  2. Я бы не рекомендовал войти в сферу пишущего LB. Его довольно специализированная функция, и есть много бесплатных/коммерческих выпеченных продуктов, которые могут быть развернуты для этого. Вы можете выбрать один из HAProxy, Appache HTTPD, Microsoft NLB, NginX. Каждый из них предлагает выбор конфигурации многих алгоритмов балансировки нагрузки, которые вы, возможно, захотите использовать.

2

Есть готовый к использованию балансировщик нагрузки, такой как Apache + mod_cluster. Конфигурация может быть создана как ... Apache + mod_cluster -> Tomcat1, Tomcat2, Tomcat3, Tomcat4. Вся просьба поступит в Apache + mod_cluster, и если она не статична, чем распределена между Tomcat1, Tomcat2, Tomcat3, Tomcat4. Если запрос является статическим, он будет обрабатывать только Apache. Возможно и желательно настроить сессию Stick.

Главным преимуществом mod_cluster является балансировка нагрузки на стороне сервера. Apache + mod_cluster также может обрабатывать запрос HTTPS.

http://mod-cluster.jboss.org/