Трансфер данных
Трансфер в YDB — асинхронный механизм переноса данных из топика в таблицу. Создание экземпляра трансфера, его изменение и удаление осуществляет с использованием YQL. Трансфер запускается внутри базы данных, работает в фоновом режиме. Трансфер используется для решения задачи поставки данных из топика в таблицу.
Часто на практике удобнее записывать данные не напрямую в таблицу, а в топик, чтобы затем в асинхронном режиме переписывать их из топика в таблицу. Такой подход позволяет равномерно распределять нагрузку и справляться со всплесками, поскольку операция записи в очередь сообщений более лёгкая. В зависимости от количества записываемых сообщений в топик, задержка доступности данных для чтения из таблицы после добавления в топик может составлять от нескольких секунд до нескольких минут.
Трансфер осуществляет чтение сообщений из указанного топика, их преобразование в формат, пригодный для записи в таблицу, и последующую запись в целевую таблицу. Если в таблице уже есть строка с указанным первичным ключом, то строка будет обновлена. Преобразование данных осуществляется с помощью lambda-функции, которая принимает сообщение в качестве параметра и возвращает список структур, каждая из которых соответствует строке, подлежащей добавлению или замене в таблице. Например, если таблица содержит колонку example_column
типа Int32
, структура должна включать именованное поле example_column
того же типа.
Если lambda-функция возвращает пустой список, ни одна строка в таблице не будет изменена. Из lambda-функции не допускается обращение к таблицам и другим объектам YDB.
Используемую lambda-функцию можно получить из описания экземпляра трансфера.
На работу трансфера тратятся дополнительные ресурсы сервера, в первую очередь CPU. Потребление CPU зависит от сложности преобразования записываемых в топик данных.
Трансфер способен читать данные из топиков, расположенных как в базе данных, где он создаётся, так и в другой базе YDB или кластере YDB. Для чтения топика из другой базы данных при создании трансфера необходимо указать параметры подключения к этой базе. Целевая таблица должна находиться в той же базе данных, где создаётся трансфер.
Чтение из топика осуществляется с использованием читателя. Трансфер автоматически добавляет в топик читателя с уникальным именем для чтения сообщений. При удалении трансфера созданный читатель удаляется автоматически. Также возможно создать читателя вручную и указать его имя при создании трансфера. Читатель, созданный вручную, не удаляется автоматически при удалении трансфера. Имя автоматически созданного читателя можно получить из описания экземпляра трансфера.
Если требуется передача данных из одного топика в несколько таблиц, для каждой таблицы необходимо создать отдельный трансфер. Аналогично, данные из нескольких топиков могут быть направлены в одну таблицу, для чего каждый топик должен быть ассоциирован с отдельным трансфером. Если имя читателя задаётся вручную, то при наличии нескольких трансферов, читающих из одного топика, необходимо назначить каждому трансферу уникального читателя, иначе данные будут обработаны только одним из них.
Примечание
При обновлении строки в таблице производится полная перезапись её значений данными из возвращаемой lambda-функцией структуры. Если структура не содержит именованного поля, соответствующего колонке таблицы, значение этой колонки будет установлено в NULL
. Именованные поля, не имеющие соответствия в таблице, игнорируются.
При попытке записать в NOT NULL
колонку таблицы значение NULL
трансфер остановится с критичной ошибкой.
Гарантии
- Гарантируется, что записи в таблицу будут происходить в том же порядке, в которую они были записаны в партицию топика. Рекомендуется группировать сообщения, относящиеся к одной строке таблицы, в одну партицию топика.
- Запись в таблицу осуществляется с использованием пакетной вставки без гарантий атомарности. Запись данных разбивается на несколько независимых транзакций, каждая их которых затрагивает единственную партицию таблицы, с параллельным исполнением.
Начало работы трансфера
Если трансфер создаётся без явного указания имени читателя, то в топик будет добавлен новый читатель, и обработка сообщений топика начнётся с первого сообщения в топике.
Если трансфер создаётся с указанием созданного ранее читателя, то обработка сообщений топика начнётся с первого необработанного этим читателем сообщения.
Необходимые права для работы трансфера
Для создания и выполнения трансфера пользователь должен обладать правами на запись в целевую таблицу и чтение из исходного топика. Если топик расположен в другой базе данных YDB, читатель создаётся автоматически; дополнительно требуется право на модификацию топика, что позволяет трансферу автоматически создавать читателя и удалять его при удалении трансфера.
Диагностика
Текущие параметры трансфера, включая текст lambda-функции, можно просмотреть в пользовательском интерфейсе Embedded UI и в описании экземпляра трансфера.
Скорость обработки данных и задержки можно контролировать по метрикам консьюмера, который используется для чтения из топика.
Временная остановка трансфера
Работа трансфера может быть временно приостановлена, а затем возобновлена. После возобновления работы трансфера начнут обрабатываться сообщения, следующие за последним обработанным сообщением в топике.
Для остановки трансфера следует изменить статус трансфера на PAUSED
, а для возобновления — на STANDBY
.
Важно
Следует учесть, что в топике есть время хранения сообщений, по истечении которого сообщения удаляются. Если с момента остановки трансфера пройдёт больше времени, чем время хранения сообщений, то сообщения будут удалены и не будут обработаны после возобновления работы трансфера.
Чтобы гарантировать, что необработанные сообщения не будут удалены, следует сделать читателя важным.
Обработка ошибок в процессе трансфера
В процессе трансфера возможно возникновение разных типов ошибок:
- Временные сбои. Транспортные ошибки, перегрузка системы и другие временные проблемы. Запросы будут повторяться до успешного выполнения.
- Критичные ошибки. Ошибки, связанные с правами доступа, схемой данных и другими критическими аспектами. В случае возникновения таких ошибок трансфер будет остановлен, и в пользовательском интерфейсе Embedded UI на странице трансфера будет указан текст ошибки. Также текст ошибки можно получить из описания экземпляра трансфера.
Для возобновления работы трансфера необходимо выполнить команду ALTER
с устранением причины ошибки. Например, если ошибка содержалась в тексте lambda-функции, то следует изменить lambda-функцию.