Назад | Перейти на главную страницу

Сохранять статус внутреннего сервера при перезагрузке haproxy

Поскольку у меня есть большой пул сертификатов 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.