Первинне завантаження даних
Загальний опис
Розробка реєстру на Платформі може передбачати міграцію даних з наявного реєстру або реєстрів на Платформу. Дані в реєстрах можуть бути представлені в табличному вигляді так і мати додатково пов’язані з ними файли. В такому випадку адміністратору реєстру необхідно завантажити ці дані до реєстру на Платформі і такі дані називаються первинні.
Загальні принципи та положення
-
Підтримуються тільки завантаження даних в CSV-форматі.
-
Завантаження даних може відбуватись тільки в порожні таблиці.
-
Структура файлу має повністю відповідати структурі таблиці.
-
Завантаження відбувається в режимі streaming так, що нема потреби завантажувати весь файл в памʼять.
-
Завантаження файлів до ceph кошика тимчасового зберігання первинних даних відбувається через s3-сумісний компонент на веб-інтерфейсі.
-
Доступ з інтерфейсу адміністрування даних реєстру для додавання та видалення файлів надається тільки до кошику тимчасового зберігання.
-
При первинному завантаженні даних, запис здійснюється не через процедуру.
-
При первинному завантаженні даних, не застосовуються перевірки RBAC та RLS.
-
Зберігання звʼязків між операційною та історичною таблицями відбувається прозоро в утиліті первинного завантаження даних таблиць.
-
В один момент часу може готуватись завантаження тільки для однієї таблиці, оскільки всі інші файли будуть переноситись як пов’язані.
-
В якості роздільників колонок використовується ; а для розділення елементів в масиві використовується кома -
,
-
Завантаження даних відбувається в одній транзакції.
Високорівневий дизайн рішення
Сервіси та їх призначення
Вебінтерфейс адміністрування даних реєстру - вебінтерфейс для створення процесів завантаження посадових осіб та первинного завантаження даних.
Сервіс адміністрування даних реєстру - сервіс який надає REST API для створення запитів на завантаження посадових осіб, завантаження первинних даних.
Утиліта первинного завантаження сутностей в таблиці - утиліта яка за допомогою динамічної генерації SQL на підставі структури вхідного CSV-файлу, зберігає дані в БД підтримуючи звязок таблиці сутності та історичної таблиці.
Розгортання сервісів
Ключові сценарії взаємодії сервісів
Створення тимчасової схеми в операційній БД
Використання цієї функціональності можливо лише для реєстрів в режимі розробки. |
При розгортанні реєстру, створюється додаткова схема sandbox та користувач з правами на створення, видалення, зміну таблиць в рамках цієї схеми.
Завантаження даних в тимчасову схему
Використання цієї функціональності можливо лише для реєстрів в режимі розробки. |
Тимчасова схема використовується для розробки, і в ній дозволені прямі маніпуляції з даними, створення та видалення таблиць. Операції в цій схемі здійснюються за допомогою веб-застосунку pgAdmin
.
Основною метою даної схеми в контексті первинного завантаження є:
-
Приведення наявних даних (історичних даних) до вигляду який відповідає сутностям в реєстрі на Платформі.
Наприклад: Конвертація типів, зміна структури зберігання даних тощо. -
Побудова звʼязків між сутностями реєстру та історичними даними. Наприклад: Використання посилання на довідники які вже використовуються реєстром на Платформі.
Завантаження даних до кошика тимчасового зберігання первинних даних
Завантаження CSV файлу та, при потребі, повʼязаних з даними файлів, до s3 сумісного сховища відбувається безпосередньо з веб-інтерфейс адміністрування даних реєстру. Завантаження файлів може відбуватись в декілька ітерацій. Після завантаження файлів вони відображаються в табличному вигляді.
Таким чином компонент який використовується для завантаження даних дозволяє завантажувати тільки один файл з розширенням csv і завантажує його в корінь кошика.
Компонент для завантаження пов’язаних файлів дозволяє додавати множину файлів і завантажує їх в директорію content
У випадку необхідності очистити кошик тимчасового зберігання даних передбачено окрему кнопку, яка буде видаляти весь вміст кошика після підтвердження операції.
Завантаження готових даних в операційну базу реєстру
Після завантаження даних до кошика тимчасового зберігання первинних даних адміністратор реєстру має вказати в яку структуру БД будуть завантажуватись дані, та підтвердити свій вибір.
Процес завантаження включає в себе потокову обробку файлу таким чином, що кожен рядок CSV зберігається у відповідну структуру та додатково створюється запис про вставку в історичній таблиці. В якості даних для службових полів в історичній таблиці використовується значення admin для того хто зберіг дані та initial_lodad для значення підписів.
Завантаження даних з пов’язаними файлами в операційну дану реєстру
Якщо сутність що завантажується містить пов’язані файли, то спочатку відбувається перенос файлів до кошику зберігання файлів та збереження відповідного ідентифікатора в таблицю ddm_initial_load_file_references разом з оригінальною назвою файлу. В подальшому при переносі даних з csv до операційної БД для поля що містить файлові посилання відбувається заміна назви файлу на його ідентифікатор.
Низькорівневий дизайн сервісів
Вебінтерфейс адміністрування даних реєстру
Ключові сценарії
-
Запуск процесу завантаження посадових осіб.
-
Завантаження та видалення файлів до тимчасового кошика зберігання первинних даних.
-
Перегляд вмісту кошика для тимчасового зберігання первинних даних.
-
Запуск процесу завантаження первинних даних до операційної БД.
-
Отримання ключа і секрету для доступу до s3-кошика.
Структура меню
Передбачено два сценарії використання веб-інтерфейсу для завантаження даних або завантаження посадових осіб.
-
Завантаження первинних даних сутності реєстру.
-
Завантаження посадових осіб.
Компонент по роботі з S3-кошиком
Компонент являє собою існуючий drag-n-drop таблицю для файлів, з реалізацією завантаження на події компоненти. (додавання, видалення, перегляд вмісту по ключу).
При завантаженні компонента відбувається перегляд відповідного s3-кошика для налаштованого шляху.
Також на компоненті налаштовується перевірка розширень файлів.
Для того, щоб не створювати додаткове навантаження на Сервіс адміністрування даних реєстру при роботі з S3-кошиком яким міг би виступати лише як proxy для Rados Gateway компонент інтерфейсу працює безпосередньо з Rados Gateway.
Для автентифікації JS s3-клієнта, ключ і секрет отримується запитому до Сервісу адміністрування даних реєстру.
Сервіс адміністрування даних реєстру
Ключові сценарії
-
Запуск K8s Job по завантаженню посадових осіб.
-
Запуск K8s Job по завантаженню первинних даних сутності реєстру.
-
Отримання переліку таблиць доступних для завантаження.
-
Отримання статусу виконання завантаження.
Технічний стек
Як основний framework використовується Spring Boot 3.15 та використання Native Image та in container build.
Утиліта первинного завантаження сутностей в таблиці
Ключові сценарії
-
Копіювання даних з тимчасового кошика зберігання даних до кошика архівного зберігання даних.
-
Запис даних з csv файлів до операційної БД в таблиці сутностей та історичних таблиць.
Технічний стек
Як основний framework використовується Spring Boot 3.15 та використання Native Image та in container build.
Вхідні параметри
USER_ACCESS_TOKEN - токен користувача який ініціалізував процес завантаження даних+
TABLE_NAME - назва таблиці в яку відбувається завантаження
CSV_FILE - назва csv файла дані з якого будуть завантажуватись в таблицю вказану в параметрі TABLE_NAME
REQUEST_ID - ідентифікатор X-B3-TraceId
для відслідковування
Аудит
Дії користувачів які фіксуються в аудиті:
-
Старт процесу завантаження
-
Завершення процесу завантаження
База даних
Окрім користувача з доступом до вставки даних в таблиці реєстру існує окрема таблиця ddm_initial_load_file_references
CREATE TABLE public.initial_load_file_references (
id INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL,
file_bucket_uuid UUID NOT NULL,
initial_load_file_name TEXT NOT NULL,
CONSTRAINT pk_initial_load_file_references PRIMARY KEY (id)
);
Назва колонки |
Призначення |
Приклад |
id |
ідентифікатор запису |
42 |
file_bucket_uuid |
ідентифікатор з яким було збережено файл до кошика збереження файлів |
dd969351-6255-4ae3-ab44-098ea8425c30 |
initial_load_file_name |
назва файлу в csv-файлі |
sidorenko_passport_scan.jpg |
Завантаження даних до операційних таблиць.
<createTable tableName="person" ext:historyFlag="true">
<column name="user_id" type="UUID" defaultValueComputed="uuid_generate_v4()">
<constraints nullable="false" primaryKey="true" primaryKeyName="pk_property_id"/>
</column>
<column name="first_name" type="TEXT"/>
<column name="last_name" type="TEXT"/>
<column name="passport" type="FILE"/>
<column name="inn" type="TEXT"/>
</createTable>
firstName;lastName;passport;inn
Петро;Петренко;petrenko_passport_scan.jpg;11111111
Микола;Сидоренко;sidorenko_passport_scan.jpg;22222222
Кроки завантаження даних:
-
Перенесення файлів з initial-data-load-raw папки content до file-ceph-bucket зі зміною імені на ідентифікатор (uuid).
-
Збереження в таблиці ddm_initial_load_file_references відповідності імені до ідентифікатора.
-
Динамічне формування запиту вставки сутностей за допомогою pg copy в операційну і історичну таблицю.
-
Потокове опрацювання csv файлу з заміною назви файлів на ідентифікатор за допомогою таблиці ddm_initial_load_file_references
-
Вставка даних в операційну таблицю та історичну таблицю.
-
У випадку помилки вставки в БД, видалення файлів з file-ceph-bucket за ідентифікаторами з ddm_initial_load_file_references
-
Видалення даних з таблиці ddm_initial_load_file_references
З міркувань швидкодії всі файли переносяться до сховища файлів без перевірки використання їх в даних таблиці. |
У випадку непередбачуваного переривання процесу завантаження, пов’язані файли можуть бути видалені, відповідно до таблиці метаданих.
Високорівневий план розробки
План розробки
-
Розробка нового вебінтерфейсу
-
POC для обрання drug-n-drop компонента.
-
Локалізація і конфігурація логотипів та favicon
-
Перенос екранів звантаження посадових осіб.
-
Імплементація завантаження даних в S3 сумісний кошик.
-
-
Розробка сервісу
-
Перенос API для завантаження посадових осіб
-
Імплементація точок інтеграції для отримання інформації про таблиці (інтеграція з БД)
-
Імплементація точок інтеграції для отримання ключа і секрета для s3-кошика (інтеграція з OpenShift API)
-
-
Розробка утиліти
-
Реалізація переносу файлів
-
Реалізація завантаження даних
-
Реалізація механізму очистки кошика зберігання файлів у випадку помилок при завантаженні даних
-
-
Адмін портал
-
Видалення коду по завантаженню посадових осіб
-
Переіменування згадки адмін порталу
-
-
Control plane
-
Додавання посилань на новий портал
-
Зміна назви адмін порталу на екранах швидких посилань та управління розгортання компонентів реєстру.
-
Додавання екрану управління розгортанням порталу управління даними реєстру
-
-
Розгортання БД
-
Створення додатковох користувачів (ролей) в Postgres та схеми на етапі розгортання реєстру.
-
-
Логування
-
Побудова Kibana Dashboard для перегляду перебігу процесу завантаження
-