Балансировка нагрузки с помощью NginX

Для увеличения производительности и уменьшения времени обработки запросов в высоконагруженных системах с повышенными требованиями к оптимизации ресурсов рекомендуется настроить балансировку нагрузки с помощью nginx.

Если нагрузка балансируется, входящий поток запросов вместо того, чтобы направиться на обработку в единственный экземпляр компонента, проходит через прокси-сервер и распределяется между несколькими экземплярами этого компонента в режиме round-robin (циклически). Результатом является значительное уменьшение времени ожидания обработки запроса, а также улучшение общей производительности, масштабируемости и надежности системы.

Нагрузка может быть сбалансирована для следующих компонентов:

Компонент Рекомендуемое количество экземпляров на одном физическом сервере
findface-facenapi Одного экземпляра на сервер обычно бывает достаточно. Применительно к компоненту findface-facenapi нагрузка обычно балансируется только в кластерной среде между несколькими физическими серверами findface-facenapi.
findface-nnapi Количество ядер процессора минус 1. Дает значительный выигрыш в производительности.
extraction-api 1 (нагрузка балансируется автоматически). Балансировка нагрузки через nginx применяется только к экземплярам extraction-api, установленным на различных физических серверах.

Приведенная ниже пошаговая инструкция демонстрирует настройку балансировки нагрузки через nginx для 2-х экземпляров findface-nnapi на одном физическом сервере. Нагрузка остальных компонентов может быть сбалансирована по аналогии.

Выполните следующие действия:

  1. При необходимости установите nginx на серверы с findface-nnapi (nginx устанавливается автоматически вместе с компонентом findface-upload).

    sudo apt-get install nginx
    
  2. Скопируйте содержимое файла /lib/systemd/system/findface-nnapi.service в новый файл /etc/systemd/system/findface-nnapi@.service.

    sudo cp /lib/systemd/system/findface-nnapi.service /etc/systemd/system/findface-nnapi@.service
    
  3. Остановите все сервисы findface-nnapi и удалите их из автозагрузки. Отредактируйте новый файл findface-nnapi@.service, добавив в конец строки ExecStart опцию --listen 127.0.0.1:%i.

    sudo service findface-nnapi stop && sudo systemctl disable findface-nnapi
    
    sudo vi /etc/systemd/system/findface-nnapi@.service
    
    ExecStart=/usr/bin/findface-nnapi -c /etc/findface-nnapi.ini --listen 127.0.0.1:%i
    
  4. Создайте новый файл конфигурации nginx.

    sudo vi /etc/nginx/sites-available/nnapi
    
  5. Вставьте следующий текст в файл конфигурации. В тексте замените номера портов, предложенные для экземпляров findface-nnapi (upstream nnapibackends), и номер слушающего порта (listen) на актуальные значения. Номера портов должны быть уникальны для каждого компонента на сервере.

    upstream nnapibackends {
            server 127.0.0.1:18090;
            server 127.0.0.1:18091;
    }
    server {
            listen 18088;
            server_name nnapi;
            client_max_body_size 64m;
            location / {
                    proxy_pass http://nnapibackends;
                    proxy_next_upstream error;
            }
            access_log /var/log/nginx/nnapi.access_log;
            error_log /var/log/nginx/nnapi.error_log;
    }
    
  6. Включите балансировщик нагрузки в nginx.

    sudo ln -s /etc/nginx/sites-available/nnapi /etc/nginx/sites-enabled/
    
  7. Перезапустите nginx.

    sudo service nginx restart
    
  8. Добавьте каждый экземпляр findface-nnapi в автозагрузку.

    sudo systemctl enable findface-nnapi@18090
    sudo systemctl enable findface-nnapi@18091
    
  9. Запустите экземпляры findface-nnapi.

    sudo systemctl start findface-nnapi@18090
    sudo systemctl start findface-nnapi@18091
    
  10. Теперь запросы, отправленные в findface-nnapi, будут распределяться между двумя экземплярами findface-nnapi в режиме round-robin. Распределение запросов наглядно отображается в логе findface-nnapi /var/log/syslog (обратите внимание на различные значения id процессов).

    sudo tail -f /var/log/syslog | grep nnapi
    Jul  7 03:53:05 ubuntu findface-nnapi[49606]: (2017-07-07 10:53:05) [INFO    ] Request: 127.0.0.1:34494 0x7fb100000960 HTTP/1.0 POST /facen
    Jul  7 03:53:06 ubuntu findface-nnapi[49606]: (2017-07-07 10:53:06) [INFO    ] Response: 0x7fb100000960 /facen?x2=0&y1=0&x1=0&y2=0 200 0
    Jul  7 03:53:06 ubuntu findface-nnapi[49624]: (2017-07-07 10:53:06) [INFO    ] Request: 127.0.0.1:52960 0x7f9cf8000960 HTTP/1.0 POST /facen
    Jul  7 03:53:06 ubuntu findface-nnapi[49624]: (2017-07-07 10:53:06) [INFO    ] Response: 0x7f9cf8000960 /facen?x2=0&y1=0&x1=0&y2=0 200 0
    Jul  7 03:53:32 ubuntu findface-nnapi[49606]: (2017-07-07 10:53:32) [INFO    ] Request: 127.0.0.1:34502 0x7fb100001ec0 HTTP/1.0 POST /facen
    Jul  7 03:53:32 ubuntu findface-nnapi[49606]: (2017-07-07 10:53:32) [INFO    ] Response: 0x7fb100001ec0 /facen?x2=0&y1=0&x1=0&y2=0 200 0
    Jul  7 03:53:32 ubuntu findface-nnapi[49624]: (2017-07-07 10:53:32) [INFO    ] Request: 127.0.0.1:52968 0x7f9cf8001ec0 HTTP/1.0 POST /facen
    Jul  7 03:53:33 ubuntu findface-nnapi[49624]: (2017-07-07 10:53:33) [INFO    ] Response: 0x7f9cf8001ec0 /facen?x2=0&y1=0&x1=0&y2=0 200 0
    

Совет

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