HaProxy stick-table 与 nbproc 一起高于 1

HaProxy stick-table 与 nbproc 一起高于 1

我已经使用 HaProxy 的 stick-table 配置了一条基于 IP 连接数的规则,如下所示:

global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    user haproxy
    group haproxy
    daemon

    # Default SSL material locations
    ca-base /etc/ssl/certs
    crt-base /etc/ssl/private

    maxconn 60000

backend connectionstablev4
   stick-table type ip size 1m expire 60s store conn_cur

frontend smtpv4
    bind :25

    tcp-request connection track-sc0 src table connectionstablev4
    acl connabuse sc_conn_cur(0,connectionstablev4) gt 5
    
   tcp-request connection reject if connabuse

    # Reject any client that speak before the aloha
    tcp-request inspect-delay 1s
    acl content_present req_len gt 0
    tcp-request content reject if content_present

    default_backend smtp_backend

backend smtp_backend
    mode tcp
    timeout server 1m
    timeout connect 5s

    # Health check
    option smtpchk HELO mx1.improvmx.com

    server srv1 127.0.0.1:2525 check send-proxy maxconn 500

而且效果非常好。

但是,一旦我添加更多流程,如下所示(在全局部分):

global
    # ... same as above

    nbproc  6
    cpu-map  1 1
    cpu-map  2 2
    cpu-map  3 3
    cpu-map  4 4
    cpu-map  5 5
    cpu-map  6 6

每个 IP 的最大连接数停止工作。

我怀疑 stick-table 是基于每个进程的而不是全局的,但我找不到有关此事的任何信息。

问题显然出在 nbproc/cpu-map 上,因为只要我删除这部分,其他一切都能正常工作。

是否有一些规则或配置可以设置来指示 HaProxy 对所有进程使用相同的 stick-table?

提前致谢。

答案1

使用线程而不是进程。文档中直接提到了进程方面的问题。

https://cbonte.github.io/haproxy-dconv/2.2/configuration.html#3.1-nbthread

此设置仅在内置线程支持时可用。它使 haproxy 在线程上运行。这与“nbproc”是互斥的。虽然“nbproc”在历史上曾经是使用多个处理器的唯一方法,但它也涉及许多与进程(健康检查、对等点、stick-tables、统计数据等)之间缺乏同步有关的缺点,这些缺点不会影响线程。因此,强烈建议任何现代配置从“nbproc”迁移到“nbthread”。当 HAProxy 在前台启动时,“nbthread”也可以工作。在某些支持 CPU 亲和性的平台上,当不使用 nbproc 时,默认的“nbthread”值会自动设置为进程在启动时绑定到的 CPU 数量。这意味着可以使用“taskset”或“cpuset”等命令从调用进程轻松调整线程数。否则,此值默认为 1。默认值在“haproxy -vv”的输出中报告。另请参阅“nbproc”。

相关内容