HAProxy nbsrv parece dar valor errado

1

Estou usando nbsrv em uma regra da ACL para determinar se a solicitação deve ser permitida (1).

Exemplo de configuração:

defaults 
  mode http 

frontend front_www
  listen 0.0.0.0:80 

  acl acl_backend_down nbsrv(back_www) lt 1 

  http-request deny if acl_backend_down 

  default_backend back_www

backend back_wwww

  server s1 1.2.3.1:80 check 
  server s2 1.2.3.2:80 check 
  server haproxy-dc2 1.3.4.1:80 check backup 

Com esta configuração, eu esperaria que quando s1 e s2 estivessem inoperantes, esse nbserv seria 0 e retornaria um HTTP 403.

Infelizmente, ele não envia 403 até eu derrubar o servidor de backup (haproxy-dc2).

Se eu alterar a regra da ACL para menos de dois (ou seja,):

acl acl_backend_down nbsrv(back_www) lt 2 

Então ele opera como eu esperaria: quando há apenas um primário disponível no backend, ele envia 403.

Eu achei que talvez houvesse algo estranho com menos de operador, então mudei para eq 0 , mas isso também não funciona.

Existe alguma maneira de forçar o nbsrv a funcionar como eu estou esperando, ou alguma outra maneira de detectar que todas as primárias do backend estão inativas?

(1) Esta ACL faz parte de um conjunto maior de regras, estou simplificando-a até o menor exemplo reproduzível. Se você tiver uma solução alternativa que permita detectar se estamos usando um servidor de backup, entre em contato. O tamanho da imagem maior é permitir que duas instâncias de haproxy façam failover entre si, mas impeçam loops infinitos (por exemplo, se o backend de dc01 estiver inativo, a resposta à verificação de dc02 de dc01 deve ser 403 / down)

e:

Para adicionar algum contexto aos meus comentários sobre a solução do @ gf_ abaixo ... nosso ambiente de produção é bastante complexo. Há vários backups + vários DCs e cada instância tem muitos back-ends (vários aplicativos, além da troca de conteúdo)

Para monitoramento - há verificações de integridade HAProxy internas entre instâncias, mas também monitoramento externo via collectd + zabbix que nos enviará alertas se todos os servidores de back-end não estiverem íntegros. Sabendo que não há backups disponíveis, podemos aumentar a prioridade do alerta.

Então, é por isso que simplifiquei o exemplo apenas mostrando nbsrv(back_www) lt 1 como a coisa que eu estava tentando consertar.

No momento eu estou inclinado a ir com o lt 2 e supondo que se houver apenas uma caixa, não queremos que as outras LBs falhem aqui de qualquer maneira.

    
por gf_ 29.08.2017 / 08:54

1 resposta

0

Não tenho muita certeza se os itens a seguir funcionarão para você e não podem ser testados agora, mas talvez seja útil:

HAProxy config of dc01 :

defaults 
  mode http 

frontend front_www
  listen 0.0.0.0:80 

  acl acl_backend_down nbsrv(back_www) lt 1 

  monitor-uri /health
  monitor fail if acl_backend_down

  use_backend dc02 if acl_backend_down
  default_backend back_www

backend back_wwww
  server s1 1.2.3.1:80 check 
  server s2 1.2.3.2:80 check

backend dc02
  server haproxy-dc2 1.3.4.1:80 check

Aproveite o monitor-uri e monitor fail directives e verifique /health de dc02 (e vice-versa). /health deve reportar HTTP 200 se pelo menos um backend estiver ativo e íntegro, caso contrário HTTP 503 .

    
por 30.08.2017 / 03:36

Tags