Я пытаюсь добавить проверку mysql для haproxy, в которой, если бы служба была недоступна, она возвращала бы страницу с ошибкой, как это делает приведенная ниже конфигурация с http-серверами. Я просто не уверен в лучшем подходе. Обычно, если все веб-серверы выходят из строя, он должен вернуть файл с ошибкой, а если просто сервер mysql выходит из строя, он должен возвращать файл с ошибкой, даже если все веб-серверы активны. Любая помощь приветствуется.
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 Server, точно так же, как вы используете его сейчас для подсчета доступных серверов в основной группе.
Самое простое решение - создать фиктивный бэкэнд без серверов.
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.
Кажется, это обеспечивает именно желаемое поведение: если база данных не работает, то притвориться, что веб-серверы не работают.
Вы можете настроить отдельный errorfile
503 внутри этого внутреннего интерфейса, если вы хотите, чтобы страница с ошибкой отличалась от страницы во внешнем интерфейсе, которая все равно использовалась бы, если бы база данных работала, а веб-серверы не работали.
Вы также можете написать use_backend
и nbsrv()
как две строки с именованным ACL, но я считаю, что это сбивает с толку многих людей, которые пытаются требовать, чтобы ACL соответствовал большему количеству условий, добавляя к нему строки - что, конечно, делает наоборот - он требует по существу, чтобы соответствовать меньше условия, поскольку соответствие любой отдельной строке приводит к тому, что ACL оценивается как истина. А анонимный ACL имеет для меня гораздо больше смысла, каждый раз, когда условие проверяется только в одном месте.
С точки зрения безопасности вы можете подумать, действительно ли вы намеревались определить mysql
как listen
- вроде как должно быть backend
если вы действительно не хотите, чтобы этот компьютер принимал соединения на порт 3306 и ретранслировал их на настоящий сервер MySQL.