添加一个mysql检查haproxy

我试图添加一个mysql检查haproxy,其中如果服务不可用,它将返回一个错误页面,就像下面的configuration与http服务器一样。 我只是不确定最好的方法。 基本上,如果所有的Web服务器都closures了,它应该返回错误文件,如果只是mysql服务器closures,它应该返回错误文件,即使所有的Web服务器都处于活动状态。 任何帮助表示赞赏。

frontent ft_app bind 10.0.0.1:80 # sorry page to return when worst case happens errorfile 503 /etc/haproxy/error.html # detect capacity issues in production farm acl MAIN_not_enough_capacity nb_srv(bk_app_main) le 2 # failover traffic to backup farm use_backend bk_app_backup if MAIN_not_enough_capacity default_backend bk_app_main backend bk_app_main server s11 10.0.0.101:80 check server s12 10.0.0.102:80 check backend bk_app_backup option allbackups server s21 20.0.0.101:80 check server s22 20.0.0.102:80 check backup listen mysql bind 10.0.0.5:3306 mode tcp option mysql-check server mysql-1 10.0.0.1:3306 check 

可以使用nbsrv(<back-end>)内部状态获取来评估MySQL服务器是否处于活动状态,就像您现在使用它来计算主组中的可用服务器一样。

最简单的解决scheme是创build一个没有服务器的虚拟后端。

 backend dead-end 

然后,在前端configuration中,在任何其他use_backend语句之前设置以下内容:

 use_backend dead-end if { nbsrv(mysql) lt 1 } 

而已。

或者,如果你喜欢你的逻辑另一种方式…

 use_backend dead-end unless { nbsrv(mysql) gt 0 } 

如果在后端的健康服务器的数量被称为“mysql”(注意,这个string“mysql”没有内在意义 – 它匹配出现在行上的string“mysql” listen mysql )小于1 (或者,除非它大于0),那么将使用“死端”后端。 而且,由于该后端根本没有configuration任何服务器,因此它也没有健康的服务器,所以会显示503错误文件。

这似乎提供了所需的行为:如果数据库closures,然后假装Web服务器已closures。

如果您希望错误页面与前端的不同,那么您可以在此后端中configuration不同的错误文件503,如果数据库已启动但Web服务器已closures,仍然可以使用该页面。

你也可以用use_backendnbsrv()作为两行,用一个命名的ACL,但是我发现这些让很多人感到困惑,他们试图通过添加行来使ACL匹配更多的条件,当然是做相反的事情 – 它要求它基本上匹配更less的条件,因为匹配任何单行导致ACL评估为真。 而且,只要一个地方进行testing,匿名ACL对我​​来说就更有意义了。


从安全的angular度来看,你可能想要考虑你是否真的打算把mysql定义为一个listen – 它看起来应该是一个backend除非你真的希望这台机器接受端口3306上的连接,然后转发给真正的MySQL服务器。