为 haproxy 添加 mysql 检查

为 haproxy 添加 mysql 检查

我正在尝试为 haproxy 添加一个 mysql 检查,如果服务不可用,它将返回一个错误页面,就像下面的配置对 http 服务器所做的那样。我只是不确定采取的最佳方法。基本上,如果所有 Web 服务器都关闭了,它应该返回错误文件,如果只有 mysql 服务器关闭了,它应该返回错误文件,即使所有 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

答案1

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

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

backend dead-end

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

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

就是这样。

或者,如果您喜欢另一种逻辑……

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

如果后端名为“mysql”(请注意,此字符串“mysql”本身并无意义——它与出现在行中的字符串“mysql”匹配listen mysql)的健康服务器数量小于 1(或者,除非它大于 0),则将使用“死端”后端。而且,由于此后端根本没有配置任何服务器,因此根据定义,它也没有健康服务器,所以会显示503错误文件。

这似乎提供了正是所需的行为:如果数据库关闭了,那么就假装 Web 服务器关闭了。

errorfile如果您希望错误页面与前端的错误页面不同,您可以在这个后端内配置一个不同的503,如果数据库启动但 Web 服务器关闭,仍会使用该错误页面。

您还可以将use_backendnbsrv()写成两行,并使用命名的 ACL,但我发现这会让很多人感到困惑,他们试图通过向 ACL 添加行来要求 ACL 匹配更多条件——这当然会产生相反的效果——它本质上要求它匹配更少条件,因为匹配任何一行都会导致 ACL 评估为真。而匿名 ACL 对我来说更有意义,只要条件只在一个地方测试即可。


从安全角度来看,您可能需要考虑是否真的打算定义mysqllisten- 似乎它应该是,backend除非您确实希望这台机器接受端口 3306 上的连接并将其中继到真正的 MySQL 服务器。

相关内容