Стандартное развертывание в многосерверной среде

Данный раздел посвящен развертыванию FindFace Multi в многосерверной среде.

Совет

Если после прочтения данного раздела у вас остались вопросы, не стесняйтесь задать их нашим экспертам по адресу support@ntechlab.com.

Важно

В данном разделе не рассматривается развертывание функционала Видеомагнитофон. Вы можете найти соответствующую пошаговую инструкцию здесь.

Развертывание FindFace Multi на нескольких серверах может быть необходимо по следующим причинам:

  • Необходимость в распределении высокой нагрузки при обработке видео.

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

    Примечание

    Актуально для сетей гостиниц, магазинов, при наличии нескольких проходных в одном здании и др.

  • Необходимость в распределении высокой нагрузки при извлечении векторов признаков.

  • В поиске задействовано большое количество объектов, что требует реализации распределенной базы данных.

Перед тем как приступить к развертыванию, постройте архитектурную схему с учетом будущей нагрузки системы и выделенных под нее аппаратных ресурсов (см. Требования). Наиболее распространенной схемой является следующая:

  • Центральный сервер с установленными компонентами findface-ntls, findface-security, findface-sf-api, findface-video-manager, findface-upload, findface-video-worker, findface-extraction-api, findface-tarantool-server, pause, а также сторонним программным обеспечением.

  • Несколько дополнительных серверов для обработки видео с установленным компонентом findface-video-worker.

  • (При необходимости) Несколько дополнительных серверов для извлечения векторов признаков (т. н. серверы экстракции) с установленным компонентом findface-extraction-api.

  • (При необходимости) Дополнительные серверы базы данных с несколькими шардами Tarantool на каждом.

Инструкции в настоящем разделе приведены для описанной выше наиболее часто встречающейся схемы многосерверного развертывания. В высоконагруженных системах также может потребоваться распределить обработку API-запросов, т. е. организовать несколько серверов findface-sf-api и findface-video-manager. Данная процедура требует высокого уровня знаний и дополнительного программирования. Пожалуйста, не стесняйтесь обращаться к нашим экспертам за помощью по этому вопросу (support@ntechlab.com).

Развертывание FindFace Multi в многосерверной среде состоит из следующих этапов:

Развертывание центрального сервера

Для развертывания центрального сервера FindFace Multi выполните следующие действия:

  1. На выделенном физическом сервере установите FindFace Multi из инсталлятора следующим образом (до развертывания FindFace Multi не забудьте подготовить сервер):

    • Устанавливаемый продукт: FindFace Multi.

    • Тип установки: Single server, multiple video workers. В этом случае FindFace Multi будет установлен в качестве центрального сервера и настроен на взаимодействие с дополнительными удаленными экземплярами findface-video-worker.

    • Тип ускорения findface-video-worker (на центральном сервере): CPU или GPU, в зависимости от конфигурации оборудования.

    • Тип ускорения findface-extraction-api (на центральном сервере): CPU или GPU, в зависимости от конфигурации оборудования.

    По завершении установки в консоль будет выведена информация, необходимая для использования FindFace Multi:

    #############################################################################
    #                       Installation is complete                            #
    #############################################################################
    - all configuration and data is stored in /opt/findface-multi
    - upload your license to http://172.20.77.17/#/license/
    - user interface: http://172.20.77.17/
      superuser:      admin
      documentation:  http://172.20.77.17/doc/
    
  2. Загрузите файл лицензии FindFace Multi через основной веб-интерфейс http://<IP_адрес_сервера>/#/license. Для доступа в веб-интерфейс используйте логин и пароль пользователя superuser, выведенные в консоли.

    Примечание

    IP-адрес сервера в ссылках на веб-интерфейсы FindFace имеет вид 127.0.0.1 или <IP_адрес_в_сети>, в зависимости от того, принадлежит ли сервер к сети.

    Важно

    Не передавайте данные superuser (Супер Администратора) третьим лицам. Для администрирования системы создайте назначаемого администратора. Отличие назначаемого администратора от Супер Администратора в том, что последний не может лишиться прав администратора даже при смене роли.

  3. Разрешите лицензируемым сервисам обращаться к серверу лицензирования findface-ntls с любого IP-адреса. Для этого, откройте файл конфигурации /opt/findface-multi/configs/findface-ntls/findface-ntls.yaml и установите listen: 0.0.0.0:3133. Перезапустите контейнер findface-multi-findface-ntls-1.

    sudo vi /opt/findface-multi/configs/findface-ntls/findface-ntls.yaml
    
    listen: 0.0.0.0:3133
    
    sudo docker container restart findface-multi-findface-ntls-1
    
  4. Разрешите доступ к сервису findface-video-manager с любого IP-адреса. Для этого откройте файл конфигурации /opt/findface-multi/configs/findface-video-manager/findface-video-manager.yaml и установите listen: 0.0.0.0:18810 и rpc:listen: 0.0.0.0:18811. Перезапустите контейнер findface-multi-findface-video-manager-1.

    sudo vi /opt/findface-multi/configs/findface-video-manager/findface-video-manager.yaml
    
    listen: 0.0.0.0:18810
    ...
    rpc:
      listen: 0.0.0.0:18811
    
    sudo docker container restart findface-multi-findface-video-manager-1
    

Развертывание серверов обработки видео

На дополнительном сервере для обработки видео установите экземпляр findface-video-worker, руководствуясь пошаговыми инструкциями. Ответьте на вопросы инсталлятора следующим образом:

  • Устанавливаемый продукт: FindFace Video Worker.

  • Тип ускорения findface-video-worker: CPU или GPU, в зависимости от конфигурации оборудования.

  • FindFace Multi IP address: IP-адрес центрального сервера.

После этого процесс установки будет автоматически запущен. Ответы на вопросы инсталлятора будут сохранены в файл /tmp/<findface-installer-*>.json. Используйте данный файл, чтобы установить FindFace Video Worker на других серверах, не отвечая на вопросы инсталлятора повторно. Для этого запустите инсталлятор командой:

sudo ./<findface-*>.run -f /tmp/<findface-installer-*>.json

Примечание

Если findface-ntls и/или findface-video-manager установлены на серверах, отличных от сервера findface-security, укажите их IP-адреса после установки в файле конфигурации /opt/findface-multi/configs/findface-video-worker/findface-video-worker.yaml.

sudo vi /opt/findface-multi/configs/findface-video-worker/findface-video-worker.yaml

В параметре ntls_addr укажите IP-адрес сервера findface-ntls.

ntls_addr: 127.0.0.1:3133

В параметре mgr -> static укажите IP-адрес сервера findface-video-manager, который будет обеспечивать findface-video-worker настройками и списком видеопотоков для обработки.

static: 127.0.0.1:18811

Развертывание серверов экстракции

На дополнительном сервере экстракции установите экземпляр findface-extraction-api из консольного инсталлятора. Ответьте на вопросы инсталлятора следующим образом:

  • Устанавливаемый продукт: FindFace Multi.

  • Тип установки: Fully customized installation.

  • Устанавливаемые компоненты FindFace Multi: findface-extraction-api, findface-data и pause. Для того чтобы их выбрать, сначала снимите выделение со всех компонентов, введя в командной строке -*, затем введите порядковые номера findface-extraction-api, findface-data и pause через пробел. Введите done для сохранения выбора и перехода к следующему шагу.

    Примечание

    Компонент pause хранит информацию о сетевых идентификаторах (namespaces) других компонентов. Обязательно установите его.

  • Тип ускорения findface-extraction-api: CPU или GPU.

  • Необходимость в изменении файла конфигурации /opt/findface-multi/configs/findface-extraction-api/findface-extraction-api.yaml: укажите IP-адрес сервера findface-ntls.

  • Модели нейронных сетей для установки: CPU/GPU-модели для биометрии лиц (обязательно) и (опционально) CPU/GPU-модели для распознавания атрибутов лица, транспортных средств и их атрибутов, силуэтов и их атрибутов. Удостоверьтесь, что для каждой модели вы указали правильный тип ускорения: CPU или GPU. Он должен совпадать с типом ускорения findface-extraction-api. Обратите внимание, что findface-extraction-api на CPU может работать только с CPU-моделями, в то время как findface-extraction-api на GPU поддерживает как GPU-, так и CPU-модели.

  • Чтобы переместить основной экземпляр findface-extraction-api на другой хост, в файле конфигурации /opt/findface-multi/configs/findface-sf-api/findface-sf-api.yaml укажите IP-адрес хоста сервера экстракции и установите listen: 0.0.0.0:18411.

    listen: 0.0.0.0:18411
    extraction-api:
      timeouts:
        connect: 5s
        response_header: 30s
        overall: 35s
        idle_connection: 10s
      max-idle-conns-per-host: 20
      keepalive: 24h0m0s
      trace: false
      extraction-api: http://172.20.77.19:18666
    

После этого процесс установки будет автоматически запущен. Ответы на вопросы инсталлятора будут сохранены в файл /tmp/<findface-installer-*>.json. Используйте данный файл, чтобы установить findface-extraction-api на других серверах, не отвечая на вопросы инсталлятора повторно.

sudo ./<findface-*>.run -f /tmp/<findface-installer-*>.json

После развертывания серверов экстракции распределите между ними нагрузку.

Распределение нагрузки между серверами экстракции

Распределение нагрузки между несколькими серверами экстракции выполняется через балансировщик нагрузки. Приведенная ниже пошаговая инструкция демонстрирует балансировку нагрузки с помощью nginx в режиме round-robin для 3-х экземпляров findface-extraction-api, расположенных на различных физических серверах. Один экземпляр установлен на центральном сервере FindFace Multi (172.168.1.9), 2 других на дополнительных удаленных серверах (172.168.1.10, 172.168.1.11). Если в системе присутствует большее количество серверов экстракции, балансировка нагрузки выполняется по аналогии.

Совет

Вы можете использовать любой удобный вам балансировщик нагрузки. Руководство по его использованию ищите в соответствующей справочной документации.

Для балансировки нагрузки между экземплярами findface-extraction-api выполните следующие действия:

  1. Назначьте т. н. сервер шлюза для балансируемой группы серверов экстракции. Им может стать центральный сервер FindFace Multi (рекомендуется) или любой другой сервер с включенным сервисом findface-sf-api.

    Важно

    Вам нужно будет указать IP-адрес шлюза при настройке распределенной сети FindFace Multi.

  2. На сервере с включенным сервисом findface-sf-api создайте в каталоге /opt/findface-multi/configs/ папку nginx, содержащую файл extapi.conf. Убедитесь, что файл extapi.conf содержит информацию, как в примере ниже. В директиве upstream (upstream extapibackends) замените примерные IP-адреса на актуальные IP-адреса серверов экстракции. В директиве server в параметре listen укажите номер слушающего порта сервера шлюза. Вам потребуется указать данный порт при настройке FindFace Multi network.

    upstream extapibackends {
            server 172.168.1.9:18666; ## ``findface-extraction-api`` on principal server
            server 172.168.1.10:18666; ## 1st additional extraction server
            server 127.168.1.11:18666; ## 2nd additional extraction server
    }
    server {
            listen 18667;
            server_name extapi;
            client_max_body_size 64m;
            location / {
                    proxy_pass http://extapibackends;
                    proxy_next_upstream error;
            }
            access_log /var/log/nginx/extapi.access_log;
            error_log /var/log/nginx/extapi.error_log;
    }
    
  3. Обозначьте сервис Nginx в файле docker-compose.yaml. Для этого внесите в файл docker-compose.yaml запись о контейнере с образом Nginx:

    sudo vi /opt/findface-multi/docker-compose.yaml
    
    nginx:
      image: nginx:latest
      ports:
        - 18667:18667
      volumes:
        - ./configs/nginx/extapi.conf:/etc/nginx/conf.d/default.conf:ro
    
  4. В конфигурационном файле findface-sf-api укажите адрес распределителя:

    sudo vi /opt/findface-multi/configs/findface-sf-api/findface-sf-api.yaml
    
    listen: 0.0.0.0:18411
    ...
    extraction-api: http://172.168.1.9:18667
    
  5. Перезапустите контейнеры.

    cd /opt/findface-multi/
    sudo docker-compose down
    sudo docker-compose up -d
    
  6. На центральном сервере и каждом из дополнительных серверов экстракции откройте файл конфигурации /opt/findface-multi/configs/findface-extraction-api/findface-extraction-api.yaml. Замените адрес localhost в параметре listen на адрес, который вы указали до этого в директиве upstream extapibackends файла конфигурации Nginx (/opt/findface-multi/configs/nginx/extapi.conf). В нашем примере адрес 1-го дополнительного сервера экстракции должен быть заменен на следующий:

    sudo vi /opt/findface-multi/configs/findface-extraction-api/findface-extraction-api.yaml
    
    listen: 172.168.1.10:18666
    
  7. Перезапустите контейнер findface-multi-findface-extraction-api-1 на центральном сервере и каждом дополнительном сервере экстракции.

    sudo docker container restart findface-multi-findface-extraction-api-1
    

Балансировка нагрузки успешно настроена. Не забудьте указать актуальный IP-адрес и слушающий порт сервера шлюза при настройке распределенной сети FindFace Multi.

Развертывание дополнительных серверов базы данных

Компонент findface-tarantool-server соединяет базу данных векторов признаков на основе Tarantool и компонент findface-sf-api, передавая результаты поиска от базы данных в findface-sf-api для дальнейшей обработки.

Чтобы увеличить скорость поиска, можно выделить несколько дополнительных серверов под базу данных векторов признаков и создать множество сегментов (шардов) findface-tarantool-server на каждом из них. Параллельное функционирование многочисленных шардов приведет к значительному увеличению производительности, поскольку каждый шард может обрабатывать приблизительно до 10 000 000 векторов признаков.

Чтобы развернуть дополнительные серверы базы данных, выполните следующие действия:

  1. Установите компонент findface-tarantool-server на первом выделенном под базу данных сервере. Компонент pause должен быть уже установлен на сервере. В противном случае установите компонент pause вместе с компонентом findface-tarantool-server. Ответьте на вопросы инсталлятора следующим образом:

    • Устанавливаемый продукт: FindFace Multi.

    • Тип установки: Fully customized installation.

    • Устанавливаемые компоненты FindFace Multi: findface-tarantool-server, pause. Для того чтобы их выбрать, сначала снимите выделение со всех компонентов, введя в командной строке -*, затем введите порядковый номер findface-tarantool-server, pause (keyword). Введите done для сохранения выбора и перехода к следующему шагу.

    После этого процесс установки будет автоматически запущен.

    В результате установки шарды findface-tarantool-server будут автоматически установлены в количестве N = min(max(min(mem_mb // 2000, cpu_cores), 1), 16 * cpu_cores). Т. е. количество равно размеру оперативной памяти в Мб, разделенному на 2000, или количеству физических ядер процессора (но не менее 1 шарда), или же количеству физических ядер процессора, умноженному на 16, если первое полученное значение больше.

  2. Используйте созданный файл /tmp/<findface-installer-*>.json, чтобы установить findface-tarantool-server на других серверах, не отвечая на вопросы инсталлятора повторно. Для этого выполните следующую команду:

    sudo ./<findface-*>.run -f /tmp/<findface-installer-*>.json
    
  3. Обязательно укажите IP-адреса и порты шардов при настройке распределенной сети FindFace Multi. Для того чтобы узнать номера портов, на каждом сервере базы данных выполните команду:

    sudo cat /opt/findface-multi/docker-compose.yaml | grep -E "CFG_LISTEN_PORT"
    

    Будет возвращен следующий результат:

    CFG_LISTEN_PORT=8101, CFG_EXTRA_LUA=loadfile("/tnt_schema.lua")()]
    CFG_LISTEN_PORT=8102, CFG_EXTRA_LUA=loadfile("/tnt_schema.lua")()]
    CFG_LISTEN_PORT=8103, CFG_EXTRA_LUA=loadfile("/tnt_schema.lua")()]
    CFG_LISTEN_PORT=8104, CFG_EXTRA_LUA=loadfile("/tnt_schema.lua")()]
    CFG_LISTEN_PORT=8105, CFG_EXTRA_LUA=loadfile("/tnt_schema.lua")()]
    CFG_LISTEN_PORT=8106, CFG_EXTRA_LUA=loadfile("/tnt_schema.lua")()]
    CFG_LISTEN_PORT=8107, CFG_EXTRA_LUA=loadfile("/tnt_schema.lua")()]
    CFG_LISTEN_PORT=8108, CFG_EXTRA_LUA=loadfile("/tnt_schema.lua")()]
    

    Здесь номера портов: 8101, 8102 и т. д.

  4. На сервере с установленным компонентом findface-tarantool-server внесите изменения в конфигурацию каждого шарда в файле /opt/findface-multi/docker-compose.yaml. Укажите адрес сервера лицензий findface-ntls в параметре CFG_NTLS. Установите CFG_LISTEN_HOST=0.0.0.0.

    sudo vi /opt/findface-multi/docker-compose.yaml
    
    findface-tarantool-server-shard-001:
      depends_on: []
      environment: ['TT_LISTEN=127.0.0.1:32001', TT_WORK_DIR=/var/lib/tarantool/FindFace,
        TT_WAL_DIR=xlogs, TT_MEMTX_DIR=snapshots, TT_MEMTX_MEMORY=2147483648, TT_CHECKPOINT_INTERVAL=14400,
        TT_CHECKPOINT_COUNT=3, TT_FORCE_RECOVERY=true, 'CFG_NTLS=172.23.218.110:3133', CFG_LISTEN_HOST=0.0.0.0,
        CFG_LISTEN_PORT=8101, CFG_EXTRA_LUA=loadfile("/tnt_schema.lua")()]
      image: docker.int.ntl/ntech/universe/tntapi:ffserver-9.230407.1
      logging: {driver: journald}
      network_mode: service:pause
      restart: always
      volumes: ['./data/findface-tarantool-server/shard-001:/var/lib/tarantool/FindFace',
        './configs/findface-tarantool-server/tnt-schema.lua:/tnt_schema.lua:ro']
    
  5. Перезапустите контейнеры.

    cd /opt/findface-multi/
    sudo docker-compose down
    sudo docker-compose up -d
    
  6. Откройте файл конфигурации /opt/findface-multi/configs/findface-ntls/findface-ntls.yaml и установите listen: 0.0.0.0:3133.

    sudo vi /opt/findface-multi/configs/findface-ntls/findface-ntls.yaml
    
    listen: 0.0.0.0:3133
    license_dir: /ntech/license
    proxy: ''
    ui: 0.0.0.0:3185
    
  7. Внесите изменения в файл конфигурации /opt/findface-multi/configs/findface-sf-api/findface-sf-api.yaml. Установите listen: 0.0.0.0:18411 и обозначьте шарды.

    sudo vi /opt/findface-multi/configs/findface-sf-api/findface-sf-api.yaml
    
    listen: 0.0.0.0:18411
    extraction-api:
      timeouts:
        connect: 5s
        response_header: 30s
        overall: 35s
        idle_connection: 10s
      max-idle-conns-per-host: 20
      keepalive: 24h0m0s
      trace: false
      extraction-api: http://127.0.0.1:18666
    storage-api:
      timeouts:
        connect: 5s
        response_header: 30s
        overall: 35s
        idle_connection: 10s
      max-idle-conns-per-host: 20
      keepalive: 24h0m0s
      trace: false
      shards:
      - master: http://172.20.77.19:8101/v2/
        slave: ''
      - master: http://172.20.77.19:8102/v2/
        slave: ''
    
  8. Перезапустите контейнеры FindFace Multi, чтобы применились миграции.

    cd /opt/findface-multi/
    
    sudo docker-compose restart
    

Настройка сетевого взаимодействия

После развертывания компонентов FindFace Multi настройте их взаимодействие по сети. Выполните следующие действия:

  1. Откройте файл конфигурации /opt/findface-multi/configs/findface-sf-api/findface-sf-api.yaml:

    sudo vi /opt/findface-multi/configs/findface-sf-api/findface-sf-api.yaml
    

    Задайте следующие параметры:

    Параметр

    Описание

    extraction-api -> extraction-api

    IP-адрес и слушающий порт сервера, являющегося шлюзом для серверов экстракции с настроенной балансировкой нагрузки.

    storage-api -> shards -> master

    IP-адрес и порт мастера шарда findface-tarantool-server. Остальные шарды прописываются по аналогии.

    upload_url

    Путь в WebDAV nginx, по которому в компонент findface-upload будут отправляться исходные изображения, миниатюры и нормализованные изображения объектов.

    ...
    extraction-api:
      extraction-api: http://172.168.1.9:18667
    
    ...
    webdav:
      upload-url: http://127.0.0.1:3333/uploads/
    
    ...
    storage-api:
      ...
      shards:
      - master: http://172.168.1.9:8101/v2/
        slave: ''
      - master: http://172.168.1.9:8102/v2/
        slave: ''
      - master: http://172.168.1.12:8101/v2/
        slave: ''
      - master: http://172.168.1.12:8102/v2/
        slave: ''
      - master: http://172.168.1.13:8102/v2/
        slave: ''
      - master: http://172.168.1.13:8102/v2/
        slave: ''
    

    Перезапустите контейнер findface-multi-findface-sf-api-1.

    sudo docker container restart findface-multi-findface-sf-api-1
    
  2. Откройте файл конфигурации /opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py.

    sudo vi /opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py
    

    Задайте следующие параметры:

    Параметр

    Описание

    SERVICE_EXTERNAL_ADDRESS

    IP-адрес или URL FindFace Multi, являющимся приоритетным для Genetec и вебхуков. Если параметр не задан, система использует для работы с данным функционалом EXTERNAL_ADDRESS. Для использования Genetec и вебхуков обязательно укажите по крайней мере один из параметров SERVICE_EXTERNAL_ADDRESS/ EXTERNAL_ADDRESS.

    EXTERNAL_ADDRESS

    (Опционально) IP-адрес или URL, который используется для доступа к веб-интерфейсу FindFace Multi. Если параметр не задан, система автоматически определяет его как внешний IP-адрес. Для доступа в FindFace Multi вы можете использовать оба IP-адреса: как автоопределенный, так и указанный в EXTERNAL_ADDRESS.

    VIDEO_DETECTOR_TOKEN

    Придумайте токен и укажите его в данном параметре, чтобы авторизовать модуль видеодетекции объектов.

    VIDEO_MANAGER_ADDRESS

    IP-адрес сервера findface-video-manager.

    NTLS_HTTP_URL

    IP-адрес сервера findface-ntls.

    ROUTER_URL

    Внешний IP-адрес сервера findface-security, который будет получать обнаруженные объекты от экземпляра(ов) findface-video-worker.

    SF_API_ADDRESS

    IP-адрес сервера findface-sf-api.

    sudo vi /opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py
    
    ...
    # SERVICE_EXTERNAL_ADDRESS is prioritized for FFSecurity webhooks and Genetec plugin.
    SERVICE_EXTERNAL_ADDRESS = 'http://localhost'
    EXTERNAL_ADDRESS = 'http://127.0.0.1'
    
    
    ...
    FFSECURITY = {
        'VIDEO_DETECTOR_TOKEN': '7ce2679adfc4d74edcf508bea4d67208',
        ...
        'VIDEO_MANAGER_ADDRESS': 'http://127.0.0.1:18810',
        ...
        'NTLS_HTTP_URL': 'http://127.0.0.1:3185',
        'ROUTER_URL': 'http://172.168.1.9',
        ...
        'SF_API_ADDRESS': 'http://127.0.0.1:18411',
        ...
    }
    

    Выполните перезапуск контейнеров FindFace Multi.

    cd /opt/findface-multi/
    
    sudo docker-compose restart
    

На этом установка FindFace Multi в многосерверной среде будет завершена.

Важно

Для того чтобы сохранить совместимость FindFace Multi со средой установки, настоятельно рекомендуется отключить автоматическое обновление Ubuntu. В этом случае вы сможете обновлять ОС вручную, контролируя процесс обновления отдельных пакетов.

Для отключения автоматического обновления Ubuntu выполните следующие команды:

sudo apt-get remove unattended-upgrades
sudo systemctl stop apt-daily.timer
sudo systemctl disable apt-daily.timer
sudo systemctl disable apt-daily.service
sudo systemctl daemon-reload

Важно

Сервисы FindFace Multi логируют большой объем данных, что в конечном итоге может привести к чрезмерной загрузке диска. Чтобы этого не произошло, рекомендуется отключить сервис rsyslog из-за его неоптимальной схемы ротации логов и вместо него использовать правильно настроенный сервис systemd-journal. См. пошаговые инструкции в разделе Логирование.