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

Всегда сохраняйте состояние сервера HAProxy перед остановкой

Иногда мы отключаем определенные серверы в HAProxy (работающем на RedHat 7, но скомпилированном локально, потому что 1.8 недоступен в RedHat) с помощью сокета администратора, и мы хотим, чтобы состояние сохранялось при перезапуске сервера. Мы устанавливаем HAProxy для загрузки своего состояния из файла с server-state-file, но нам нужно не забывать сохранять файл состояния каждый раз, когда мы вносим изменения. Есть ли хороший способ убедиться, что состояние сохраняется каждый раз при остановке сервера?
Если бы systemd имел ExecPreStop=, мы могли бы включить его из файла в /etc/systemd/system без изменения файла распределенного модуля, но разработчики systemd заявили, что не видят необходимости в этой директиве.

В итоге мы создали «фальшивую» услугу с остановкой, которая зависит от haproxy.service и поэтому будет ExecStop запускается до остановки HAProxy.

haproxy-state.service:

[Unit]
Description=Save HAProxy State Before Service Stop
After=haproxy.service
Requires=haproxy.service

[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=/bin/sh -c "/usr/bin/socat /run/haproxy/control.socket - <<< \"show servers state\" > /var/lib/haproxy/last_state"

[Install]
WantedBy=multi-user.target haproxy.service

Это должно быть после haproxy.service так это остановится перед. Это должно быть WantedBy так что он всегда будет запускаться каждый раз, когда работает HAProxy.

Это не идеально, потому что состояние может измениться, если перед тем, как systemd остановит следующую службу, будет длительная пауза, но мы рискнем.