【HAProxy 数据面】Runtime API:可热改边界与必须 reload 的配置面

💡 原文中文,约8100字,阅读约需20分钟。
📝

内容提要

本文阐述HAProxy Runtime API与reload的运维分界:Runtime API通过stats socket可热修改服务器权重、状态、stick-table、ACL/Map条目及前端开关,但仅内存生效;结构变更如新增bind、frontend或规则树需修改配置并reload。Master CLI用于多进程管理,强调热改适合运行态调整,结构变更走文件,并需注意持久化纪律。

🔎

延伸解读

热改与结构变更的分界

HAProxy 的 Runtime API 只能修改运行态对象,如权重、状态、表条目,而新增 bind、frontend 或规则树等结构变更必须修改配置文件并 reload。这种设计源于其“启动时解析、生命周期内结构固定”的模型,与 Envoy 的 xDS 资源树不同。理解这一分界有助于避免误用 Runtime API 进行结构性调整,从而减少配置与内存状态不一致的风险。

持久化纪律与运维门禁

Runtime 变更默认仅存于内存,reload 后丢失,因此关键变更需回写配置或使用 state 文件。文章建议建立门禁:结构变更需通过 haproxy -c 校验,Runtime 变更需审计并定期回写,长期仅存于内存的状态视为债务。这有助于维护 Git 与线上配置的一致性,避免事故时出现“配置漂移”。

Master CLI 的排障价值

在 reload 窗口期,新旧 worker 可能并存,仅连接默认 worker socket 可能看到不完整状态。Master CLI 可通过 PID 定向发送命令,分别查看 current 与 leaving worker 的状态,避免误判。但 Master CLI 不能用于 retrieve listening sockets,且对 leaving worker 的变更无意义,因此排障时应优先使用只读命令。

Q&A

HAProxy Runtime API 可以热修改哪些配置?

HAProxy Runtime API 通过 stats socket 可以热修改服务器权重、状态(ready/drain/maint)、地址端口,动态增删服务器,管理 stick-table 条目,增删 ACL/Map 条目,以及开关前端和调整 maxconn。这些修改仅作用于内存,reload 后默认丢失。

HAProxy 中哪些变更必须通过修改配置文件并 reload 才能生效?

必须通过配置文件并 reload 的变更包括:新增或删除 bind、frontend、backend 段,修改 ACL/use_backend/http-request 规则树结构,调整全局参数(如 tune.*、线程布局、日志目标),以及健康检查探针定义等与解析期绑定的对象。

HAProxy 的 drain 和 maint 状态有什么区别?

drain 状态表示服务器不再接收新请求,但继续处理存量连接,适合发布前摘流;maint 状态则完全停止流量,适合故障隔离或即将删除服务器。两者在调度和健康检查交互上不同,自动化应使用 state 命令而非仅改权重。

HAProxy 中如何动态添加服务器?需要注意什么?

可以使用 add server 命令在已声明且满足动态算法约束的 backend 上动态添加服务器。但动态添加的服务器在 reload 后不会自动保留,除非配置文件中有对应条目或配合 state 持久化流程。因此,热加只解决当前进程内的扩容,不替代配置文件作为真相源。

HAProxy 的 Master CLI 有什么用途?与 stats socket 有何区别?

Master CLI 用于管理 master-worker 模式下的所有进程,包括当前 worker 和 soft-stop 尚未退出的 leaving worker。它可以通过 @!PID 前缀向指定进程发送命令,并支持 show proc 查看进程列表。与 stats socket 相比,Master CLI 更适合在 reload 窗口期进行多进程可见性核对,但不能用于 retrieve listening sockets。日常自动化仍以 stats socket 为主。

HAProxy 中 stick-table 的热修改有哪些操作?

可以通过 show table 查看表或条目,使用 clear table 按 key、data 条件或 ptr 清除条目。这些操作适用于限流、粘滞、封禁等场景的急救,但不改变规则本身。表类型、容量和 peers 复制等属于配置面,需通过配置文件管理。

HAProxy 中 ACL/Map 的热修改与规则树修改有何区别?

ACL/Map 的热修改(如 add acl、del acl、set map)只改变已声明 pattern 文件或内联表的内容,不改变规则树结构。而新增 ACL 表达式、修改匹配字段或 http-request 动作链结构则属于结构变更,必须修改配置文件并 reload。

HAProxy 中如何实现大表替换的原子性?

可以使用 prepare/commit 命令进行版本化更新:先在新版本中填充条目,再切换命中版本,避免清表到填完的窗口期策略空洞。这应被视为一个事务,而不是多个独立的 add 操作。

🏷️

标签

➡️

继续阅读