Как добавить постоянную поддержку соединения в веб-сервис HTTP с балансировкой нагрузки

Мы работаем над 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 ответа

Решение

С помощью balance source в defaults блок, наряду с удалением option httpclose записи сделали свое дело.

Вы ищете HAProxy's cookie директива, которая гарантирует, что клиенты придерживаются того же самого бэкэнда.

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

Другие вопросы по тегам