Дополнительная информация#
В данном разделе приводится следующая дополнительная информация:
- Визуализация монтиторинга и логов с помощью Grafana
- Полезные команды для работы с Docker
- Описание параметров запуска сервисов LUNA PLATFORM и создания баз данных
- Действия по включению сохранения логов сервисов LP в файлы
- Настройка ротации логов Docker
- Задание пользовательских настроек InfluxDB
- Использование сервиса Python Matcher с сервисом Python Matcher Proxy
- Масштабирование системы
- Компиляция библиотеки VLMatch для Oracle
Визуализация монтиторинга и логов с помощью Grafana#
Визуализация мониторинга выполняется за счет сервиса LUNA Dashboards, который содержит в себе платформу для визуализации данных мониторинга Grafana с настроенными дашбордами LUNA PLATFORM.
При необходимости можно отдельно установить настроенные дашборды для Grafana. См. дополнительную информацию в разделе "LUNA Dashboards" в руководстве администратора.
Вместе с Grafana можно использовать систему агрегации логов Grafana Loki, позволяющую гибко работать с логами LUNA PLATFORM. Для доставки логов LUNA PLATFORM в Grafana Loki используется агент Promtail (дополнительную информацию см. в разделе "Grafana Loki" в руководстве администратора).
LUNA Dashboards#
Примечание. Для работы с Grafana необходимо использовать InfluxDB версии 2.
Примечание. Перед обновлением убедитесь, что старый контейнер LUNA Dashboards удален.
Запуск контейнера LUNA Dashboards#
Используйте команду docker run
со следующими параметрами для запуска LUNA Dashboards:
docker run \
--restart=always \
--detach=true \
--network=host \
--name=grafana \
-v /etc/localtime:/etc/localtime:ro \
dockerhub.visionlabs.ru/luna/luna-dashboards:v.0.1.0
Для использования веб-интерфейса Grafana нужно перейти по адресу "http://IP_ADDRESS:3000", при условии, что контейнеры LUNA Dashboards и InfluxDB были запущены.
Grafana Loki#
Примечание. Для запуска Grafana Loki требуется наличие запущенного сервиса LUNA Dashboards.
Примечание. Перед обновлением убедитесь, что старые контейнеры Grafana Loki и Promtail удалены.
Запуск контейнера Grafana Loki#
Используйте команду docker run
со следующими параметрами для запуска Grafana Loki:
docker run \
--name=loki \
--restart=always \
--detach=true \
--network=host \
-v /etc/localtime:/etc/localtime:ro \
dockerhub.visionlabs.ru/luna/loki:2.7.1
Запуск контейнера Promtail#
Используйте команду docker run
со следующими параметрами для запуска Promtail:
docker run \
-v /var/lib/luna/current/example-docker/logging/promtail.yml:/etc/promtail/luna.yml \
-v /var/lib/docker/containers:/var/lib/docker/containers \
-v /etc/localtime:/etc/localtime:ro \
--name=promtail \
--restart=always \
--detach=true \
--network=host \
dockerhub.visionlabs.ru/luna/promtail:2.7.1 \
-config.file=/etc/promtail/luna.yml -client.url=http://127.0.0.1:3100/loki/api/v1/push -client.external-labels=job=containerlogs,pipeline_id=,job_id=,version=
-v /var/lib/luna/current/example-docker/logging/promtail.yml:/etc/promtail/luna.yml
— монтирование конфигурационного файла в контейнер Promtail
-config.file=/etc/promtail/luna.yml
— флаг с адресом конфигурационного файла
-client.url=http://127.0.0.1:3100/loki/api/v1/push
— флаг с адресом развернутой Grafana Loki
-client.external-labels=job=containerlogs,pipeline_id=,job_id=,version=
— статические метки для добавления ко всем логам, отправляемым в Grafana Loki
Команды Docker#
Показать контейнеры#
Чтобы показать список запущенных Docker-контейнеров, используйте команду:
docker ps
Чтобы показать все имеющиеся Docker-контейнеры, используйте команду:
docker ps -a
Копировать файлы в контейнер#
Можно переносить файлы в контейнер. Используйте команду docker cp
для копирования файла в контейнер.
docker cp <file_location> <container_name>:<folder_inside_container>
Вход в контейнер#
Можно входить в отдельные контейнеры с помощью следующей команды:
docker exec -it <container_name> bash
Для выхода из контейнера используйте следующую команду:
exit
Имена образов#
Можно увидеть все имена образов с помощью команды
docker images
Удаление образа#
Если требуется удаление образа:
- запустите команду
docker images
- найдите требуемый образ, например dockerhub.visionlabs.ru/luna/luna-image-store
- скопируйте соответствующий ID образа из IMAGE ID, например, "61860d036d8c"
- укажите его в команде удаления:
docker rmi -f 61860d036d8c
Удалите все существующие образы:
docker rmi -f $(docker images -q)
Остановка контейнера#
Контейнер можно остановить с помощью следующей команды:
docker stop <container_name>
Остановить все контейнеры:
docker stop $(docker ps -a -q)
Удаление контейнера#
Если необходимо удалить контейнер:
- запустите команду "docker ps"
- остановите контейнер (см. Остановка контейнера)
- найдите требуемый образ, например:
dockerhub.visionlabs.ru/luna/luna-image-store
- скопируйте соответствующий ID контейнера из столбца CONTAINER ID, например, "23f555be8f3a"
- укажите его в команде удаления:
docker container rm -f 23f555be8f3a
Удалить все контейнеры:
docker container rm -f $(docker container ls -aq)
Проверка логов сервисов#
Чтобы показать логи сервиса, используйте команду:
docker logs <container_name>
Описание параметров запуска#
При запуске Docker-контейнера для какого-либо из сервисов LUNA PLATFORM необходимо задать дополнительные параметры, требуемые для работы этого сервиса.
Параметры, требуемые для конкретного контейнера, описаны в разделе, посвященном запуску этого контейнера.
Все параметры, приведенные в примере запуска сервиса, необходимы для корректного запуска и работы сервиса.
Параметры запуска сервисов#
Пример команды запуска контейнеров сервисов LP:
docker run \
--env=CONFIGURATOR_HOST=127.0.0.1 \
--env=CONFIGURATOR_PORT=5070 \
--env=PORT=<Port_of_the_launched_service> \
--env=WORKER_COUNT=1 \
--env=RELOAD_CONFIG=1 \
--env=RELOAD_CONFIG_INTERVAL=10 \
-v /etc/localtime:/etc/localtime:ro \
-v /tmp/logs/<service>:/srv/logs/ \
--name=<service_container_name> \
--restart=always \
--detach=true \
--network=host \
dockerhub.visionlabs.ru/luna/<service-name>:<version>
Следующие параметры используются при запуске контейнеров сервисов LP:
-
docker run
— команда для запуска выбранного образа в качестве нового контейнера. -
dockerhub.visionlabs.ru/luna/<service-name>:<version>
— позволяет задать образ, требуемый для запуска контейнера.
Ссылки для загрузки требуемых образов контейнера доступны в описании запуска соответствующего контейнера.
-
--network=host
— указывает, что отсутствует симуляция сети и используется серверная сеть. При необходимости изменить порт для сторонних контейнеров следует заменить эту строку на-p 5440:5432
. Здесь первый порт5440
— это локальный порт, а5432
— это порт, используемый в контейнере. Пример приведен для PostgreSQL. -
--env=
— задает переменные окружения, требуемые для запуска контейнера (см. раздел "Аргументы сервисов"). -
--name=<service_container_name>
— задает имя запускаемого контейнера. Имя должно быть уникальным. Если уже существует контейнер с таким же именем, произойдет ошибка. -
--restart=always
— определяет политику перезагрузки. Daemon всегда перезагружает контейнер вне зависимости от кода завершения. -
--detach=true
— позволяет запустить контейнер в фоновом режиме. -
-v
— позволяет загружать содержимое серверной папки в объем контейнера. Таким образом содержимое синхронизируется. Загружаются следующие общие данные: -
/etc/localtime:/etc/localtime:ro
— задает текущий часовой пояс, используемый системой контейнера. -
/tmp/logs/<service>:/srv/logs/
— позволяет копировать папку с записями (логами) сервиса на сервер в директорию/tmp/logs/<service>
. Директорию для хранения логов можно изменить при желании.
Аргументы сервисов#
Каждый сервис в LUNA PLATFORM имеет свои собственные аргументы запуска. Эти аргументы можно передать через:
- задание флага для скрипта запуска (
run.py
) соответствующего сервиса - установку отдельных переменных окружения (
--env
) в командной строке Docker
Например, с использованием флага --help
можно получить список всех доступных аргументов. Пример передачи аргумента для сервиса API может выглядеть следующим образом:
docker run --rm dockerhub.visionlabs.ru/luna/luna-api:v.6.29.0 python3 /srv/luna_api/run.py --help
Список основных аргументов:
Флаг в строке запуска |
Переменная окружения |
Описание |
|
|
Порт, на котором сервис будет ожидать подключений. |
|
|
Количество "рабочих процессов" для сервиса. |
|
|
Суффикс, добавляемый к именам файлов логов (при включенном параметре записи логов в файл). |
|
|
Включение автоматической перезагрузки конфигураций. См. раздел "Автоматическая перезагрузка конфигураций" в руководстве администратора LUNA PLATFORM 5. |
|
|
Период проверки конфигураций (по умолчанию 10 секунд). См. раздел "Автоматическая перезагрузка конфигураций" в руководстве администратора LUNA PLATFORM 5. |
|
|
Адрес сервиса Configurator для загрузки настроек. Для
|
|
Нет |
Путь до конфигурационного файла с настройками сервиса. |
|
Нет |
Тег указанной настройки в Configurator. При задании данной настройки
будет использовано значение тегированной настройки. Пример:
Примечание. Необходимо заранее присвоить тег соответствующим настройкам в Configurator. Примечание. Работает только с флагом |
|
Нет |
Путь к SSL-сертификату для запуска сервиса с использованием протокола HTTPS. |
|
Нет |
Путь к SSL-закрытому ключу для запуска сервиса с использованием протокола HTTPS. |
|
Нет |
Пароль для SSL-закрытого ключа для запуска сервиса с использованием протокола HTTPS. |
Перечень аргументов может отличаться в зависимости от сервиса.
Также доступна возможность переопределить настройки сервисов при их старте с помощью переменных окружения.
Для переопределения настроек используется префикс VL_SETTINGS
. Примеры:
--env=VL_SETTINGS.INFLUX_MONITORING.SEND_DATA_FOR_MONITORING=0
. Использование переменной окружения из данного примера установит значение настройки "SEND_DATA_FOR_MONITORING" для секции "INFLUX_MONITORING" равным "0".--env=VL_SETTINGS.OTHER.STORAGE_TIME=LOCAL
. Для несоставных настроек (настроек, которые расположены в секции "OTHER" в конфигурационном файле) необходимо указать префикс "OTHER". Использование переменной окружения из данного примера установит значение настройки "STORAGE_TIME" (если сервис использует данную настройку) на значение "LOCAL".
Передача флагов с использованием переменной окружения
Флаги, для которых явно не выделена переменная окружения, можно передать с помощью переменной окружения EXTEND_CMD
.
Например, можно передать тег настроек следующим способом:
--env=EXTEND_CMD="--INFLUX_MONITORING=TAG_1 --LUNA_EVENTS_DB=TAG_2"
Параметры создания баз данных#
Пример команды запуска контейнеров для миграции баз данных или их создания:
docker run \
-v /etc/localtime:/etc/localtime:ro \
-v /tmp/logs/<service>:/srv/logs/ \
--rm \
--network=host \
dockerhub.visionlabs.ru/luna/<service-name>:<version> \
python3 ./base_scripts/db_create.py --luna-config http://localhost:5070/1
Следующие параметры используются при запуске контейнеров для миграции баз данных или их создания:
--rm
— этот параметр указывает, удаляется ли контейнер после завершения обработки всех заданных скриптов.
python3 ./base_scripts/db_create.py
— этот параметр содержит версию Python и скрипт db_create.py
, запускаемый в контейнере. Этот скрипт используется для создания структуры базы данных.
--luna-config http://localhost:5070/1
— этот параметр указывает, откуда запущенный скрипт должен получать конфигурации. По умолчанию конфигурации запрашиваются сервисами от сервиса Configurator.
Запись логов на сервер#
Чтобы включить сохранение логов на сервер, необходимо:
- создать директории для логов на сервере;
- активировать запись логов и задать расположение хранения логов внутри контейнеров сервисов LP;
- настроить синхронизацию директорий логов в контейнере с логами на сервере с помощью аргумента
volume
при старте каждого контейнера.
Создание директории логов#
Ниже приведены примеры команд для создания директорий для хранения логов и присвоения им прав для всех сервисов LUNA PLATFORM.
mkdir -p /tmp/logs/configurator /tmp/logs/image-store /tmp/logs/accounts /tmp/logs/faces /tmp/logs/licenses /tmp/logs/events /tmp/logs/python-matcher /tmp/logs/handlers /tmp/logs/remote-sdk /tmp/logs/tasks /tmp/logs/tasks-worker /tmp/logs/sender /tmp/logs/api /tmp/logs/admin /tmp/logs/backport3 /tmp/logs/backport4
chown -R 1001:0 /tmp/logs/configurator /tmp/logs/image-store /tmp/logs/accounts /tmp/logs/faces /tmp/logs/licenses /tmp/logs/events /tmp/logs/python-matcher /tmp/logs/handlers /tmp/logs/remote-sdk /tmp/logs/tasks /tmp/logs/tasks-worker /tmp/logs/sender /tmp/logs/api /tmp/logs/admin /tmp/logs/backport3 /tmp/logs/backport4
Если необходимо использовать сервис Python Matcher Proxy, то нужно дополнительно создать директорию /tmp/logs/python-matcher-proxy
и установить ей разрешения.
Активация записи логов#
Активация записи логов сервисов LP#
Для активации записи логов в файл необходимо задать настройки log_to_file
и folder_with_logs
в секции <SERVICE_NAME>_LOGGER
настроек каждого сервиса.
Автоматический способ (перед/после запуска Configurator)
Для обновления настроек ведения логов можно использовать файл настроек logging.json
, предоставленный в комплекте поставки.
Выполните следующую команду после запуска сервиса Configurator:
docker cp /var/lib/luna/current/extras/conf/logging.json luna-configurator:/srv/luna_configurator/used_dumps/logging.json
Обновите настройки записи логов с помощью скопированного файла.
docker exec -it luna-configurator python3 ./base_scripts/db_create.py --dump-file /srv/luna_configurator/used_dumps/logging.json
Ручной способ (после запуска Configurator)
Перейдите в интерфейс сервиса Configurator (127.0.0.1:5070
) и задайте путь расположения логов в контейнере в параметре folder_with_logs
для всех сервисов, чьи логи необходимо сохранить. Например, можно использовать путь /srv/logs
.
Установите параметр log_to_file
как true
чтобы активировать запись логов в файл.
Активация записи логов сервиса Configurator (перед/после запуска Configurator)#
Настроек сервиса Configurator нет в пользовательском интерфейсе Configurator, они расположены в следующем файле:
/var/lib/luna/current/example-docker/luna_configurator/configs/luna_configurator_postgres.conf
Следует изменить параметры логирования в этом файле перед запуском сервиса Configurator или перезапустить его после внесения изменений.
Задайте путь расположения логов в контейнере в параметре FOLDER_WITH_LOGS = ./
файла. Например, FOLDER_WITH_LOGS = /srv/logs
.
Установите параметр log_to_file
как true
чтобы активировать запись логов в файл.
Монтирование директорий с логами при старте сервисов#
Директория с логами монтируется с помощью следующего аргумента при старте контейнера:
-v <server_logs_folder>:<container_logs_folder> \
где <server_logs_folder>
директория, созданная на этапе создания директории логов, а <container_logs_folder>
директория, созданная на этапе активации записи логов.
Пример команды запуска сервиса API с монтированием директории с логами:
docker run \
--env=CONFIGURATOR_HOST=127.0.0.1 \
--env=CONFIGURATOR_PORT=5070 \
--env=PORT=5000 \
--env=WORKER_COUNT=1 \
--env=RELOAD_CONFIG=1 \
--env=RELOAD_CONFIG_INTERVAL=10 \
--name=luna-api \
--restart=always \
--detach=true \
-v /etc/localtime:/etc/localtime:ro \
-v /tmp/logs/api:/srv/logs \
--network=host \
dockerhub.visionlabs.ru/luna/luna-api:v.6.29.0
Примеры команд запуска контейнеров в данной документации содержат эти аргументы.
Настройка ротации логов Docker#
Чтобы ограничить размер логов, генерируемых Docker, можно настроить автоматическую ротацию логов. Для этого необходимо добавить в файл /etc/docker/daemon.json
следующие данные:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "5"
}
}
Это позволит Docker хранить до 5 файлов логов на контейнер, при этом каждый файл будет ограничен 100 Мб.
После изменения файла необходимо перезапустить Docker:
systemctl reload docker
Вышеописанные изменения являются значениями по умолчанию для любого вновь созданного контейнера, они не применяются к уже созданным контейнерам.
Задание пользовательских настроек InfluxDB#
Для InfluxDB OSS 2 доступны следующие настройки:
"send_data_for_monitoring": 1,
"use_ssl": 0,
"flushing_period": 1,
"host": "127.0.0.1",
"port": 8086,
"organization": "<ORGANIZATION_NAME>",
"token": "<TOKEN>",
"bucket": "<BUCKET_NAME>",
"version": <DB_VERSION>
Можно обновить настройки InfluxDB для сервисов LP в сервисе Configurator, выполнив следующие действия:
- откройте следующий файл:
vi /var/lib/luna/current/extras/conf/influx2.json
- задайте необходимые данные;
- сохраните изменения;
- скопируйте файл в контейнер InfluxDB:
docker cp /var/lib/luna/current/extras/conf/influx2.json luna-configurator:/srv/
- обновите настройки в сервисе Configurator.
docker exec -it luna-configurator python3 ./base_scripts/db_create.py --dump-file /srv/influx2.json
Также можно вручную обновить настройки в пользовательском интерфейсе сервиса Configurator.
Настройки сервиса Configurator задаются отдельно.
- откройте файл с настройками Configurator:
vi /var/lib/luna/current/example-docker/luna_configurator/configs/luna_configurator_postgres.conf
- задайте необходимые данные;
- сохраните изменения;
- перезапустите Configurator:
docker restart luna-configurator
Использование Python Matcher с Python Matcher Proxy#
Как было сказано ранее, вместе с сервисом Python Matcher можно дополнительно использовать сервис Python Matcher Proxy, который будет перенаправлять запросы сравнения либо сервису Python Matcher, либо плагинам сравнения. Использование плагинов может значительно ускорить выполнение запросов на сравнение. Например, с помощью плагинов возможно организовать хранение необходимых для выполнения операций сравнения данных и дополнительных полей объектов в отдельном хранилище, что позволит ускорить доступ к данным по сравнению с использованием стандартной БД LUNA PLATFORM.
Для использования сервиса Python Matcher с Python Matcher Proxy необходимо дополнительно запустить соответствующий контейнер, а затем выставить определенную настройку в сервисе Configurator. Выполняйте нижеперечисленные действия только если собираетесь использовать плагины сравнения.
См. описание и использование плагинов сравнения в руководстве администратора.
Запуск контейнера Python Matcher Proxy#
Используйте следующую команду для запуска сервиса:
docker run \
--env=CONFIGURATOR_HOST=127.0.0.1 \
--env=CONFIGURATOR_PORT=5070 \
--env=PORT=5110 \
--env=WORKER_COUNT=1 \
--env=RELOAD_CONFIG=1 \
--env=RELOAD_CONFIG_INTERVAL=10 \
--env=SERVICE_TYPE="proxy" \
-v /etc/localtime:/etc/localtime:ro \
-v /tmp/logs/python-matcher-proxy:/srv/logs \
--name=luna-python-matcher-proxy \
--restart=always \
--detach=true \
--network=host \
dockerhub.visionlabs.ru/luna/luna-python-matcher:v.1.9.9
После запуска контейнера необходимо выставить следующее значение в сервисе Configurator.
ADDITIONAL_SERVICES_USAGE = "luna_matcher_proxy":true
Масштабирование системы#
Все сервисы LP линейно масштабируемы и могут располагаться на нескольких серверах.
Можно запустить дополнительные контейнеры с сервисами LP для повышения производительности и отказоустойчивости. Количество сервисов и характеристики серверов зависят от решаемой задачи.
Для повышения производительности можно либо увеличить производительность одного сервера, либо увеличить количество используемых серверов, распределив наиболее ресурсозатратные компоненты системы.
Для распределения запросов среди запущенных экземпляров сервисов используются балансировщики. Этот подход обеспечивает требуемую скорость обработки и требуемый уровень отказоустойчивости для конкретных задач клиента. В случае отказа узла система не остановится: запросы перераспределятся на другой узел.
На рисунке ниже показано, как два экземпляра сервиса Faces балансируются посредством Nginx. Nginx получает запросы на порту 5030 и направляет их экземплярам Faces. Сервисы Faces запущены на портах 5031 и 5032.

Крайне рекомендуется регулярно создавать резервные копии баз данных на отдельном сервере независимо от уровня отказоустойчивости системы. Это защитит от потери данных в непредвиденных случаях.
Очереди сообщений, базы данных и балансировщики, используемые LUNA PLATFORM — это продукты сторонних разработчиков. Их необходимо конфигурировать в соответствии с рекомендациями их поставщиков.
Сервисы Remote SDK и Python Matcher выполняют наиболее ресурсозатратные операции.
Сервис Remote SDK выполняет математическое преобразование изображений и извлечение биометрических шаблонов. Эти операции требуют значительных вычислительных мощностей. Для вычислений можно использовать как CPU, так и GPU.
Использование GPU предпочтительно, т.к. обработка запросов происходит эффективнее. Однако, поддерживаются не все типы видеокарт.
Сервис Python Matcher выполняет сравнение по спискам. Сравнение требует ресурсов CPU, однако также следует выделить максимально возможный объем оперативной памяти под каждый экземпляр Python Matcher. RAM используется для хранения биометрических шаблонов, полученных из базы данных. Таким образом, сервису Python Matcher не требуется запрашивать каждый БШ из базы данных.
При распределении экземпляров на нескольких серверах следует учитывать производительность каждого сервера. Например, если крупная задача выполняется несколькими экземплярами Python Matcher, а один из них находится на сервере с низкой производительностью, выполнение всей задачи в целом может замедлиться.
Обратите внимание, что для каждого экземпляра сервиса можно задать количество "рабочих процессов". Чем больше количество "рабочих процессов", тем больше ресурсов и памяти потребляется экземпляром сервиса. См. подробную информацию в разделе "Рабочие процессы" в руководстве администратора LUNA PLATFORM.
Запуск нескольких контейнеров#
Для запуска нескольких экземпляров одного и того же сервиса LP необходимо выполнить два шага.
- Запустить несколько контейнеров этого сервиса
Необходимо запустить требуемое количество сервисов, используя соответствующую команду для каждого сервиса.
Например, для сервиса API необходимо запустить следующую команду с обновленными параметрами.
docker run \
--env=CONFIGURATOR_HOST=127.0.0.1 \
--env=CONFIGURATOR_PORT=5070 \
--env=PORT=<port> \
-v /etc/localtime:/etc/localtime:ro \
-v /tmp/logs/<folder_name>:/srv/logs \
--name=<name> \
--restart=always \
--detach=true \
--network=host \
dockerhub.visionlabs.ru/luna/luna-api:v.6.29.0
При запуске нескольких схожих контейнеров должны различаться следующие параметры контейнеров:
--env=PORT=<port>
— порты, указываемые для схожих контейнеров, должны быть разными. Необходимо задать доступный порт для экземпляра. Например, "5001", "5002". Порт "5000" будет задан для балансировщика Nginx.
/tmp/logs/<folder_name>:/srv/logs
— папки для логов должны быть с разными именами, чтобы не смешивались записи разных экземпляров сервиса.
--name=<container_name>
— запущенный контейнер должен иметь другое имя, т.к. нельзя запускать два контейнера с одним и тем же именем. Например, "api_1", "api_2".
--gpus device=0
— сервисы CORE обычно используют разные устройства GPU. Таким образом необходимо указывать разные номера устройств.
- Настройте балансировщик (например, Nginx) для маршрутизации запросов по сервисам.
Для каждого масштабированного сервиса LP необходимо задать порт, на котором Nginx будет слушать запросы сервисам и реальные порты каждого экземпляра сервиса, куда Nginx будет перенаправлять запросы.
Пример конфигурационного файла Nginx можно посмотреть здесь:
“/var/lib/luna/current/extras/conf/nginx.conf”.
Можно использовать другой балансировщик, но его использование не описано в данном документе.
VLMatch для Oracle#
Примечание. В следующей инструкции описана установка для Oracle 21c.
Все файлы, требуемые для компиляции расширения, заданного пользователем (UDx), в VLMatch, можно найти в следующей директории:
/var/lib/luna/current/extras/VLMatch/oracle
Для компиляции функции VLMatch UDx необходимо:
- Установить требуемое окружение, см. требования:
sudo yum install gcc g++
- Поменяйте переменную
SDK_HOME
— oracle sdk root (по умолчанию$ORACLE_HOME/bin
, проверьте, что переменная окружения$ORACLE_HOME
задана) в makefile.
vi /var/lib/luna/current/extras/VLMatch/oracle/make.sh
- Откройте директорию и запустите файл "make.sh".
cd /var/lib/luna/current/extras/VLMatch/oracle
chmod +x make.sh
./make.sh
- Определите библиотеку и функцию внутри базы данных (из консоли базы данных):
CREATE OR REPLACE LIBRARY VLMatchSource AS '$ORACLE_HOME/bin/VLMatchSource.so';
CREATE OR REPLACE FUNCTION VLMatch(descriptorFst IN RAW, descriptorSnd IN RAW, length IN BINARY_INTEGER)
RETURN BINARY_FLOAT
AS
LANGUAGE C
LIBRARY VLMatchSource
NAME "VLMatch"
PARAMETERS (descriptorFst BY REFERENCE, descriptorSnd BY REFERENCE, length UNSIGNED SHORT, RETURN FLOAT);
- Протестируйте функцию посредством вызова (из консоли базы данных):
SELECT VLMatch(HEXTORAW('1234567890123456789012345678901234567890123456789012345678901234'), HEXTORAW('0123456789012345678901234567890123456789012345678901234567890123'), 32) FROM DUAL;
Результат должен быть равен "0.4765625".