Skip to main content

JDBC-коннектор

Бизнес-требования

Основные требования к фиче:

  • Заменить подключение к БД в диспетчере данных на JDBC-коннектор
  • Единый способ подключения к разным СУБД
  • Возможность добавлять новые коннекторы к любой СУБД прямо из интерфейса системы
  • Возможность управлять параметрами подключения через конфигурацию источника
  • Обеспечить безопасность соединения
  • Сохранить логику взаимодействия с микросервисами бэкенда, просмотр статуса подключения
  • Настроить логирование всех операций с JDBC-коннекторами
  • Коннектор и нагрузка на него никак не должны влиять на производительность системы, при падении драйвера не должен падать основной поток FB
  • В документации требуется добавить новый раздел, посвященный добавлению JDBC-драйвером и подключению по JDBC к внешним СУБД

В базовой конфигурации должно быть настроено подключение к следующим СУБД (уточнить актуальные версии):

  • ClickHouse
  • PostgreSQL
  • MSSQL
  • MYSQL
  • ORACLE

Вопросы:

  • Нужны ли типы защиты SSL/SSH?
  • Нужен ли валидатор драйверов? Какие поддерживаем результаты валидации (принято/отклонено или принято/предупреждение/отклонено)
  • Формирование JDBC URL: строка подключения в формате jdbc:<subdb>://<host>:<port>/<database>? 
  • Продумать стратегию перехода с текущих коннекторов к БД на JDBC

План работ

  • Управление драйверами (бэкенд)
    • Подготовить каталог для хранения jar-файлов драйверов с правами доступа только для сервисов платформы; обеспечить резервное копирование этого каталога
    • Настроить валидатор драйверов: проверить наличие обязательных мета-методов (getTables, getColumns, getImportedKeys, getColumnName, getColumnType, getScale, getColumnCount); обеспечить логирование результатов валидации
    • Обеспечить регистрацию драйвера в реестре: записать тип, версию, хэш-сумму (?), дату загрузки, статус
    • Настроить хранение лицензионных ключей драйверов БД; обеспечить проверку наличия лицензии при регистрации драйвера
  • Управление драйверами (фронтенд)
    • Реализовать интерфейс загрузки драйвера: выбор файла, ввод типа СУБД, версии, описания; обеспечить проверку файла
    • Реализовать вывод списка доступных драйверов в интерфейсе настройки источников
  • Конфигурация подключений (бэкенд)
    • Настроить хранение учётных данных в хранилище с обратимым шифрованием; обеспечить передачу секретов микросервисам только в момент выполнения подключения
    • Реализовать модуль тестирования подключения: при нажатии «Проверить» микросервисы пытаются установить соединение с внешней БД и выполнить пробный запрос; обеспечить возврат понятного сообщения об успехе или ошибке
    • Реализовать поддержку параметров SSL: загрузка сертификата сервера, настройка взаимной аутентификации при необходимости; обеспечить проверку валидности сертификата при тестировании подключения
    • Реализовать поддержку SSH-туннеля: ввод хоста, порта, логина, пароля или ключа; обеспечить создание туннеля перед установкой JDBC-соединения и его закрытие после завершения
  • Конфигурация подключений (фронтенд)
    • Реализовать форму создания источника данных: выбор драйвера из реестра, ввод JDBC URL, логина, пароля, настроек SSL/SSH; обеспечить маскировку пароля в интерфейсе
  • Загрузка данных (бэкенд)
    • Реализовать логику Cron: запуск загрузок по расписанию или событию; обеспечить передачу контекста выполнения в Blocker и обработку ошибок запуска
    • Реализовать логику Blocker: проверка активной загрузки для того же источника; обеспечить установку и снятие блокировки, предотвращение параллельного импорта одной таблицы
    • Реализовать логику Loader: чтение данных из внешней БД через JDBC-драйвер с учётом параметров подключения
    • Настроить запись данных в ClickHouse
  • Логирование и мониторинг (бэкенд)
    • Настроить сбор логов при добавлении и валидации драйверов, создании JDBC-подключений
    • Настроить алертинг: при ошибке загрузки, таймауте подключения или превышении лимита попыток отправлять уведомление
  • Ролевая модель (бэкенд)
    • Доступ к добавлению и валидации драйверов имеют только пользователи с ролью "Администратор системы"
    • Доступ к созданию подключений имеют только пользователи с ролью "Разработчик" и выше

Архитектурная схема

JDBC.png

Сценарии использования

Use case Зачем нужен
Администратор взаимодействует с веб-интерфейсом
Точка входа для всех операций с драйверами
Интерфейс читает/записывает данные в реестр драйверов
Чтобы показать список доступных драйверов и сохранить новый
Интерфейс передаёт файл драйвера на валидацию
Проверка корректности .jar-файла перед сохранением
Валидатор сохраняет проверенный файл в хранилище
Физическое хранение драйверов на диске
Реестр передаёт список доступных типов драйверов во Слой 2
Чтобы дата-инженер видел только проверенные драйверы при создании источника
BI-разработчик запускает тест подключения
Проверка работоспособности настроек перед сохранением
BI-разработчик создаёт/редактирует конфигурацию подключения
Сохранение параметров: URL, порт, имя БД
BI-разработчик настраивает маппинг таблиц и полей
Определение, какие данные и как загружать из источника
Конфигурация ссылается на хранилище учётных данных
Пароли хранятся отдельно от конфигурации (безопасность)
Конфигурация ссылается на настройки SSL/SSH
Параметры защищённого соединения вынесены отдельно
Модуль тестирования вызывает микросервисы для проверки
Реальное подключение к БД выполняется через ETL-сервисы
Микросервисы читают параметры подключения
Чтобы знать, к какой БД подключаться
Микросервисы читают правила маппинга
Чтобы знать, какие таблицы и поля загружать
Хранилище передаёт учётные данные микросервисам
Логин/пароль для подключения к внешней БД
Настройки SSL/SSH передаются микросервисам
Для защищённого соединения с источником
Микросервисы читают данные из внешних БД через JDBC
Основной процесс ETL-загрузки
Микросервисы записывают данные в ClickHouse
Загрузка данных в БД проекта для аналитики
Микросервисы пишут логи загрузки
Отладка ETL-процессов, мониторинг ошибок
Валидатор пишет логи проверки драйверов
Аудит операций с драйверами, отладка проблем

Критерии приёмки

Решение

Управление драйверами

Системная логика (бэкенд)

План работ:

  • Подготовить каталог для хранения jar-файлов драйверов с правами доступа только для сервисов платформы; обеспечить резервное копирование этого каталога
  • Настроить валидатор драйверов: проверить наличие обязательных мета-методов; обеспечить логирование результатов валидации
  • Обеспечить регистрацию драйвера в реестре: записать тип, версию, путь к файлу, хэш-сумму (?), дату загрузки, статус
  • Настроить хранение лицензионных ключей драйверов в БД; обеспечить проверку наличия лицензии при регистрации драйвера

Реестр драйверов:

  • Требуется обеспечить хранение jar-файлов в системном хранилище (например, в серверном хранилище)
  • Требуется обеспечить хранение параметров драйверов в системном хранилище (например, в PG):
    • id записи
    • Путь к файлу драйвера в хранилище
    • Тип СУБД – текст
    • Версия СУБД – текст
    • Описание – текст
    • Статус – текст
  • Требуются методы для:
    • Передачи jar-файлов с фронтенда
      • POST-запрос
      • Передает в себе:
        • Файл драйвера
        • Тип СУБД – текст
        • Версия СУБД – текст
        • Описание – текст
      • Должна быть выполнена проверка валидации файла (см. далее)
      • Должна быть проверка на роль пользователя – только администратор системы
    • Получения списка jar-файлов из хранилища
      • GET-запрос
      • Ничего не передает в себе
      • Ожидает в ответ список параметров файлов:
        • id записи из хранилища параметров
        • Тип СУБД – текст
        • Версия СУБД – текст
        • Описание – текст
        • Статус – текст
      • Должна быть проверка на роль пользователя – только администратор системы
    • Обновления jar-файлов в хранилище:
      • PATCH-запрос (ну или PUT, просто стараюсь соблюсти REST)
      • Передает в себе:
        • id записи из хранилища параметров
      • Может передавать в себе:
        • Файл драйвера
        • Тип СУБД – текст
        • Версия СУБД – текст
        • Описание – текст
      • При перезаписи файла должна быть выполнена проверка валидации как при добавлении файла
        • Если валидация пройдена, старый файл удаляется, вместо него добавляется переданный
      • Должна быть проверка на роль пользователя – только администратор системы
    • Удаления jar-файлов в хранилище:
      • DELETE-запрос
      • Передает в себе:
        • id записи из хранилища параметров
      • Удаляется и запись в хранилище параметров, и jar-файл в реестре драйверов согласно пути к файлу в хранилище параметров
      • Должна быть проверка на роль пользователя – только администратор системы

Валидатор драйверов:

Валидатор проверяет загружаемый .jar-файл JDBC-драйвера перед регистрацией в реестре. Его цель – не допустить в систему некорректные, повреждённые или небезопасные файлы.

  • Требуется метод для вызова валидации файла:
    • POST-запрос
    • Передаёт в себе jar-файл
    • Должна быть проверка на роль пользователя – только администратор системы
  • Обязательно выполняются следующие проверки:
    • Расширение файла = .jar
    • MIME-тип = application/java-archive или application/zip
    • Неповрежденная структура файла
    • Размер файла < 100 MB
    • Наличие манифеста META-INF/MANIFEST.MF
    • Отсутствуют подозрительные классы
    • Цифровая подпись файла валидна (при наличии)
    • Хэш не в списке уязвимых
    • Файл уникален в реестре драйверов
  • Дополнительно могут выполняться проверки для защиты при загрузке файлов
  • В случае ошибки необходимо возвращать на фронтенд текст "Валидация файла не пройдена. Ошибка:" + текст системной ошибки

Пользовательский интерфейс

 

Конфигурация подключений

Загрузка данных

Логирование и мониторинг

Ролевая модель