---
metadata:
  - name: generator
    content: Diplodoc Platform v5.52.0
alternate:
  - https://ydb.tech/docs/en/dev/cdc.md?version=v25.4
  - https://ydb.tech/docs/ru/dev/cdc.md?version=v25.4
  - href: ru/dev/cdc.md
    type: text/markdown
    title: Markdown version
  - href: ../llms.txt
    type: text/markdown
    title: llms.txt
sourcePath: ru/core/dev/cdc.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ydb.tech/docs/ru/llms.txt

# Change Data Capture

<!-- source: ru/_includes/not_allow_for_olap_note_main.md -->
{% note warning %}

<!-- source: ru/_includes/not_allow_for_olap_text.md -->
Поддерживается только для [строковых](https://ydb.tech/docs/ru/concepts/datamodel/table.md?version=v25.4#row-oriented-tables) таблиц. Поддержка функциональности для [колоночных](https://ydb.tech/docs/ru/concepts/datamodel/table.md?version=v25.4#column-oriented-tables) таблиц находится в разработке.
<!-- endsource: ru/_includes/not_allow_for_olap_text.md -->

{% endnote %}
<!-- endsource: ru/_includes/not_allow_for_olap_note_main.md -->

[Change Data Capture](https://ydb.tech/docs/ru/concepts/cdc.md?version=v25.4) (CDC) позволяет отслеживать изменения данных в строковых таблицах. YDB предоставляет доступ к потоку изменений, тем самым потребители данных могут отслеживать происходящие изменения почти в реальном времени.

## Включение и выключение CDC {#add-drop}

CDC представлен объектом схемы данных — потоком изменений, который может быть добавлен к таблице или удален директивами [ADD CHANGEFEED и DROP CHANGEFEED](https://ydb.tech/docs/ru/yql/reference/syntax/alter_table/changefeed.md?version=v25.4) операции YQL `ALTER TABLE`.

## Чтение из топика {#read}

Прежде чем приступить к чтению данных, необходимо добавить [потребителя данных (consumer)](https://ydb.tech/docs/ru/concepts/datamodel/topic.md?version=v25.4#consumer). Ниже приведен пример команды, которая добавит потребителя данных с именем `my_consumer` в поток данных с именем `updates_feed` строковой таблицы `table` в директории `my`:

```bash
ydb topic consumer add \
  my/table/updates_feed \
  --consumer=my_consumer
```

Теперь можно воспользоваться созданным потребителем данных и запустить процесс отслеживания. Ниже приведен пример команды, с помощью которой можно отслеживать изменения данных в интерфейсе командной строки:

```bash
ydb topic read \
  my/table/updates_feed \
  --consumer=my_consumer \
  --format=newline-delimited \
  --wait
```

## Влияние на производительность записи в строковой таблицы {#performance-considerations}

При записи в строковую таблицу с включенным CDC возникают дополнительные накладные расходы на следующие операции:

* формирование записи и сохранение ее в поток изменений;
* хранением записей в потоке изменений;
* в некоторых [режимах](https://ydb.tech/docs/ru/yql/reference/syntax/alter_table/changefeed.md?version=v25.4) (например, `OLD_IMAGE`, `NEW_AND_OLD_IMAGES`) возникает необходимость предварительного чтения данных, даже если пользовательский запрос этого не предполагает.

Это может вызывать увеличение времени исполнения запросов, а также превышение лимитов на размер хранимых данных.

В реальных сценариях включение CDC практически не влияет время выполнения запросов (вне зависимости от режима), так как почти все данные, необходимые для формирования записей, находятся в кеше, а сами записи отправляются в топик асинхронно. Однако, фоновая активность по отправке записей незначительно (на 1–10%) увеличивает потребление CPU.

При создании потока изменений для строковой таблицы количество партиций его хранилища (топика) определяется на основании текущего количества партиций таблицы. Если количество партиций исходной таблицы значительно изменяется (например, после загрузки большого объёма данных, или в результате интенсивных обращений), то возникает дисбаланс между партициями таблицы и партициями топика. Такой дисбаланс также может приводить к увеличению времени исполнения запросов на модификацию данных в таблице, либо к излишним накладным расходам на хранение потока изменений. Для устранения дисбаланса можно пересоздать поток изменений.

## Нагрузочное тестирование {#workload}

В качестве генератора нагрузки можно воспользоваться встроенной в YDB CLI возможностью [эмуляции работы интернет-магазина](https://ydb.tech/docs/ru/reference/ydb-cli/commands/workload/stock.md?version=v25.4):

1. [Инициализируйте](https://ydb.tech/docs/ru/reference/ydb-cli/commands/workload/stock.md?version=v25.4#init) тест.
1. Добавьте поток изменений:

    ```yql
    ALTER TABLE `orders` ADD CHANGEFEED `updates` WITH (
        FORMAT = 'JSON',
        MODE = 'UPDATES'
    );
    ```

1. Создайте потребителя данных:

    ```bash
    ydb topic consumer add \
      orders/updates \
      --consumer=my_consumer
    ```

1. Запустите процесс отслеживания:

    ```bash
    ydb topic read \
      orders/updates \
      --consumer=my_consumer \
      --format=newline-delimited \
      --wait
    ```

1. [Подайте](https://ydb.tech/docs/ru/reference/ydb-cli/commands/workload/stock.md?version=v25.4#run) нагрузку.

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

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