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-name=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 возможностью эмуляции работы интернет-магазина:

  1. Инициализируйте тест.

  2. Добавьте поток изменений:

    ALTER TABLE `orders` ADD CHANGEFEED `updates` WITH (
        FORMAT = 'JSON',
        MODE = 'UPDATES'
    );
    
  3. Создайте потребителя данных:

    ydb topic consumer add \
      orders/updates \
      --consumer-name=my_consumer
    
  4. Запустите процесс отслеживания:

    ydb topic read \
      orders/updates \
      --consumer=my_consumer \
      --format=newline-delimited \
      --wait
    
  5. Подайте нагрузку.

    В интерфейсе командной строки появится поток изменений:

    ...
    {"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]}
    ...