Назад | Перейти на главную страницу

Конфигурация HAProxy для RabbitMQ

У меня есть API, который отправляет сообщения RabbitMQ.

У меня есть кластер RabbitMQ высокой доступности за HAProxy.

Когда я тестирую свой API, я начинаю видеть много такого:

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

В моем журнале единорогов.

Если я подключаюсь напрямую к RabbitMQ, как предполагается, через haproxy, я этого не сделаю. Где я ошибаюсь, моя конфигурация haproxy выглядит так:

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

Под нагрузкой балансировщик нагрузки обычно составляет 20-30% процессора.

Нериюс прав, эта проблема вызвана тем, что HAProxy имеет тайм-аут клиента, что означает, что если соединение считается бездействующим более X мс, соединение разрывается.

TCP может отправлять пакеты проверки активности, чтобы гарантировать, что неактивное соединение должно оставаться открытым.

Вы можете проверить свой параметр TCP на наличие пакетов keep-alive, используя следующую команду:

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

По умолчанию эта конфигурация равна 7200 секундам, что означает, что TCP начнет отправлять пакеты проверки активности только после того, как соединение простаивает более 2 часов.

Итак, просто обновите значение тайм-аута клиента HAProxy до значения> 2 часов, например:

timeout client 3h

И добавьте параметр clitcpka в свой бэкэнд:

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

удалять timeout client 50s из раздела по умолчанию и перейти ко всем остальным, кроме rabbitmq_frontend. Тайм-аут клиента означает, что он закрывает сеанс TCP между клиентом rabbitmq и haproxy, поэтому чтение из этого сокета получает "".