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!

Foi útil?

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.

  1. 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 }

  2. Usar nbproc>1.No caso de conexões simultâneas, isso ajuda.Embora dificulte a depuração.

  3. Para back-ends, use o endereço IP diretamente em vez de 'server hostn_1 dns_of_server:port_number'

  4. 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.

  1. A solicitação é recebida no Nginx.
  2. Com base no host da solicitação, o Redis é consultado.Um módulo Lua está disponível para Redis.
  3. As informações de back-end são recuperadas dos proxies Redis e Nginx da solicitação para o back-end apropriado.
  4. Backend (HAProxy) e balanceia a carga da solicitação.

A motivação para isso vem http://openresty.org/#DynamicRoutingBasedOnRedis

Espero que isto ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top