Почему Nginx перестал отправлять запросы upstream серверу после огромной нагрузки?

Привет,

На проекте используется Nginx как распределитель нагрузки. Вот упрощенная конфигурация:

upstream ima {
    server serverA:3000;
    server serverA:3000 backup;
    server serverA:3000 backup;
    server serverA:3000 backup;
}

server {
    server_name localhost;
    gzip on;

    sendfile on;

    gzip_http_version 1.0;
    gzip_proxied      any;
    gzip_min_length   500;
    gzip_disable      "MSIE [1-6]\.";
    gzip_types        text/plain text/xml text/css
                      text/comma-separated-values
                      text/javascript
                      application/x-javascript
                      application/json
                      application/atom+xml;

    proxy_connect_timeout       10;
    proxy_send_timeout          12;
    proxy_read_timeout          14;

    send_timeout                600;
    client_body_timeout         600;
    client_header_timeout       600;
    keepalive_timeout           600;

    client_max_body_size 50M;
    client_body_buffer_size 20M;

    access_log /home/nginx-access.log;
    error_log /home/nginx-error.log warn;

    location /checksum {
        log_format upstream_logging '$remote_addr - $remote_user [$time_local] '
                                    '"$request" $status $body_bytes_sent '
                                    '"$http_referer" "$http_user_agent" "$gzip_ratio"'
                                    '"$upstream_connect_time" "$upstream_header_time" "$upstream_response_time" "$request_time"';

        access_log /home/upstreams.log upstream_logging;

        proxy_pass http://ima;
        proxy_redirect     off;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Host $server_name;
        proxy_next_upstream error timeout;
        proxy_intercept_errors off;
    }
  }


У нас serverA - это ELB, который ссылается на 16 инстансов сервиса в Kubernetes.

В upstream используется один и тот же сервер serverA пять раз. Это сделали до меня как обходной путь, если первый процессинг выпадет с ошибкой или Pod сервиса не доступен, тогда Nginx переключится на следующий бэкап сервер serverA и снова запустит процесс. Эта затычка работает и успешно.

Но, на выходных запускали нагрузочный тест, слали большой объем данных и запросов одновременно, в понедельник заметили много 499 ошибок в логах Nginx (“GET /result/final/id-goes-here HTTP/1.1” 499 0 “-“ “Our Client Name” “-“ “-“ “-“ “-“ “64.587”), а когда начали дергать этот сервис вручную, то заметили, что он отваливается в ручную по таймауту, возвращая Could not get any response страницу в Postman.

Что интересно, это только Nginx тупил возвращать результат, когда запускали запрос напрямую на upstream сервер (ELB), то он возвращал результат. Предположили, что во время большой нагрузки, Nginx пометил все сервера (одинаковые) в upstream как down, и поэтому ничего не возвращал, подвисал на запросе и отваливался на таймауте. Вопросов появилось больше чем ответов.

Кто-то сталкивался с подобным в своей практике? Как решали? Возможно, есть подобные случаи?

Спасибо.
  • Вопрос задан
  • 399 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы