nginx - Balanceador de carga - Atraso considerável quando o nó de upstream está offline / inativo

7

Executando o nginx 1.0.15 no CentOS 6.5 . Eu tenho três servidores upstream e tudo funciona bem, no entanto, quando eu simular uma interrupção e levar um dos servidores upstream para baixo, percebo um atraso considerável nos tempos de resposta (5-7 segundos adicionais). No segundo que eu trago o servidor downed de volta online, o lag desaparece. Além disso, outra coisa estranha que eu notei, se eu simplesmente parar o serviço httpd no servidor de interrupção simulado, os tempos de resposta são normais, o atraso só ocorre se o servidor estiver completamente inativo.

Aqui está o meu 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";
    }
}

Eu tentei as sugestões em postagens semelhantes como esta . E, aparentemente, minha versão do nginx é muito antiga para suportar health_checks, conforme descrito nos docs do nginx. Eu também tentei definir explicitamente a max_fails=2 e fail_timeout=120 na definição% upstream doapp-a-3, mas nenhuma delas parece evitar o atraso adicional de 5 a 7 segundos para cada solicitação se app-a-3 estiver offline.

- Atualização -

Por solicitação, aqui está a saída para uma única solicitação quando app-a-3 está totalmente inativo. A única coisa que eu podia ver fora do normal é o atraso de 3 segundos entre o evento inicial e o evento subsequente.

- Atualização # 2 -

Parece que há alguns anos o Nginx decidiu criar o Nginx Plus, que adiciona verificações de integridade ativas, mas para um contrato de suporte anual. Com base em alguns artigos que li, a Nginx se cansou de fazer milhões às empresas e não recebeu nada em troca.

Como mencionado nos comentários, estamos começando e não temos o $ $ $ para arrendar um contrato de $ 1.350. Eu encontrei este repo que fornece a funcionalidade. Imaginando se alguém tem alguma experiência com isso? Estável? Desempenho?

No pior caso, vou ter que morder a bala e pagar o extra de $ 20 / mês por um Linode "Node Balancer", que tenho certeza que é baseado no Nginx Plus. O único problema é que não há controle sobre a configuração além de algumas opções genéricas, portanto, não há como suportar vários arquivos vhost através de um balanceador, e todos os nós precisam estar no mesmo datacenter.

- Atualização # 3 -

Aqui estão alguns resultados de cerco . Parece que o segundo nó está mal configurado, já que é capaz de lidar com apenas cerca de 75% dos pedidos que o primeiro e o terceiro nós estão manipulando. Também achei estranho, que quando eu coloquei o segundo nó offline, o desempenho foi tão ruim quanto se eu tivesse o terceiro (melhor desempenho) nó offline. A lógica ditaria que, se eu removesse o elo fraco (segundo nó), obteria melhor desempenho, porque os dois nós restantes têm um desempenho melhor do que o elo fraco, individualmente.

Resumindo:

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
    
por Mike Purcell 27.08.2014 / 20:42

3 respostas

2

Nas últimas semanas, trabalhei com a equipe de engenharia de pré-vendas da NGINX na tentativa de resolver o problema antes de adquirir o contrato de suporte. Depois de muitos ajustes e colaborações, a única conclusão que poderíamos supor para o aumento da defasagem quando um único nó fica completamente escuro é que os servidores em questão estavam todos executando o muito mais antigo Apache 2.2.

Os engenheiros do NGINX não conseguiram recriar o problema usando o Apache 2.4.x, de modo que seria a minha correção sugerida se alguém mais encontrasse a mesma situação. No entanto, para o nosso projeto, estou trabalhando para me afastar do Apache e implementar o NGINX com o php-fpm.

No fechamento, nosso ambiente será usar o NGINX + (requer o contrato de suporte) como o balanceador de carga devido à capacidade de emitir verificações de saúde para nós de envio e emitir solicitações por meio de round-robin para nós de envio executando NGINX (FOSS) .

    
por 02.10.2014 / 17:29
5

Se o nginx enviar uma solicitação para uma porta fechada em um servidor com uma pilha IP funcional, receberá uma confirmação negativa imediata. Se não houver nenhum servidor lá para responder (ou se você soltar o pacote de entrada em um firewall), então você terá que esperar a conexão expirar.

A maioria dos balanceadores de carga tem um mecanismo de pesquisa e / ou pulsação para verificar preventivamente um servidor inativo. Você pode querer olhar para essas opções. A pesquisa geralmente não é executada em um servidor da Web mais de uma vez ou duas vezes por minuto, mas uma verificação de pulsação para situações de inatividade do servidor pode ser a cada segundo, aproximadamente.

O Nginx não é o mais sofisticado dos balanceadores de carga. Se você estiver enfrentando esse tipo de problema, talvez queira ver outras opções.

EDIT: Algo como isso talvez? link . Para uma instalação pequena, não há necessidade de servidores separados, basta colocá-lo nas caixas do servidor web. Isso fornece o balanceamento de carga, mas não o armazenamento em cache. Existem também soluções de HA que controlam a lula ou o verniz em resposta a um batimento cardíaco.

    
por 31.08.2014 / 08:56
2

Algumas coisas que você pode tentar

  1. Atualize para a versão mais recente do nginx no link oficial
  2. Tente reduzir a configuração proxy_connect_timeout para algo realmente baixo para teste, digamos 1 segundo. link
por 03.09.2014 / 19:21