Настройка SQL-адаптера
Результат этой процедуры — работающий SQL-адаптер: контейнер по расписанию выполняет запрос к базе-источнику Oracle, превращает каждую строку выборки в событие и публикует его для модуля Flow. Успех распознаётся по успешному ответу пробы готовности и по записям о выполненной выборке в логе адаптера.
Что умеет адаптер и где проходят границы его применимости — в обзорной статье SQL-адаптер.
Предусловия
Перед настройкой проверьте четыре зависимости.
| Зависимость | Как проверить |
|---|---|
| Docker и Docker Compose на сервере установки | Выполните docker compose version — выводится номер версии |
| Доступ к базе-источнику Oracle: пользователь с правами на чтение нужных таблиц | Выполните запрос выборки из своего клиента БД под этим пользователем — возвращаются строки |
| Работающий Redis | Выполните redis-cli -u <адрес Redis> ping — ожидается ответ PONG |
| Работающий RabbitMQ | Порт 5672 брокера доступен с сервера установки |
Особенности сетевой конфигурации при подключении к Redis описаны в статье Особенности подключения к Redis.
Шаги
1. Загрузите образ адаптера
Выполните команду:
docker load < flows_sql_adapter_<версия>.tar.gz<версия> — номер версии из архива поставки. В выводе появится строка Loaded image, а команда docker images покажет образ flows_sql_adapter.
2. Создайте файл конфигурации
Создайте файл docker-compose.yaml по образцу:
services:
sql_adapter:
image: devcubesolutions/flows_sql_adapter:<версия>
container_name: sql_adapter
restart: unless-stopped
environment:
- LOG_LEVEL=info
- ADAPTER_NAME=<имя адаптера>
- REDIS_CONNECTION=redis://<адрес Redis>:6379
- BROKER_CONNECTION=amqp://<пользователь>:<пароль>@<адрес RabbitMQ>:5672
- DRIVER=Oracle
- DB_USER=<пользователь БД>
- DB_PASSWORD=<пароль БД>
- CONNECTION_STRING=<хост>:<порт>/<сервис Oracle>
- STATEMENT=SELECT * FROM <схема>.<таблица>
- CRON=0 */5 * * * *
- ID_FIELD=<колонка идентификатора клиента>
- EVENT_NAME=<имя события>
- EVENT_CONTEXT=<имя поля>,{{<колонка>}}
- ENABLE_METRICS=true
- METRICS_PORT=3010Значения в угловых скобках замените под своё окружение. Команду запуска в файле не указывайте: точка входа встроена в образ. Образ в примере выше подставляется из шага 1 — сверьте имя и версию по docker images.
3. Заполните переменные подключения
Все переменные этой группы обязательны: без любой из них адаптер завершается при старте.
| Переменная | Смысл |
|---|---|
ADAPTER_NAME | Имя экземпляра: буквы, цифры, дефис, подчёркивание, без пробелов. Обязательно уникально — экземпляры с одинаковым именем перезаписывают курсор друг друга |
CRON | Расписание выборки: шесть полей, включая секунды. Таймзона фиксирована — московская, переменной не задаётся |
DRIVER | Тип базы-источника. Принимается единственное значение Oracle; любое другое останавливает адаптер. Поддержка другой СУБД добавляется по запросу через вашего менеджера Accelera |
CONNECTION_STRING | Строка подключения Oracle: короткий формат хост:порт/сервис либо TNS-псевдоним |
DB_USER, DB_PASSWORD | Пользователь базы-источника и его пароль. Достаточно прав на чтение |
STATEMENT | Запрос выборки. Выполняется целиком при каждом срабатывании расписания |
4. Заполните переменные события
Эта группа определяет, как строка выборки превращается в событие.
| Переменная | Смысл |
|---|---|
ID_FIELD | Колонка выборки с идентификатором клиента. Обязательна. Название — дословно как в выборке, с учётом регистра. По этому значению события одного клиента попадают в один поток и обрабатываются последовательно |
EVENT_NAME | Имя события, одинаковое для всех строк выборки |
EVENT_FIELD | Альтернатива предыдущей: колонка, из которой берётся имя события для каждой строки. Заполняется только одна из двух |
EVENT_CONTEXT | Шаблон контекста: пары «имя поля,{{колонка}}» через запятую без пробелов. Число элементов должно быть чётным |
FLOW_ID | Идентификатор сценария-адресата. Пустое значение — событие уходит во все сценарии |
FLOW_ID_FIELD | Альтернатива предыдущей: колонка с идентификатором сценария. Заполняется только одна из двух |
EVENTS_PER_SECOND | Потолок строк в секунду; 0 или пустое значение — без ограничения. Ограничение притормаживает не только отправку, но и чтение из источника |
Если не заданы ни EVENT_NAME, ни EVENT_FIELD, адаптер запустится, но события отправлять не будет — только записывать ошибку в лог на каждую строку. Задайте одну из двух переменных до запуска.
5. Запустите адаптер
Выполните команду:
docker compose -f <путь к файлу> up -dКоманда docker ps покажет контейнер sql_adapter в статусе Up.
Инкрементальное чтение
Без него запрос выполняется как есть при каждом срабатывании расписания, и уже обработанные строки читаются повторно. Инкрементальное чтение хранит курсор — максимум выбранной колонки по последней выборке — в Redis и подставляет его в запрос, чтобы читать только новое.
Добавьте в environment группу переменных. При MAX_VALUE=true обязательны все перечисленные: без любой из них адаптер завершается при старте.
| Переменная | Смысл |
|---|---|
MAX_VALUE | true — включить инкрементальное чтение |
INCREMENT_COLUMN | Колонка выборки, по которой ведётся курсор: числовая либо дата-время |
INCREMENT_TYPE | Тип сравнения значений колонки: number или datetime |
DATETIME_FORMAT | Формат даты; обязателен только при INCREMENT_TYPE=datetime. В этом же формате курсор хранится в Redis |
QUERY_TEMPLATE_PARAM_NAME | Имя параметра в запросе, на место которого подставляется курсор. При имени lastValue в STATEMENT пишется условие вида WHERE <колонка> > {{lastValue}} |
INITIAL_VALUE | Значение курсора для самого первого запуска, пока в Redis ничего нет. Определяет, с какой глубины начнётся первая выборка |
Первая выборка читает не всё содержимое таблицы, а данные от INITIAL_VALUE. Историческая глубина первой загрузки управляется именно этим значением.
Проверка
- Выполните
curl http://localhost:3010/ready— ожидается успешный ответ: источник, брокер и Redis доступны. Проба работает приENABLE_METRICS=trueиз образца конфигурации. - Дождитесь первого срабатывания расписания и откройте лог:
docker logs -f sql_adapter— появятся записи о выполнении выборки. - Убедитесь, что счётчик прочитанных строк растёт:
curl -s http://localhost:3010/metrics | grep events_counter— значение больше нуля после первой непустой выборки.
До первого срабатывания расписания адаптер не делает ничего. При редком расписании тишина в логе сразу после запуска — нормальное состояние, а не сбой.
Решение проблем
Контейнер завершается сразу после запуска
Симптом: docker ps контейнер не показывает, docker ps -a — статус Exited (1).
Причина: не прошла проверка конфигурации — не задана обязательная переменная, DRIVER отличен от Oracle либо CRON не проходит валидацию.
Шаги: прочитайте причину в docker logs sql_adapter, сверьте переменные с таблицами шагов 3 и 4, перезапустите. Если не помогло — проверьте, что в значениях нет невидимых символов и лишних пробелов после знака =.
После запуска в логе нет активности
Причина: либо расписание ещё не сработало, либо недоступен RabbitMQ — расписание заводится только после установления канала с брокером.
Шаги: проверьте доступность брокера пробой curl http://localhost:3010/ready; сверьте CRON с учётом московской таймзоны. Если не помогло — временно установите частое расписание, например */30 * * * * *, и убедитесь, что выборка выполняется.
Строки читаются, события во Flow не приходят
Причина: не задана ни EVENT_NAME, ни EVENT_FIELD; либо FLOW_ID указывает не на тот сценарий; либо в сценарии нет триггера на это имя события.
Шаги: проверьте лог на ошибки формирования события; сверьте имя события с триггером сценария; уберите FLOW_ID для проверки — событие уйдёт во все сценарии. Если не помогло — проверьте в метриках broker_connection_status: значение 0 означает разрыв с брокером, события не публикуются.
Одни и те же события приходят повторно
Причина: инкрементальное чтение выключено, и каждая выборка возвращает те же строки.
Шаги: включите инкрементальное чтение по разделу выше либо ограничьте STATEMENT условием по времени. Если не помогло — проверьте, что второй экземпляр адаптера с тем же ADAPTER_NAME не перезаписывает курсор.
В логе предупреждение о пропущенном запуске
Причина: предыдущая выборка ещё выполняется — параллельные прогоны исключены, пропущенный запуск не навёрстывается.
Шаги: разредите расписание или уменьшите объём выборки условиями в STATEMENT. Если не помогло — проверьте значение EVENTS_PER_SECOND: заданный потолок замедляет и чтение, растягивая прогон.
Остановка и откат
Остановите адаптер командой:
docker compose -f <путь к файлу> downКурсор инкрементального чтения при остановке сохраняется в Redis: после повторного запуска выборка продолжится с сохранённого места, повторной загрузки не будет.
Полный откат инкремента — удаление ключа platform:sqladapter:lastrowkey<имя адаптера>:<инкрементная колонка> из Redis. Следующая выборка начнётся заново от INITIAL_VALUE, и уже отправленные события уйдут во Flow повторно.
Связанные страницы
- SQL-адаптер — обзор: возможности и границы модуля
- Особенности подключения к Redis
- Хранение секретных данных в Docker Secret
- Получение секретных данных из HashiCorp Vault
- Метрики Prometheus
- Метрики Zabbix