aboutsummaryrefslogtreecommitdiffstats
path: root/ydb/docs/ru/core/dev/cdc.md
blob: 4fe657a89907847095f918b0eb79be31e5246a65 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# Change Data Capture

{% include [not_allow_for_olap](../_includes/not_allow_for_olap_note_main.md) %}

[Change Data Capture](../concepts/cdc.md) (CDC) позволяет отслеживать изменения данных в строковых таблицах. {{ ydb-short-name }} предоставляет доступ к потоку изменений, тем самым потребители данных могут отслеживать происходящие изменения почти в реальном времени.

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

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

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

Для чтения данных можно воспользоваться [SDK](../reference/ydb-sdk/) или [{{ ydb-short-name }} CLI](../reference/ydb-cli/). Как и к любому другому объекту схемы данных, к потоку изменений можно обратиться по его пути, который формируется следующим образом:

```txt
путь/до/строковой_таблицы/имя_потока_данных
```

>Например, если у строковой таблицы `table` в директории `my` есть поток изменений с именем `updates_feed`, то путь к нему будет выглядеть так:
>
>```text
>my/table/updates_feed
>```

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

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

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

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

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

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

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

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

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

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

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

В качестве генератора нагрузки можно воспользоваться встроенной в {{ ydb-short-name }} CLI возможностью [эмуляции работы интернет-магазина](../reference/ydb-cli/commands/workload/stock):

1. [Инициализируйте](../reference/ydb-cli/commands/workload/stock#init) тест.
1. Добавьте поток изменений:

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

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

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

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

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

1. [Подайте](../reference/ydb-cli/commands/workload/stock#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]}
    ...
    ```