Как добавить поддержку постоянных соединений в веб-службу HTTP с балансировкой нагрузки - PullRequest
3 голосов
/ 26 октября 2011

Мы работаем над HTTP-балансировкой нагрузки веб-сервиса с помощью haproxy. Доступ к веб-сервису осуществляется через SSL. Это RESTful HTTP-сервис, который просто принимает JSON, выполняет некоторую работу и возвращает JSON. Понятие сеанса отсутствует.

У нас есть резервные балансировщики нагрузки, установленные перед парой избыточных серверов веб-сервисов. Каждый сервер находится за Apache, где Apache используется в качестве прокси-сервера для обработки SSL и ведения журналов. Если это имеет значение, наш веб-сервис - это приложение Clojure (java), использующее compojure (jetty) для обработки HTTP.

Это краткая диаграмма, показывающая путь запроса клиента через нашу существующую систему.

client request -> haproxy (load balancing) -> apache (ssl, logging) -> webservice

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

Как бы вы порекомендовали нам это сделать? Как мы можем «закрепить» данное соединение с балансировщиком нагрузки на конкретном сервере веб-сервиса? Как мы можем предотвратить случайную загрузку определенного сервера веб-сервиса с несколькими интенсивными запросами?

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

Использование balance source в блоке defaults и удаление option httpclose записей сделали свое дело.

1 голос
/ 26 октября 2011

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

В тех, что мы делаем, бэкэнд выглядит так в haproxy.cfg:

backend examplesite
cookie STK insert indirect nocache maxidle 30m maxlife 8h
server server1 192.168.0.1:80 cookie n1
server server2 192.168.0.2:80 cookie n2

Это установит cookie с именем STK в первом запросе.Haproxy автоматически присвоит этому cookie значение, которое затем будет использовано для отправки последующих запросов на тот же узел.

Мы решили также добавить префиксы cookie n1 и n2 ... это означает, чток значению cookie будет добавляться n1, если запросы направляются на узел 1, или n2, если они направляются на узел 2. Это очень полезно при отладке.


В любом случае яРекомендуем взглянуть на документацию конфигурации вокруг cookie параметров.

Возможно, вы также захотите взглянуть на параметр appsession.Это позволяет HAProxy использовать существующий файл cookie (например, ASPNetSessionId или PHPSESSIONID) для той же цели.

У меня были проблемы с ним раньше, но недавно я получил ответ на вопрос о сбое сервера, который должен решить эту проблему.Вы можете попробовать, так как он экономит, используя дополнительный файл cookie в ваших запросах. Не удается настроить настройку appsession в HAProxy .

...