У меня установлен 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. Затем он получил следующий запрос (который не является «инициализирующим», поэтому не должен привязываться к выбранному внутреннему серверу. ), и вместо этого оно было отправлено на другой сервер.
По сути, моя проблема: как реализовать отказоустойчивость только по первому запросу? Любой другой запрос должен всегда привязываться к выбранному внутреннему серверу.