Adicione uma verificação do mysql ao haproxy

2

Estou tentando adicionar uma verificação do mysql para haproxy, na qual, se o serviço não estiver disponível, ele retornará uma página de erro, exatamente como a configuração abaixo faz com os servidores http. Só não tenho certeza da melhor abordagem a seguir. Basicamente, se todos os servidores da web caírem, ele deve retornar o arquivo de erro, e se apenas o servidor mysql cair, ele deve retornar o arquivo de erro, mesmo que todos os servidores da Web estejam ativos. Qualquer ajuda é apreciada.

 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
    
por themanwhoknowstheman 27.06.2016 / 03:29

1 resposta

2

A nbsrv(<back-end>) busca do estado interno pode ser usada para avalie se o servidor MySQL está ativo, assim como você está usando agora para contar os servidores disponíveis no grupo principal.

A solução mais simples é criar um back end falso sem servidores.

backend dead-end

Em seguida, na configuração front-end, defina o seguinte antes de qualquer outra declaração use_backend :

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

É isso.

Ou, se você gosta da sua lógica do outro jeito ...

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

Se o número de servidores íntegros no back-end chamou "mysql" (note que esta string "mysql" não é intrinsecamente significativa - está combinando com a string "mysql" que está aparecendo na linha listen mysql ) é menor que 1 (ou, a menos que seja maior que 0), o back-end "sem saída" será usado. E, como esse back-end não tem nenhum servidor configurado, ele também não possui servidores íntegros , portanto, o arquivo de erro 503 seria exibido.

Isso parece fornecer exatamente o comportamento desejado: se o banco de dados estiver inoperante, faça de conta que os servidores da Web estão inativos.

Você pode configurar um errorfile 503 distinto dentro desse backend se desejar que a página de erro seja diferente daquela no front-end, que ainda seria usada se o banco de dados estivesse ativo, mas os servidores web estivessem para baixo.

Você também pode escrever as use_backend e nbsrv() como duas linhas, com uma ACL nomeada, mas acho que elas são confusas para muitas pessoas, que tentam exigir uma ACL para corresponder a mais condições adicionando linhas para ele - o que, é claro, faz o oposto - requer essencialmente que elas correspondam a condições menor , já que a correspondência de qualquer linha única faz com que a ACL seja avaliada como verdadeira. E uma ACL anônima só faz muito mais sentido para mim, sempre que a condição é testada em um único lugar.

De uma perspectiva de segurança, você pode considerar se realmente queria definir mysql como listen - parece que deve ser backend , a menos que você realmente queira que essa máquina aceite conexões em porta 3306 e retransmita então para o servidor MySQL real.

    
por 27.06.2016 / 13:25

Tags