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.