我正在尝试为 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_backend
和nbsrv()
写成两行,并使用命名的 ACL,但我发现这会让很多人感到困惑,他们试图通过向 ACL 添加行来要求 ACL 匹配更多条件——这当然会产生相反的效果——它本质上要求它匹配更少条件,因为匹配任何一行都会导致 ACL 评估为真。而匿名 ACL 对我来说更有意义,只要条件只在一个地方测试即可。
从安全角度来看,您可能需要考虑是否真的打算定义mysql
为listen
- 似乎它应该是,backend
除非您确实希望这台机器接受端口 3306 上的连接并将其中继到真正的 MySQL 服务器。