Como usar milhares de backends no haproxy?O novo recurso de mapa é útil para isso?
-
21-12-2019 - |
Pergunta
Quero usar o haproxy como proxy e balanceador de carga para milhares de back-ends.Portanto, uma solicitação precisa ser enviada por proxy para o back-end correto, dependendo do nome do host, e então balancear a carga no back-end.Estou usando haproxy-1.5dev21.
O arquivo de configuração fica assim:
frontend public
bind :80
mode http
acl host1 hdr_reg(host) host1.com
use_backend be_host1 if host1
acl host4000 hdr_reg(host) host4000.com
use_backend be_host4000 if host4000
backend be_host[n]
server hostn_1
server hostn_2
O problema é que obtenho uma latência adicional de 30 ms por solicitação se houver 5.000 hosts.E para back-ends de 20k, o haproxy leva muito tempo para carregar, sem mencionar o desastre na latência por solicitação.
Posso fazer algo melhor do que regras ACL sequenciais?Não encontrei um exemplo para o novo recurso de mapa - as notas de lançamento dizem que ele pode ser usado para regras de redirecionamento massivo.Eu tentei isso:
use_backend %[hdr(host), map(host_to_backend_map.file)]
Algo obviamente estúpido acima no uso de mapas, mas qualquer orientação seria útil.Obrigado!
Solução
Algumas deficiências foram removidas do arquivo de configuração após a opinião de especialistas, e eu as listo aqui caso alguém possa achar isso útil.
Usar hdr (hospedeiro) em vez de hdr_reg().Isto melhora enormemente o tempo consumido para avaliar as ACLs.Melhor ainda, evite acl e use a avaliação inline, por exemplo.
use_backend host1 if { req.fhdr(host,1) -m str host1.domain.com }
Usar nbproc>1.No caso de conexões simultâneas, isso ajuda.Embora dificulte a depuração.
Para back-ends, use o endereço IP diretamente em vez de 'server hostn_1 dns_of_server:port_number'
Colocar 'fullconn 1000'na seção de padrões.Isso melhora imensamente o tempo de carregamento.
Por fim, use o haproxy git checkout mais recente e observe a melhoria no tempo de carregamento.Caiu consideravelmente.Agora é da ordem de segundos em comparação com minutos antes.
Além disso, em relação ao recurso 'mapa', um novo esquema use_backend dinâmico está em andamento que deve eliminar a necessidade de escrever tantas ACLs.
Outras dicas
Eu estava tendo o mesmo problema.Atualmente estou experimentando Nginx + Lua com todos os backends armazenados no Redis.
O fluxo de solicitação é semelhante ao abaixo.
- A solicitação é recebida no Nginx.
- Com base no host da solicitação, o Redis é consultado.Um módulo Lua está disponível para Redis.
- As informações de back-end são recuperadas dos proxies Redis e Nginx da solicitação para o back-end apropriado.
- Backend (HAProxy) e balanceia a carga da solicitação.
A motivação para isso vem http://openresty.org/#DynamicRoutingBasedOnRedis
Espero que isto ajude.