Рейтинг:1

HAProxy 2.0 — повторные попытки некоторых запросов на основе URL

флаг jp

У меня установлен HAProxy версии 2.0.14, и я ищу своеобразный вариант использования, который мне пока не удалось правильно настроить.

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

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

Пока у меня следующий конфиг:

Глобальный
   журнал 127.0.0.1 len 10000 local2 отладка
   chroot /var/lib/haproxy
   пользовательский прокси
   группа haproxy
   демон
   lua-загрузить /opt/LUA/myparser.lua

   сокет статистики /etc/haproxy/haproxysock уровень администратора

значения по умолчанию
   журнал глобальный
   опция httplog
   опция
   режим http
   тайм-аут подключения 5000
   тайм-аут клиента 50000
   тайм-аут сервера 50000
   log-format "IP-адрес клиента: порт = [%ci:%cp], Время начала = [%tr], Имя внешнего интерфейса = [%ft], Имя внутреннего интерфейса = [%b], Сервер внутреннего интерфейса = [%s], Время для получения полного запроса = [%TR мс], время ответа = [%Tr мс], код состояния = [%ST], считанных байтов = [%B]"

внешний чатgw_front
   привязать *:8776

   опция http-buffer-request
   объявить запрос на захват len 40000
   http-запрос захват req.body id 0
   захват http-запроса req.hdrs len 2048

   http-запрос track-sc0 src таблица my_back
   use_backend my_back

бэкэнд my_back
   круговой баланс

   тип палочки-таблицы string len 32 размер 30k срок действия 30m
   придерживаться таблицы "lua.parseId" my_back

   сервер server1 x.x.x.1:8080 проверить
   сервер server2 x.x.x.2.8080 проверка

Это означает, что если выбранный внутренний сервер не отвечает в течение 50 секунд, он выдает клиенту тайм-аут шлюза HTTP 504. Вместо этого мне нужно, чтобы, если это первый запрос в сеансе, затем (и только тогда) отработка отказа на другой внутренний сервер. Мы можем сказать, что это первый запрос на основе URL-адреса.

Я попытался изменить бэкэнд следующим образом:

бэкэнд my_back
   круговой баланс

   тип палочки-таблицы string len 32 размер 30k срок действия 30m
   придерживаться таблицы "lua.parseId" my_back

# Проверяем, является ли это запросом "init": в этом случае URL содержит "/init"
   acl is_init path_sub /init

# В случае запроса «init» включить повторную отправку на другой внутренний сервер в случае сбоя
   опция повторной отправки, если is_init

# В случае других запросов (не "init"), мы уже привязаны к выбранному внутреннему серверу из-за сеансового cookie, поэтому отключите повторную отправку
   нет опции повторной отправки, если !is_init

   сервер server1 x.x.x.1:8080 проверить
   сервер server2 x.x.x.2.8080 проверить

Однако я получил точно такое же поведение. Поэтому я попытался добавить «повторную попытку»:

бэкэнд my_back
   круговой баланс

   тип палочки-таблицы string len 32 размер 30k срок действия 30m
   придерживаться таблицы "lua.parseId" my_back

   acl is_init path_sub /init

   опция повторной отправки, если is_init

   нет опции повторной отправки, если !is_init

   повторная попытка соединения с ошибкой пустой ответ тайм-аут ответа

   сервер server1 x.x.x.1:8080 проверить
   сервер server2 x.x.x.2.8080 проверка

Теперь все по-другому: он попытался выполнить первоначальный запрос 4 раза на одном и том же сервере, а затем вернул HTTP 504. Затем он получил следующий запрос (который не является «инициализирующим», поэтому не должен привязываться к выбранному внутреннему серверу. ), и вместо этого оно было отправлено на другой сервер.

По сути, моя проблема: как реализовать отказоустойчивость только по первому запросу? Любой другой запрос должен всегда привязываться к выбранному внутреннему серверу.

Ответить или комментировать

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