重新加载haproxy时保留后端服务器状态

重新加载haproxy时保留后端服务器状态

因为我有大量的 https 证书,而且这些证书每天都在变化(具有许多域的大型多租户应用程序),所以我有一个脚本可以在几乎随机的时间重新加载 haproxy。这很好用。

当我向后端服务器部署新版本的应用程序时,我也将后端服务器设置为 MAINT。这也很好用。

问题是,如果发生重新加载,我设置为 MAINT 状态的任何服务器都会被重新加载为 READY。这会让客户看到等待甚至错误消息。

有没有办法在重新加载haproxy时保留后端服务器的当前状态?

答案1

不确定您使用的是哪个版本,需要以下信息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

答案2

从 HAProxy 2.0 开始,可以启动“sidecar”进程数据平面API公开 REST API haproxy.cfg,:

global
  stats socket /run/haproxy/admin.sock mode 660 level admin

program api
  command dataplaneapi -f /etc/haproxy/dataplaneapi.yml

负责dataplaneapi生成haproxy.cfg并重新加载自身。主进程和haproxy之间的通信通过 UNIX 套接字完成。haproxydataplaneapi/run/haproxy/admin.sock

看起来dataplaneapi.yml像这样:

---
dataplaneapi:
  host: 127.0.0.1
  port: 5555
  transaction:
    transaction_dir: "/tmp/haproxy"
  user:
  - insecure: true
    password: verySecretPassword
    name: admin
haproxy:
  config_file: "/etc/haproxy/haproxy.cfg"
  haproxy_bin: "/usr/sbin/haproxy"
  reload:
    reload_delay: 5
    reload_cmd: service haproxy reload
    restart_cmd: service haproxy restart

然后您可以使用以下命令获取前端列表:

curl -u admin:$DATAPLANE_PASS http://127.0.0.1:5555/v2/services/haproxy/configuration/frontends

可以使用请求PUT来更新前端:

PUT /services/haproxy/configuration/frontends/{name}

更多详细信息的文档. 更新请求需要包装在事务中:

  # fetch current config file version
  GET /services/haproxy/configuration/version
  # start transaction
  POST /services/haproxy/transactions?version={version}
  # make some changes
  PUT /services/haproxy/configuration/frontends/{name}?transaction_id={transaction}      
  # commit transaction, followed by haproxy reload
  PUT /services/haproxy/transactions/{transaction}

另一种选择是直接与 HAProxy 通信,例如通过 Unix 套接字:

echo -e "set ssl cert /etc/harpoxy/certs/mysite.pem <<\n$(cat ./new_certificate.pem)\n" | \
  socat stdio unix-connect:/run/haproxy/admin.sock

随后是commit ssl cert ...命令。也可自 HAProxy 2.0 起

相关内容