Поскольку у меня есть большой пул сертификатов https, который меняется изо дня в день (массивное многопользовательское приложение с множеством доменов), у меня есть сценарий, который может перезагружать haproxy почти в случайное время. Это прекрасно работает.
Я также установил для внутренних серверов значение MAINT, когда я развертываю на них новые версии приложений. Это тоже отлично работает.
Проблема в том, что если происходит перезагрузка, все серверы, для которых я установил статус MAINT, вместо этого перезагружаются как READY. Это позволяет клиентам видеть ожидания или даже сообщения об ошибках.
Есть ли способ сохранить текущий статус внутренних серверов при перезагрузке haproxy?
Не уверен, какую версию вы используете, следующие потребности HAProxy
>= 1.6~
:
Возможно, вы захотите взглянуть на загрузить состояние сервера из файла директива, которая позволяет
бесшовная перезагрузка HAProxy.
Эта директива указывает HAProxy на файл, в котором было сохранено состояние сервера из предыдущего запущенного процесса. Таким образом, при запуске, перед обработкой трафика, новый процесс может применять старые состояния к серверам, если не произошло перезагрузки. [...]
(Это всего лишь отрывок, подробности по ссылке.)
Используя это, ваша конфигурация может выглядеть (показаны только соответствующие части):
global
server-state-file /var/lib/haproxy/server-state
stats socket /var/lib/haproxy/stats
defaults
load-server-state-from-file global
Тогда ваша команда перезагрузки может выглядеть следующим образом:
socat /var/lib/haproxy/stats - <<< \"show servers state\" > /var/lib/haproxy/server-state && systemctl reload-or-restart haproxy
То есть:
stats
сокет через socat
, получить состояния серверов и / или бэкэндов и записать в файл состояний.HAProxy
.