Skip to content

Commit 9dbab4a

Browse files
nshestakovblinkovfomichev3000
authored
Transfer documentation #2 (#20816)
Co-authored-by: Ivan Blinkov <ivan@blinkov.ru> Co-authored-by: Andrey Fomichev <andrey.fomichev@gmail.com>
1 parent 9e528c5 commit 9dbab4a

File tree

13 files changed

+450
-1
lines changed

13 files changed

+450
-1
lines changed

ydb/docs/presets.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ default:
2323
feature_resource_pool_classifier: true
2424
feature_view: true
2525
feature_async_replication: true
26+
feature_transfer: true
2627
feature_batch_operations: true
2728
ydb: YDB
2829
ydb-name: YDB

ydb/docs/ru/core/concepts/glossary.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,14 @@
237237

238238
{% endif %}
239239

240+
{% if feature_transfer == true %}
241+
242+
### Экземпляр трансфера {#transfer-instance}
243+
244+
**Экземпляр трансфера** — это именованная сущность, хранящая настройки [трансфера](transfer.md), включая настройки подключения и правила преобразования данных. Также с его помощью можно получить информацию о состоянии трансфера, например [ошибки](transfer.md#error-handling).
245+
246+
{% endif %}
247+
240248
### Узел координации {#coordination-node}
241249

242250
**Узел координации** или **coordination node** — это объект схемы, который позволяет клиентским приложениям создавать семафоры для координации своих действий. Узлы координации применяются для реализации распределённых блокировок, обнаружения сервисов, выбора лидера и других сценариев. Более подробно об [узлах координации](./datamodel/coordination-node.md).

ydb/docs/ru/core/concepts/toc_i.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ items:
3232
- name: Асинхронная репликация
3333
href: async-replication.md
3434
when: feature_async_replication
35+
- name: Трансфер данных
36+
href: transfer.md
37+
when: feature_transfer
3538
- name: Оптимизатор запросов
3639
href: optimizer.md
3740
- name: Федеративные запросы

ydb/docs/ru/core/concepts/transfer.md

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# Трансфер данных
2+
3+
Трансфер в {{ ydb-short-name }} — асинхронный механизм переноса данных из [топика](glossary.md#topic) в таблицу. [Создание](../yql/reference/syntax/create-transfer.md) экземпляра трансфера, его [изменение](../yql/reference/syntax/alter-transfer.md) и [удаление](../yql/reference/syntax/drop-transfer.md) осуществляет с использованием YQL. Трансфер запускается внутри базы данных, работает в фоновом режиме. Трансфер используется для решения задачи поставки данных из топика в таблицу.
4+
5+
Часто на практике удобнее записывать данные не напрямую в таблицу, а в топик, чтобы затем в асинхронном режиме переписывать их из топика в таблицу. Такой подход позволяет равномерно распределять нагрузку и справляться со всплесками, поскольку операция записи в очередь сообщений более лёгкая. В зависимости от количества записываемых сообщений в топик, задержка доступности данных для чтения из таблицы после добавления в топик может составлять от нескольких секунд до нескольких минут.
6+
7+
Трансфер осуществляет чтение сообщений из указанного топика, их преобразование в формат, пригодный для записи в таблицу, и последующую запись в целевую таблицу. Если в таблице уже есть строка с указанным [первичным ключом](glossary.md#primary-key), то строка будет обновлена. Преобразование данных осуществляется с помощью [lambda-функции](../yql/reference/syntax/expressions.md#lambda), которая принимает сообщение в качестве параметра и возвращает список [структур](../yql/reference/types/containers.md), каждая из которых соответствует строке, подлежащей добавлению или замене в таблице. Например, если таблица содержит колонку `example_column` типа `Int32`, структура должна включать именованное поле `example_column` того же типа.
8+
Если [lambda-функция](../yql/reference/syntax/expressions.md#lambda) возвращает пустой список, ни одна строка в таблице не будет изменена. Из lambda-функции не допускается обращение к таблицам и другим объектам {{ ydb-short-name }}.
9+
Используемую lambda-функцию можно получить из [описания](../reference/ydb-cli/commands/scheme-describe.md) экземпляра трансфера.
10+
11+
На работу трансфера тратятся дополнительные ресурсы сервера, в первую очередь CPU. Потребление CPU зависит от сложности преобразования записываемых в топик данных.
12+
13+
Трансфер способен читать данные из топиков, расположенных как в [базе данных](glossary.md#database), где он создаётся, так и в другой базе {{ ydb-short-name }} или [кластере](glossary.md#cluster) {{ ydb-short-name }}. Для чтения топика из другой базы данных при создании трансфера необходимо указать параметры подключения к этой базе. Целевая таблица должна находиться в той же базе данных, где создаётся трансфер.
14+
15+
Чтение из [топика](glossary.md#topic) осуществляется с использованием [читателя](glossary.md#consumer). Трансфер автоматически добавляет в топик читателя с уникальным именем для чтения сообщений. При удалении трансфера созданный читатель удаляется автоматически. Также возможно создать читателя вручную и указать его имя при создании трансфера. Читатель, созданный вручную, не удаляется автоматически при удалении трансфера. Имя автоматически созданного читателя можно получить из [описания](../reference/ydb-cli/commands/scheme-describe.md) экземпляра трансфера.
16+
17+
Если требуется передача данных из одного топика в несколько таблиц, для каждой таблицы необходимо создать отдельный трансфер. Аналогично, данные из нескольких топиков могут быть направлены в одну таблицу, для чего каждый топик должен быть ассоциирован с отдельным трансфером. Если имя читателя задаётся вручную, то при наличии нескольких трансферов, читающих из одного топика, необходимо назначить каждому трансферу уникального читателя, иначе данные будут обработаны только одним из них.
18+
19+
{% note info %}
20+
21+
При обновлении строки в таблице производится полная перезапись её значений данными из возвращаемой lambda-функцией структуры. Если структура не содержит именованного поля, соответствующего колонке таблицы, значение этой колонки будет установлено в `NULL`. Именованные поля, не имеющие соответствия в таблице, игнорируются.
22+
23+
При попытке записать в `NOT NULL` колонку таблицы значение `NULL` трансфер остановится с [критичной ошибкой](#error-handling).
24+
25+
{% endnote %}
26+
27+
## Гарантии {#guarantees}
28+
29+
* Гарантируется, что записи в таблицу будут происходить в том же порядке, в которую они были записаны в [партицию](glossary.md#partition) топика. Рекомендуется группировать сообщения, относящиеся к одной строке таблицы, в одну партицию топика.
30+
* Запись в таблицу осуществляется с использованием [пакетной вставки](../recipes/ydb-sdk/bulk-upsert.md) без гарантий атомарности. Запись данных разбивается на несколько независимых транзакций, каждая их которых затрагивает единственную партицию таблицы, с параллельным исполнением.
31+
32+
## Начало работы трансфера
33+
34+
Если трансфер создаётся без явного указания имени читателя, то в топик будет добавлен новый читатель, и обработка сообщений топика начнётся с первого сообщения в топике.
35+
Если трансфер создаётся с указанием созданного ранее читателя, то обработка сообщений топика начнётся с первого необработанного этим читателем сообщения.
36+
37+
## Необходимые права для работы трансфера {#permissions}
38+
39+
Для создания и выполнения трансфера пользователь должен обладать правами на запись в целевую таблицу и чтение из исходного топика. Если топик расположен в другой базе данных {{ ydb-short-name }}, читатель создаётся автоматически; дополнительно требуется право на модификацию топика, что позволяет трансферу автоматически создавать читателя и удалять его при удалении трансфера.
40+
41+
## Диагностика
42+
43+
Текущие параметры трансфера, включая текст lambda-функции, можно просмотреть в пользовательском интерфейсе [Embedded UI](../reference/embedded-ui/index.md) и в [описании](../reference/ydb-cli/commands/scheme-describe.md) экземпляра трансфера.
44+
45+
Скорость обработки данных и задержки можно контролировать по [метрикам читателя](../reference/observability/metrics/index.md#topics), который используется для чтения из топика.
46+
47+
## Временная остановка трансфера {#pause-and-resume}
48+
49+
Работа трансфера может быть временно приостановлена, а затем возобновлена. После возобновления работы трансфера начнут обрабатываться сообщения, следующие за последним обработанным сообщением в топике.
50+
51+
Для остановки трансфера следует [изменить](../yql/reference/syntax/alter-transfer.md#examples) статус трансфера на `PAUSED`, а для возобновления — на `STANDBY`.
52+
53+
{% note warning %}
54+
55+
Следует учесть, что в топике есть [время хранения сообщений](topic.md#retention-time), по истечении которого сообщения удаляются. Если с момента остановки трансфера пройдёт больше времени, чем время хранения сообщений, то сообщения будут удалены и не будут обработаны после возобновления работы трансфера.
56+
57+
Чтобы гарантировать, что необработанные сообщения не будут удалены, следует сделать читателя [важным](topic.md#important-consumer).
58+
59+
{% endnote %}
60+
61+
## Обработка ошибок в процессе трансфера {#error-handling}
62+
63+
В процессе трансфера возможно возникновение разных типов ошибок:
64+
65+
* **Временные сбои**. Транспортные ошибки, перегрузка системы и другие временные проблемы. Запросы будут повторяться до успешного выполнения.
66+
* **Критичные ошибки**. Ошибки, связанные с правами доступа, схемой данных и другими критическими аспектами. В случае возникновения таких ошибок трансфер будет остановлен, и в пользовательском интерфейсе [Embedded UI](../reference/embedded-ui/index.md) на странице трансфера будет указан текст ошибки. Также текст ошибки можно получить из [описания](../reference/ydb-cli/commands/scheme-describe.md) экземпляра трансфера.
67+
68+
Для возобновления работы трансфера необходимо выполнить команду `ALTER` с устранением причины ошибки. Например, если ошибка содержалась в тексте lambda-функции, то следует изменить lambda-функцию. Если ошибка не связана с конфигурацией трансфера, например, отсутствовали права на чтение из топика, то после устранения причины ошибки трансфер необходимо перезапустить сначала [временно остановив](#pause-and-resume), а потом [возобновив](#pause-and-resume) его работу.
69+
70+
## См. также
71+
72+
* [CREATE TRANSFER](../yql/reference/syntax/create-transfer.md)
73+
* [ALTER TRANSFER](../yql/reference/syntax/alter-transfer.md)
74+
* [DROP TRANSFER](../yql/reference/syntax/drop-transfer.md)

ydb/docs/ru/core/security/encryption/data-in-transit.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,10 @@
2222

2323
{% endif %}
2424

25+
{% if feature_transfer == true %}
26+
27+
* В [трансфере](../../concepts/transfer.md) между двумя базами данных {{ ydb-short-name }} одна из них выступает в роли клиента по отношению к другой.
28+
29+
{% endif %}
30+
2531
По умолчанию шифрование данных при передаче отключено и должно быть включено отдельно для каждого протокола. Они могут использовать общий набор TLS-сертификатов или отдельные. Инструкции по включению TLS можно найти в разделе [{#T}](../../reference/configuration/tls.md).

ydb/docs/ru/core/yql/reference/_includes/permissions_list.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
`ydb.database.create` | `CREATE` | Право создавать новые базы данных в кластере
1111
`ydb.database.drop` | `DROP` | Право удалять базы данных в кластере
1212
Элементарные права на объекты базы данных
13-
`ydb.granular.select_row` | `SELECT ROW` | Право читать строки из таблицы (select), читать сообщения сообщения из топиков
13+
`ydb.granular.select_row` | `SELECT ROW` | Право читать строки из таблицы (select), читать сообщения из топиков
1414
`ydb.granular.update_row` | `UPDATE ROW` | Право обновлять строки в таблице (insert, update, upsert, replace), писать сообщения в топики
1515
`ydb.granular.erase_row` | `ERASE ROW` | Право удалять строки из таблицы (delete)
1616
`ydb.granular.create_directory` | `CREATE DIRECTORY` | Право создавать и удалять директории, в том числе существующие и вложенные
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Параметры батчевания записи в таблицу позволяют настроить баланс между задержкой появления записей в таблице и ресурсами, требуемыми для работы трансфера. Параметры батчевания влияют на обработку каждой партиции топика независимо. К изменению параметров батчевания нужно подходить с осторожностью, так как их изменение может как улучшить скорость обработки потока сообщений, так и ухудшить её, и даже привести к отказу в обслуживании, если параметры будут подобраны неверно. Например, запись в таблицу маленькими по размеру батчами может привести к перегрузке таблицы и деградации скорости работы с ней, а слишком большой размер батча — к тому, что на сервере закончится вся доступная память.
2+
* `BATCH_SIZE_BYTES` — размер батча в байтах. По умолчанию — 8 МБ.
3+
* `FLUSH_INTERVAL` — периодичность записи в таблицу. По умолчанию — 60 секунд. Запись в таблицу будет осуществлена, даже если батч не достиг размера, заданного в параметре `BATCH_SIZE_BYTES`.

0 commit comments

Comments
 (0)