nginx - Подсистема балансировки нагрузки - Значительная задержка, когда восходящий узел офлайн/вниз

Выполнение nginx 1.0.15 на CentOS 6.5. У меня есть три вышестоящих сервера, и все хорошо работает, однако когда я моделирую отключение электричества и удаляю один из вышестоящих серверов, я замечаю значительную задержку в ответ времена (дополнительные 5-7 секунд). Второе я возвращаю побежденный сервер онлайн, задержка, исчезает. Кроме того, другая странная вещь, которую я заметил, если я просто останавливаю httpd сервис на моделируемый сервер отключения электричества, время отклика, нормальна, задержка только происходит, если сервер полностью снижается.

Вот мой conf:

upstream prod_example_com {

    server app-a-1:51000;

    server app-a-2:51000;

    server app-a-3:51000;

}


server {

    # link:  http://wiki.nginx.org/MailCoreModule#server_name
    server_name example.com www.example.com *.example.com;

    #-----
    # Upstream logic
    #-----


    set $upstream_type prod_example_com;


    #-----

    include include.d/common.conf;

    # Configure logging
    access_log  /var/log/nginx/example/access/access.log access;
    error_log   /var/log/nginx/example/error.log error;

    location / {

        # link: http://wiki.nginx.org/HttpProxyModule#proxy_pass
        proxy_pass  http://$upstream_type$request_uri;

        # link: http://wiki.nginx.org/HttpProxyModule#proxy_set_header
        proxy_set_header    Host    $host;
        proxy_set_header    X-Real-IP   $remote_addr;
        proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {

        # link: http://wiki.nginx.org/HttpProxyModule#proxy_pass
        proxy_pass  http://$upstream_type$request_uri;

        # link: http://wiki.nginx.org/HttpProxyModule#proxy_set_header
        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_hide_header expires;
        proxy_hide_header Cache-Control

         # Even tho this reads like the older syntax, it is handled internally by nginx to set max age to now + 1 year
         expires max;

        # Allow intermediary caches the ability to cache the asset
        add_header Cache-Control "public";
    }
}

Я попробовал предложения на подобных сообщениях как это. И по-видимому моя версия nginx слишком стара для поддержки health_checks, как обрисовано в общих чертах в nginx документах. Я также попытался явно установить max_fails=2 и fail_timeout=120 на app-a-3 восходящее определение, но ни один из них, кажется, не избегает задержки дополнительных 5-7 секунд для каждого запроса если app-a-3 в режиме офлайн.

- Обновление-

На запрос вот вывод для единственного запроса когда app-a-3 полностью снижается. Единственной вещью, которую я видел необычный, являются 3 вторых задержки между начальным событием и последующим событием.

- Обновление № 2--

Похож несколько лет назад на Nginx, решенный для создания Nginx Плюс, который добавляет активные проверки состояния, но для ежегодного контракта на поддержку. На основе некоторых статей я читал, Nginx устал от создания компаний миллионы и получение ничего в ответ.

Как упомянуто в комментариях мы загружаем и не имеем $$ для броска в контракт за 1 350$. Я действительно находил этот repo, который обеспечивает функциональность. Удивление, если у кого-либо есть опыт с ним? Стабильный? Производительный?

Худший вариант развития событий, к которому я буду просто иметь, стиснул зубы, и заплатите дополнительные $20 / месяц для Linode "Стабилизатор Узла", который я вполне уверен, базируется прочь Nginx Плюс. Единственная проблема нет никакого управления конфигурацией кроме нескольких универсальных опций, таким образом, никакой способ поддерживать несколько vhost файлов через один стабилизатор и все узлы не должен быть в том же центре обработки данных.

- Обновление № 3--

Вот некоторые результаты осады. Кажется, что второй узел неправильно конфигурируется, поскольку это только может обработать приблизительно 75% запросов, которые обрабатывают первые и третьи узлы. Также я думал это нечетный, что, когда я вывел второй узел из эксплуатации, производительность была так же плоха, как будто я взял третье (лучше работающий) узел офлайн. Логика продиктовала бы что, если бы я удалил слабое звено (второй узел), что я получил бы лучшую производительность, потому что оставление двумя узлами работает лучше, чем слабое звено, индивидуально.

Короче говоря:

node 1, 2, 3 + my nginx = 2037 requests

node 1, 2 + my nginx  = 733 requests

node 1, 3 + my nginx = 639 requests (huh? these two perform better individually so together should be somewhere around ~1500 requests, based on 2000 requests when all nodes are up)

node 1, 3 + Linode Load Balancer = 790 requests

node 1, 2, 3 + Linode Load Balancer = 1,988 requests
7
задан 13 April 2017 в 15:13
3 ответа

В течение последних нескольких недель я работал с группой предпродажного инжиниринга NGINX, пытаясь решить проблему до того, как я приобрету контракт на поддержку. После долгих согласований и совместной работы, единственный вывод, который мы могли сделать для увеличения отставания, когда один узел становится полностью мрачным, - это то, что на всех серверах, о которых идет речь, работал гораздо более старый Apache 2.2.

Инженеры NGINX не смогли воссоздать проблему, используя Apache 2.4.x, так что это было бы моим предлагаемым исправлением, если кто-нибудь ещё столкнётся с такой же ситуацией. Однако, для нашего проекта я работаю над тем, чтобы полностью отказаться от Apache и реализовать NGINX с php-fpm.

В заключение, наше окружение будет использовать NGINX+ (требует контракта на поддержку) в качестве балансировщика нагрузки, так как он может выдавать проверки работоспособности на восходящих узлах, а также выдавать запросы через маршрутизатор на восходящие узлы, работающие под управлением NGINX (FOSS).

.
2
ответ дан 2 December 2019 в 23:33

Если nginx отправит запрос на закрытый порт сервера с функциональным IP-стеком, то получит немедленное отрицательное подтверждение. Если там нет сервера для ответа (или если вы уронили входящий пакет на брандмауэр), то вам придётся подождать тайм-аута соединения.

Большинство балансировщиков нагрузки имеют механизм опроса и/или сердцебиение для упреждающей проверки неработающего сервера. Вы, возможно, захотите изучить эти опции. Опрос обычно не выполняется на веб-сервере более одного-двух раз в минуту, но проверка на отказ сервера может происходить каждую секунду или около того.

Nginx не является самым сложным из балансировщиков нагрузки. Если вы сталкиваетесь с подобными проблемами, то, возможно, захотите взглянуть на другие варианты.

EDIT: Может быть, что-то вроде этого? http://www.howtoforge.com/setting-up-a-high-availability-load-balancer-with-haproxy-heartbeat-on-debian-lenny . Для небольшой инсталляции нет необходимости в отдельных серверах, просто поместите это на коробки веб-сервера. Это дает балансировку нагрузки, но не кэширование. Есть также HA-решения, которые управляют кальмаром или лаком в ответ на сердцебиение.

.
5
ответ дан 2 December 2019 в 23:33

Пару вещей можно попробовать

  1. Обновление до последней версии nginx из официального репозитория http://nginx.org/en/linux_packages.html#stable
  2. Попробуйте уменьшить настройку proxy_connect_timeout, установив ее на что-то действительно низкое для тестирования скажем 1 секунду. http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_connect_timeout
2
ответ дан 2 December 2019 в 23:33

Теги

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