↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

HAProxy 3.4.4

高级功能

HAProxy 3.4 入门、配置与管理三套完整手册的简体中文译本

3.5.1. 高级功能:系统管理

HAProxy 旨在在常规生产环境中保持极高的稳定性与安全性。它以单个可执行文件的形式提供,无需任何安装过程。多个版本可轻松共存,因此建议按重要性顺序逐步升级实例,而非一次性全部迁移。配置文件易于版本化。配置检查可在离线状态下完成,无需重启可能失败的服务。在配置检查过程中,可检测到多种高级错误(例如规则相互隐藏,或无法生效的会话粘性),并提供详细的警告信息与配置建议以修复问题。配置文件的向后兼容性极为持久,版本 1.5 仍完全支持 13 年前为版本 1.1 编写的配置,而 1.6 仅移除了几乎不再使用、已过时的关键词,这些功能可通过其他方式实现。配置与软件升级机制平滑且无中断,允许旧版与新版进程在系统中共存,各自处理自身的连接。启动时会报告系统状态、构建选项及库兼容性信息。

某些高级功能允许应用管理员平稳地停止服务器,检测其是否已无活动,随后将其下线、停止、升级,并确保在升级期间不接收任何流量,然后通过正常路径再次测试,且无需向公众开放,所有这些操作均无需修改 HAProxy 配置。这确保了即使在复杂的生产环境中,也可在营业时间内完成操作,同时所有技术资源均保持可用。

该进程尽可能节省资源,使用内存池以减少分配时间并限制内存碎片,一旦数据包内容被发送即立即释放负载缓冲区,并支持强制执行严格的内存限制:当超过限制时,连接必须等待缓冲区可用,而非继续分配更多内存。该机制有助于在特定严格环境中保障内存使用。

提供命令行接口(CLI),可通过 UNIX 套接字或 TCP 套接字执行多项操作并获取故障排查信息。通过该套接字执行的所有操作均无需修改配置,因此主要用于临时变更。使用此接口可实现以下功能:更改服务器的地址、权重和状态,查询统计信息并清空计数器,转储并清空会话粘性表(可按键条件选择性操作),转储并终止客户端与服务器端的连接,转储捕获的错误并提供错误原因与位置的详细分析,转储、添加和删除 ACL 与映射中的条目,动态更新 TLS 共享密钥,对任意前端实时应用连接限制与速率限制(在共享托管环境中尤为有用),禁用特定前端以释放监听端口(在禁止白天操作但需修复时尤为有用)。支持动态更新证书及其配置,也支持启用并查阅流量处理每一步的追踪信息。

在 SNMP 为强制要求的环境中,至少存在两个代理程序。其中一个随 HAProxy 源码提供,依赖 Net-SNMP Perl 模块;另一个随商业版包提供,无需 Perl 支持。两者在功能覆盖范围上大致相当。

通常建议在部署 HAProxy 的机器上安装以下 4 个工具:

  • socat(用于连接 CLI,尽管某些 netcat 的分支在一定程度上也可实现此功能);

  • halog:来自最新 HAProxy 版本的日志分析工具,可极快速解析原生 TCP 和 HTTP 日志(每秒 1 至 2 GB),并提取有用信息与统计信息,例如按 URL 统计的请求数、按源地址统计的请求数、按响应时间或错误率排序的 URL、终止码等。该工具专为部署在生产服务器上以协助排查实时问题而设计,因此必须始终就绪,随时可用。

  • tcpdump:强烈建议使用该工具捕获网络流量,以便排查日志中显示的问题。当应用程序与 HAProxy 的分析结果出现分歧时,网络流量捕获是唯一能判断双方对错的方法。此外,借助 tcpdump 也常能发现网络栈和虚拟化平台中的缺陷。

  • strace:它是 tcpdump 的配套工具。它将报告 HAProxy 实际接收到的内容,有助于区分操作系统层面的问题与 HAProxy 自身的问题。当怀疑 HAProxy 存在缺陷时,通常会要求提供 strace 输出。

3.5.2. 高级功能:系统特定能力

根据 HAProxy 所部署的操作系统不同,某些额外功能可能可用或必需。尽管 HAProxy 支持多种平台,但其主要开发环境为 Linux,因此部分功能仅在该平台可用。

透明绑定和连接功能、将连接绑定到特定网络接口的支持,以及将多个进程绑定到同一 IP 地址和端口的能力,仅在 Linux 和 BSD 系统上可用,尽管只有 Linux 会在内核层面实现对可用进程间入站请求的负载均衡。

在 Linux 上,还提供了一系列额外功能和优化,包括对网络命名空间(也称为“容器”)的支持,使 HAProxy 可作为所有容器之间的网关;能够在客户端连接上设置 MSS、Netfilter 标记和 IP TOS 字段;支持在监听端启用 TCP FastOpen;通过 TCP 用户超时机制,当内核检测到客户端已断开但尚未达到配置超时时间时,可快速终止连接;支持 TCP 拼接,使内核能够直接在连接两端之间转发数据,避免多次内存拷贝;可启用“defer-accept”绑定选项,仅在内核缓冲区中有数据时才通知连接建立;还可通过“tcp-smart-connect”选项,使用 ACK 确认连接的同时发送请求(有时称为“捎带”)。在 Linux 上,HAProxy 还特别注重对 TCP 延迟 ACK 的处理,以尽可能减少网络中的数据包数量。

某些系统存在时钟不可靠的问题,其时间会在过去和未来之间来回跳变。过去,一些 NUMA 系统曾出现此类情况,由于多个处理器未能看到完全一致的当前时间,导致时间不同步;近期,虚拟化环境中此类问题更为常见,因为虚拟时钟与真实时钟无关联,从而引发巨大的时间跳跃(曾观察到长达 30 秒的跳变)。这在一般情况下对超时机制的执行造成了诸多困扰。由于此类系统存在缺陷,HAProxy 维护了自身的单调时钟,该时钟基于系统时钟,但会测量并补偿时钟漂移。这确保了即使系统时钟极不准确,定时器仍能保持合理精度,超时机制依然有效。请注意,该问题影响运行在这些系统上的所有软件,并非 HAProxy 特有。常见表现包括误报超时或应用程序冻结。因此,若在系统上检测到此类行为,必须予以修复,无论 HAProxy 是否已自行防护。

在 Linux 上,新启动的进程可与前一个进程通信,以复用其监听文件描述符,从而确保在进程替换过程中监听套接字始终不中断。

3.5.3. 高级功能:脚本编写

HAProxy 可以编译支持嵌入式 Lua 语言,这为请求或响应的复杂处理、路由决策、统计信息处理等场景打开了广阔的可能性。借助 Lua,甚至可以建立与其它服务器的并行连接以交换信息。这种方式使得开发认证系统等复杂功能成为可能(尽管实现较为复杂)。有关如何使用 Lua 的更多信息,请参阅文件 “doc/lua-api/index.rst” 中的文档。

3.5.4. 高级功能:跟踪

任何时刻,系统管理员均可通过 CLI 连接并启用各个内部子系统的追踪功能。默认情况下提供多种详细程度,实际可获取的追踪信息量介于每请求一行至每请求五百行之间。系统支持过滤器,以及自动捕获开启/关闭/暂停机制,因此完全可以等待特定事件发生,并对其进行详细观察。该功能对诊断由故障服务器或客户端引发的协议违规行为,或拒绝服务攻击极为便利。

来源与许可

文档取自 pig.center · 上游文档

版本
3.4.4
许可
GPL-2.0-only
来源修订
1dff183d0ca5a430d10324c5bbc64f9853ed77ae5df299827b47b2f54e352f65
译文修订
1dff183d0ca5a430d10324c5bbc64f9853ed77ae5df299827b47b2f54e352f65
原始 Markdown