DNS 恢复后 haproxy 未执行健康检查

DNS 恢复后 haproxy 未执行健康检查

我希望的 haproxy 行为如下:

  1. 解析后端地址失败时不要启动失败
  2. 用于libc在启动时解析地址;配置中不应包含 DNS 服务器
  3. 使用libc解析地址运行
  4. 如果上次尝试失败,则始终重试名称解析
  5. 不要每隔 10 秒就向我的 DNS 服务器发送垃圾邮件。仅在需要时解析名称

_

  • 对于(1),我已添加noneinit-addr
  • 对于(2),我已添加libcinit-addr

不确定 (3) 该怎么办。该resolvers部分似乎仅支持 DNS,这是什么鬼?如果我在那里添加一个名称服务器并添加resolvers到我的服务器string,它就会开始工作,但它每 10 秒发送一次 DNS 请求。我不想这样。当我建立客户端连接时,我愿意等待 haproxy 使用解析后端同步

我断开网络连接,确保后端无法解析,然后重新启动 haproxy。然后我连接到网络,确保后端现在可以解析,并尝试使用客户端。Haproxy 仍然拒绝重试连接到后端,直到我重新启动或重新加载它:

Apr 25 11:34:28 il systemd[1]: Starting HAProxy Load Balancer...
Apr 25 11:34:28 il haproxy[3411]: [WARNING] 114/113428 (3411) : parsing [/etc/haproxy/haproxy.cfg:49] : 'server app1' : could not resolve address 'basinasrv', disabling server.
Apr 25 11:34:28 il haproxy[3411]: Proxy main started.
Apr 25 11:34:28 il haproxy[3411]: Proxy app started.
Apr 25 11:34:28 il haproxy[3411]: [NOTICE] 114/113428 (3411) : New worker #1 (3412) forked
Apr 25 11:34:28 il systemd[1]: Started HAProxy Load Balancer.
...
Apr 25 11:46:21 il haproxy[3412]: 127.0.0.1:45302 [25/Apr/2019:11:46:21.946] main app/<NOSRV> 0/-1/-1/-1/0 503 212 - - SC-- 1/1/0/0/0 0/0 "CONNECT serverfault.com:443 HTTP/1.1"

_

defaults
    # never fail on address resolution
    default-server init-addr libc,none
    #default-server init-addr last,libc,none
    option log-health-checks
    option httplog

global
    ca-base /etc/ssl/certs
    maxconn     20000
    log         /dev-log local0 debug
    user        haproxy
    chroot      /usr/share/haproxy
    pidfile     /run/haproxy.pid
    daemon

frontend  main
    bind :3129
    mode                 http
    log                  global
    maxconn              8000
    timeout              client  30s
    default_backend             app

backend app
    log                  global
    mode        http
    reqadd      Proxy-Authorization:\ Basic\ xxxxxx
    timeout     connect 5s
    timeout     server  30s
    timeout     queue   30s
    server  app1 basinsrv:443 check ssl verify required ca-file ca-certificates.crt

答案1

使用 libc 在运行时解析地址;配置中不应包含 DNS 服务器,
始终重试名称解析

据我所知,这根本是不可能的。

要在 HAproxy 配置中使用主机名而不是 IP 地址,您可以允许 HAproxy 在启动时进行解析(包括您已经暗示的所有问题),或者您需要定义一个或多个resolvers在其中指示 HAproxy 在运行时如何解析这些主机名。

我的答案在这里举个例子,大多数的 DNS 解析调整选项都是如此。

答案2

选项1:您可以修改 HAProxy 中每个 URL 的 hosts 文件。我在 HAProxy 中平衡了 2 个服务器:server1 和 server2。

编辑 hosts 文件:

# vim /etc/hosts

10.0.0.2    www.server1.com
10.0.0.3    www.server2.com

您必须添加与现有服务器相​​同的服务器,然后只需重新启动服务器,它就会像魔法一样启动 HAproxy,但是,如果您的 IP 发生变化,您将需要手动更改它们。

选项 2:系统重启后使用 crontab 启动 Haproxy。

#crontab -e

@reboot sleep 60 && systemctl start haproxy

选项 3:如果您正在使用 cockpit Centos/RHEL,如果没有,请安装它。

检查是否已安装:

rpm -qa | grep cockpit

启用驾驶舱:

systemctl enable --now cockpit.socket

使用浏览器访问您的服务器:

 https://<IP>:9090

然后,转到服务菜单 >计时器>创建计时器

并在菜单中设置以下内容:

Name     : Start HAPROXY
Command  : systemctl start haproxy 
Timer set: On Reboot
           60 seconds 

相关内容