Назад | Перейти на главную страницу

Добавить проверку mysql в haproxy

Я пытаюсь добавить проверку 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.