Балансировка нагрузки Nginx не соответствует ожидаемой - PullRequest
2 голосов
/ 20 марта 2019

Мы подключаемся к системе, в которой через 4 порта обслуживаются запросы grpc.Использовал nginx в качестве балансировщика нагрузки для пересылки 4 клиентских запросов grpc со следующей конфигурацией:

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent"';

    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }
    upstream backend{
        #least_conn;
        server localhost:9000 weight=1 max_conns=1;
        server localhost:9001 weight=1 max_conns=1;
        server localhost:9002 weight=1 max_conns=1;
        server localhost:9003 weight=1 max_conns=1;
        }

    server {
        listen 80 http2;

        access_log /tmp/access.log main;
        error_log /tmp/error.log error;

        proxy_buffering off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_set_header Host $http_host;

        location / {
                #eepalive_timeout 0;
                grpc_pass grpc://backend;
                grpc_pass_header userid;
                grpc_pass_header transid;
        }
    }
}

Замечено, что несколько раз все запросы клиента 4 идут на все 4 порта, но иногда (скажем, 30%) только2 порта / 3 порта.Похоже, что циклический перебор по умолчанию не происходит с NGINX, как ожидалось.Мы перепробовали все возможности, такие как max_conns, less_conn, weight, но не повезло.

Похоже, я столкнулся с проблемой, как показано в ссылках ниже:

https://serverfault.com/questions/895116/nginx-round-robin-nor-exactly-round-robin
https://stackoverflow.com/questions/40859396/how-to-test-load-balancing-in-nginx

Когда я проходил через Quora, обнаружил, что "честный" модуль в nginx решит эту проблему.

    "The Nginx fair proxy balancer enhances the standard round-robin load 
    balancer provided with Nginx so that it will track busy back end servers (e.g. Thin, Ebb, Mongrel) and balance the load to non-busy server processes. "

https://www.quora.com/What-is-the-best-way-to-get-Nginx-to-do-smart-load-balancing

Я пытался использовать "честный" модуль с NGINX из исходного кода, но столкнулся с таким количеством проблем.Я не мог запустить сам NGINX.Кто-нибудь может помочь с этой проблемой?

1 Ответ

2 голосов
/ 25 марта 2019

Мы получили ответ !!!!Только что изменил "worker_processes auto;"to "worker_processes 1;"Теперь все работает нормально.

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

...