Como fazer o servidor de balanceamento de carga NGINX sem fazer proxy das solicitações?

1

Não consegui encontrar uma solução para o problema, então esta é a minha pergunta.

Digamos que eu tenha 3 servidores, 2 deles são servidores upstream e 1 é um balanceador de carga.

Estas são minhas configurações básicas

Servidores upstream

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 768;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    gzip on;
    gzip_disable "msie6";

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Balanceador de carga

worker_processes  auto;

worker_rlimit_nofile 100000;

error_log off;

events {
    worker_connections  5000;
    multi_accept on;
    use epoll;
}


http {
    upstream myapp1 {
        server 138.197.122.195;
        server 138.197.122.293;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;
            proxy_set_header X-Real-IP  $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header Host $host;
        }
    }
}

O que eu quero alcançar é enviar / redirecionar solicitações de usuários para os servidores upstream usando o recurso de balanceamento de carga round robin do nginx. Os upstreams então servirão conteúdo diretamente aos usuários.

O papel do balanceador de carga aqui não é reduzir a carga para upstreams por proxy, mas distribuir igualmente solicitações para eles. No entanto, com essas configurações, todas as solicitações & respostas passará pelo balanceador de carga, consuma sua largura de banda. Existe outra maneira de arredondar as solicitações de redirecionamento robin com o NGINX? Por favor ajude.

A razão pela qual eu quero fazer isso é que eu tenho uma largura de banda limitada para um balanceador de carga decente (alto custo), portanto, não posso escalar efetivamente. Por exemplo, digamos que 3 servidores tenham 100mbps de largura de banda cada, se um usuário consumir 1mbps, o balanceador de carga será um gargalo se houver 101 usuários. Se eu puder distribuir o tráfego igualmente para ambas as upstream, o sistema pode servir até 200 usuários teoricamente.

Na maioria dos tópicos semelhantes, encontrei pessoas usando o método DNS round robin. Eu testei, mas não é confiável por causa do cache de registros na própria hierarquia do DNS, bem como pelo cache e reutilização de endereços do lado do cliente.

    
por David Tran 20.11.2017 / 12:37

1 resposta

0

Você está enganado um pouco. Round Robin é um método de balanceamento de carga. O que você deseja alcançar é algo chamado DNS Round Robin .

Mas mesmo aqui, você pode ver no link, você terá seu tráfego passando pelo seu balanceador de carga porque esse é o ponto principal. Você pode tentar deixar o balanceador de carga para fora e instalar apenas os dois servidores, mas terá que definir ambos os endereços IP para o mesmo nome de domínio. Embora isso possa alcançar o que você queria, isso não será bom para você, porque tem a chance de uma sessão de usuário ser descartada e retirada pelo outro servidor durante o acesso ao meio. E nós não falamos sobre replicações de banco de dados até agora, o que também é um problema neste caso.

Minha recomendação é investir um pouco mais na largura de banda dos servidores loadbalancer e você não terá problemas. Ainda mais, eu usaria o Session persistence para que seus usuários sempre fiquem no servidor ao qual se juntaram.

Nginx como loadbalancer

    
por 20.11.2017 / 14:42