停止前始终保存 HAProxy 服务器状态

停止前始终保存 HAProxy 服务器状态

我们有时会使用管理套接字禁用 HAProxy 中的特定服务器(运行在 RedHat 7 上,但由于 RedHat 没有 1.8 版本,因此在本地编译),并且希望在服务器重新启动时保持状态。我们将 HAProxy 设置为从文件中加载其状态,方法是server-state-file,但我们需要记住每次进行更改时都要保存状态文件。有没有一个好的方法可以确保每次服务器停止时都保存状态?
如果 systemd 有ExecPreStop=,我们可以从文件中将其包含进来而/etc/systemd/system无需修改分布式单元文件,但 systemd 开发人员表示他们认为没有必要使用该指令。

答案1

我们最终创建了一个“假”服务,该服务仅具有一个依赖于的停止操作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 停止下一个服务之前有长时间的暂停,状态可能会改变,但这是我们会承担的风险。

答案2

您可以考虑在导出其状态之前禁用所有可用frontendlisten部分。例如运行以下 bash 行(针对每个部分)echo 'disable frontend https_frontend' | socat /run/haproxy/admin.sock stdio:。

frontend也可以通过让所有和部分考虑特定的 acl 来实现listen。这样您就可以通过分别运行一个命令(例如:add acl ...' | socat /run/haproxy/admin.sock stdiodel acl ...' | socat /run/haproxy/admin.sock stdio)来逻辑地启用/禁用它们。

相关内容