Change Data Capture
Внимание
Поддерживается только для строковых таблиц. Поддержка функциональности для колоночных таблиц находится в разработке.
Change Data Capture (CDC) позволяет отслеживать изменения данных в строковых таблицах. YDB предоставляет доступ к потоку изменений, тем самым потребители данных могут отслеживать происходящие изменения почти в реальном времени.
Включение и выключение CDC
CDC представлен объектом схемы данных — потоком изменений, который может быть добавлен к таблице или удален директивами ADD CHANGEFEED и DROP CHANGEFEED операции YQL ALTER TABLE
.
Чтение из топика
Для чтения данных можно воспользоваться SDK или YDB CLI. Как и к любому другому объекту схемы данных, к потоку изменений можно обратиться по его пути, который формируется следующим образом:
путь/до/строковой_таблицы/имя_потока_данных
Например, если у строковой таблицы
table
в директорииmy
есть поток изменений с именемupdates_feed
, то путь к нему будет выглядеть так:my/table/updates_feed
Прежде чем приступить к чтению данных, необходимо добавить потребителя данных (consumer). Ниже приведен пример команды, которая добавит потребителя данных с именем my_consumer
в поток данных с именем updates_feed
строковой таблицы table
в директории my
:
ydb topic consumer add \
my/table/updates_feed \
--consumer=my_consumer
Теперь можно воспользоваться созданным потребителем данных и запустить процесс отслеживания. Ниже приведен пример команды, с помощью которой можно отслеживать изменения данных в интерфейсе командной строки:
ydb topic read \
my/table/updates_feed \
--consumer=my_consumer \
--format=newline-delimited \
--wait
Влияние на производительность записи в строковой таблицы
При записи в строковую таблицу с включенным CDC возникают дополнительные накладные расходы на следующие операции:
- формирование записи и сохранение ее в поток изменений;
- хранением записей в потоке изменений;
- в некоторых режимах (например,
OLD_IMAGE
,NEW_AND_OLD_IMAGES
) возникает необходимость предварительного чтения данных, даже если пользовательский запрос этого не предполагает.
Это может вызывать увеличение времени исполнения запросов, а также превышение лимитов на размер хранимых данных.
В реальных сценариях включение CDC практически не влияет время выполнения запросов (вне зависимости от режима), так как почти все данные, необходимые для формирования записей, находятся в кеше, а сами записи отправляются в топик асинхронно. Однако, фоновая активность по отправке записей незначительно (на 1–10%) увеличивает потребление CPU.
При создании потока изменений для строковой таблицы количество партиций его хранилища (топика) определяется на основании текущего количества партиций таблицы. Если количество партиций исходной таблицы значительно изменяется (например, после загрузки большого объёма данных, или в результате интенсивных обращений), то возникает дисбаланс между партициями таблицы и партициями топика. Такой дисбаланс также может приводить к увеличению времени исполнения запросов на модификацию данных в таблице, либо к излишним накладным расходам на хранение потока изменений. Для устранения дисбаланса можно пересоздать поток изменений.
Нагрузочное тестирование
В качестве генератора нагрузки можно воспользоваться встроенной в YDB CLI возможностью эмуляции работы интернет-магазина:
-
Инициализируйте тест.
-
Добавьте поток изменений:
ALTER TABLE `orders` ADD CHANGEFEED `updates` WITH ( FORMAT = 'JSON', MODE = 'UPDATES' );
-
Создайте потребителя данных:
ydb topic consumer add \ orders/updates \ --consumer=my_consumer
-
Запустите процесс отслеживания:
ydb topic read \ orders/updates \ --consumer=my_consumer \ --format=newline-delimited \ --wait
-
Подайте нагрузку.
В интерфейсе командной строки появится поток изменений:
... {"update":{"created":"2022-06-24T11:35:00.000000Z","customer":"Name366"},"key":[13195699997286404932]} {"update":{"created":"2022-06-24T11:35:00.000000Z","customer":"Name3894"},"key":[452209497351143909]} {"update":{"created":"2022-06-24T11:35:00.000000Z","customer":"Name7773"},"key":[2377978894183850258]} ...