Configuração do HAProxy para RabbitMQ

2

Eu tenho uma API que envia mensagens para o RabbitMQ.

Eu tenho um cluster RabbitMQ de alta disponibilidade por trás do HAProxy.

Quando eu carrego o teste da minha API, começo a ver muito disso:

Recovering from a network failure... Exception in the reader loop: AMQ::Protocol::EmptyResponseError: Empty response received from the server.

No meu log de unicórnio.

Se eu me conectar diretamente ao RabbitMQ como um posado para via haproxy eu não faço. Onde estou indo errado, minha configuração haproxy é assim:

global
  log 127.0.0.1   local0
  log 127.0.0.1   local1 notice
  #log loghost    local0 info
  maxconn 4096
  #debug
  #quiet
  user haproxy
  group haproxy

defaults
  log     global
  mode    http
  retries 3
  timeout client 50s
  timeout connect 10s
  timeout server 50s
  option dontlognull
  option forwardfor
  option httplog
  option redispatch
  balance  roundrobin

# Set up application listeners here.

listen http_frontend
  bind *:80
  mode http
  default_backend http_backend
  option httpclose
  reqadd X-Forwarded-Proto:\ http

listen https_frontend
  bind *:443 ssl crt /etc/haproxy.pem
  mode http
  default_backend http_backend
  reqadd X-Forwarded-Proto:\ https

listen http_bucky_frontend
  bind *:1880
  mode http
  default_backend http_bucky_backend
  option httpclose
  reqadd X-Forwarded-Proto:\ http

listen https_bucky_frontend
  bind *:1443 ssl crt /etc/haproxy.pem
  mode http
  default_backend http_bucky_backend
  reqadd X-Forwarded-Proto:\ https

listen rabbitmq_frontend
  bind *:5672
  mode tcp
  default_backend rabbitmq_backend
  option tcplog

listen admin
  bind 127.0.0.1:22002
  mode http
  stats uri /


backend http_backend
  mode http
  server 0-http_backend x.x.x.x:9000 maxconn 100 check
  server 1-http_backend x.x.x.x:9000 maxconn 100 check

backend http_bucky_backend
  mode http
  option httpchk GET /status
  http-check expect string up
  server 0-http_bucky_backend x.x.x.x:9000 maxconn 100 check
  server 1-http_bucky_backend x.x.x.x:9000 maxconn 100 check

backend rabbitmq_backend
  balance roundrobin
  mode tcp
  server 0-rabbitmq_backend x.x.x.x:5672 maxconn 4000 check
  server 1-rabbitmq_backend x.x.x.x:5672 maxconn 4000 check

Quando sob carga, o balanceador de carga é normalmente 20-30% cpu

    
por msaspence 17.04.2014 / 19:38

2 respostas

6

Nerijus está certo, esse problema é causado pelo HAProxy ter um tempo limite do cliente, o que significa que, se a conexão for considerada inativa por mais de X ms, a conexão será interrompida.

O TCP pode enviar pacotes de manutenção para garantir que uma conexão ociosa permaneça aberta.

Você pode verificar seu parâmetro TCP para manter os pacotes ativos usando o seguinte comando:

$ cat /proc/sys/net/ipv4/tcp_keepalive_time

Por padrão, essa configuração é igual a 7200 segundos, o que significa que o TCP começará a enviar pacotes keep-alive somente após uma conexão ficar ociosa por mais de 2 horas.

Portanto, basta atualizar o valor do tempo limite do cliente HAProxy para algo > 2 horas, por exemplo:

timeout client 3h

Adicione a opção clitcpka ao seu back-end:

backend rabbitmq_backend
  balance roundrobin
  mode tcp
  option          clitcpka
  server 0-rabbitmq_backend x.x.x.x:5672 maxconn 4000 check
  server 1-rabbitmq_backend x.x.x.x:5672 maxconn 4000 check
    
por 13.12.2014 / 12:05
1

Remova timeout client 50s da seção padrão e mova para todos os outros, exceto de rabbitmq_frontend . O tempo limite do cliente significa que ele fecha a sessão TCP entre o cliente rabbitmq e o haproxy, portanto, a leitura desse soquete é feita "".

    
por 31.07.2014 / 14:11