为什么通过自身进行代理时不进行haproxy tcp检查工作

问题描述 投票:1回答:1

为了避免使用TCP时需要SNI的运行状况检查,我可以进行以下哪种工作

listen website
  bind :10003
  mode tcp

  server website_proxy_aws localhost:14001  check fall 3 rise 2
  server website_proxy_dc  localhost:14002  check fall 3 rise 2

listen website_proxy_aws
  bind :14001
  mode tcp
  option httpchk HEAD / HTTP/1.1\r\nHost:\ website-lb.domain.com
  server website_proxy_svc_aws internal-alb.eu-west-1.elb.amazonaws.com:80 check sni req.hdr(Host) verify none fall 3 rise 2 weight 2

listen website_proxy_do
  bind :14002
  mode tcp
  option httpchk HEAD  / HTTP/1.1\r\nHost:\ website-lb.domain.com
  server ivendiwebsite_proxy_svc_dc do-website-lb.domain.com:443 check ssl sni req.hdr(Host) verify none  fall 3 rise 2 weight 2

现在,如果website_proxy_do处于关闭状态,则它在统计页面中对于website_proxy_do侦听器将显示为红色。但是website侦听器对于这两个都显示为绿色。

我想我在这里做错了一个简单的解释。

(我知道在此示例中,我可以使用一个侦听,因为两者之间的主机是相同的,我只是想知道为什么网站侦听器应该执行tcp检查,但无法确认故障站点是下)

haproxy
1个回答
0
投票

我了解您在看什么。在回答之前,我想补充一下我重复问题的方式,这样很容易说出我们在同一页面上。

这些是我的HAProxy侦听器,与您所做的类似。

listen port_33306
   bind :33306
   mode tcp
   server local-tunnel localhost:23306 check


listen port_23306
   bind :23306
   mode tcp
   server mysql-tunnel localhost:13306 check

[我使用端口13306上的socat隧道化了在Aurora上运行的MySQL,这将很容易理解问题所在。

所以这是它的外观

localhost:33306 => localhost:23306 => localhost:13306 => myaurora.aws-aurora-blah-blah.com:3306

现在,这是我的netstat外观

robot@proxy:~$ netstat -tulpn
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name                    
tcp        0      0 0.0.0.0:13306           0.0.0.0:*               LISTEN      3465/socat          
tcp        0      0 0.0.0.0:23306           0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:33306           0.0.0.0:*               LISTEN      -                   

这就是我的haproxy?stats页面的外观。

enter image description here

现在,我正在断开tcp端口socat到Aurora的13306隧道,因此就像您说的那样,它将破坏流量,并在我的port_23306页面上将侦听器haproxy?stats显示为红色,因为端口13306不再存在。

enter image description here

所以,直到这里我们有相似的输出,现在的问题是,为什么在port_33306未通过检查的情况下,侦听器port_23306仍为绿色。]

现在是我的netstat外观。

robot@proxy:~$ netstat -tulpn
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name                    
tcp        0      0 0.0.0.0:23306           0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:33306           0.0.0.0:*               LISTEN      -                   

如您所见,由于我杀死了进程,所以端口socat的隧道13306不存在,并且侦听器正在检查localhost:13306。即使连接不存在,HAProxy仍保持打开端口绑定的状态,如果我启动隧道,则将端口23306用于通讯,显然,无需重新启动HAProxy,它将恢复为绿色。

由于此,23306打开,并且port_33306中将端口33306绑定到localhost:23306的侦听器仅检查23306,并且如果23306不对树进行更深入的检查是否连接到某个进程。

因此,我们可以看到侦听器port_33306仍为绿色,因为它检查端口23306,而侦听器port_23306为红色,这是因为绑定23306已打开并准备连接到某物,但检查是在未打开的端口13306上完成,因此正在通过端口23306的健康检查,但未通过13306的健康检查。

很难用确切的术语和所有内容进行解释,但我尝试过。

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.