---
metadata:
  - name: generator
    content: Diplodoc Platform v5.50.4
alternate:
  - https://ydb.tech/docs/en/concepts/async-replication.md
  - https://ydb.tech/docs/ru/concepts/async-replication.md
sourcePath: ru/core/concepts/async-replication.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ydb.tech/docs/ru/llms.txt

# Асинхронная репликация

Асинхронная репликация позволяет синхронизировать данные между [базами данных](https://ydb.tech/docs/ru/concepts/glossary.md#database) YDB почти в реальном времени. Также она может быть использована для миграции данных между базами данных с минимальным простоем работающих с ними приложений. Базы данных могут располагаться как в одном [кластере](https://ydb.tech/docs/ru/concepts/glossary.md#cluster) YDB, так и на разных.

## Принцип работы {#how-it-works}

Асинхронная репликация реализована поверх [Change Data Capture](https://ydb.tech/docs/ru/concepts/cdc.md) и оперирует логическими данными. Схема процесса репликации:

```mermaid
sequenceDiagram
  participant dst as Приёмник
  participant src as Источник

  dst-->src: Инициализация
  dst->>dst: Создание экземпляра асинхронной репликации
  dst->>src: Создание потоков изменений
  dst->>dst: Создание объектов-реплик

  dst-->src: Репликация первоначальных данных
  loop
    dst->>src: Запрос на получение данных
    src->>dst: Данные
  end

  dst-->src: Репликация изменений
  loop
    dst->>src: Запрос на получение данных
    src->>dst: Данные
  end
```

Как следует из схемы выше, в асинхронной репликации участвуют две базы:

1. **Источник** — база данных с исходными [объектами](https://ydb.tech/docs/ru/concepts/glossary.md#replicated-object).
2. **Приёмник** — база данных, в которой будут созданы [экземпляр асинхронной репликации](https://ydb.tech/docs/ru/concepts/glossary.md#async-replication-instance) и [объекты-реплики](https://ydb.tech/docs/ru/concepts/glossary.md#replica-object).

Процесс асинхронной репликации состоит из следующих стадий:

* [Инициализация](#init).
* [Репликация первоначальных данных](#initial-scan).
* [Репликация изменений](#replication-of-changes).

### Инициализация {#init}

Инициализация асинхронной репликации состоит из:

* Создания экземпляра асинхронной репликации в приемнике с помощью выражения [CREATE ASYNC REPLICATION](https://ydb.tech/docs/ru/yql/reference/syntax/create-async-replication.md).
* Установки соединения с источником. Для соединения с источником приемник использует [параметры подключения](https://ydb.tech/docs/ru/yql/reference/syntax/create-async-replication.md#params), указанные при создании экземпляра асинхронной репликации.

{% note info %}

Пользователь, от имени которого производится подключение к источнику, должен обладать следующими [правами](https://ydb.tech/docs/ru/security/short-access-control-notation.md#access-rights):

* просмотр объектов схемы и содержимого каталогов;
* создание, изменение, удаление и чтение потоков изменений.

{% endnote %}

* Для заданного набора исходных объектов автоматически создаются:
  * [потоки изменений](https://ydb.tech/docs/ru/concepts/glossary.md#changefeed) (в источнике);
  * [объекты-реплики](https://ydb.tech/docs/ru/concepts/glossary.md#replica-object) (в приемнике).

{% note info %}

Объекты-реплики создаются от имени пользователя, создавшего экземпляр асинхронной репликации.

{% endnote %}

### Репликация первоначальных данных {#initial-scan}

Первоначальные данные исходных таблиц отгружаются в потоки изменений с использованием [первоначального сканирования](https://ydb.tech/docs/ru/concepts/cdc.md#initial-scan). В это время в приемнике запускаются [читатели](https://ydb.tech/docs/ru/concepts/datamodel/topic.md#consumer), которые записывают прочитанные данные в объекты-реплики.

Прогресс репликации первоначальных данных можно получить из [описания](https://ydb.tech/docs/ru/reference/ydb-cli/commands/scheme-describe.md) экземпляра асинхронной репликации.

### Репликация изменений {#replication-of-changes}

После завершения первоначального сканирования читатели получают только данные об изменениях и записывают их в объекты-реплики.

Для каждого изменения известно *время его возникновения* ($created\_at$). В то же время читатели отслеживают *время получения* изменения ($received\_at$). Таким образом, *отставание репликации* может быть вычислено по формуле:

$$
replication\_lag = received\_at - created\_at
$$

Отставание репликации также можно получить из [описания](https://ydb.tech/docs/ru/reference/ydb-cli/commands/scheme-describe.md) экземпляра асинхронной репликации.

## Ограничения {#restrictions}

* Набор исходных объектов задается при создании экземпляра асинхронной репликации и не может быть изменен.
* В качестве исходных объектов поддерживаются:

  * [строковые таблицы](https://ydb.tech/docs/ru/concepts/datamodel/table.md#row-oriented-tables);
  * [директории](https://ydb.tech/docs/ru/concepts/datamodel/dir.md) — будут реплицироваться все строковые таблицы, содержащиеся в них (включая содержимое поддиректорий) на момент создания экземпляра асинхронной репликации.

* Во время работы асинхронной репликации в исходных таблицах блокируется возможность [изменения состава столбцов](https://ydb.tech/docs/ru/yql/reference/syntax/alter_table/columns.md).
* Во время работы асинхронной репликации объекты-реплики доступны только для чтения.

## Обработка ошибок в процессе асинхронной репликации {#error-handling}

В процессе асинхронной репликации возможно возникновение разных классов ошибок:

* **Временные сбои**. Например, транспортные ошибки, перегрузка системы и т.д. Запросы будут повторяться до успешного выполнения.
* **Критичные ошибки**. Например, ошибки прав доступа, ошибки схемы и т.д. Процесс репликации будет остановлен, и в [описании](https://ydb.tech/docs/ru/reference/ydb-cli/commands/scheme-describe.md) экземпляра репликации будет указан текст ошибки.

{% note warning %}

На данный момент остановленный из-за критичной ошибки процесс асинхронной репликации не может быть перезапущен. Его нужно [удалить](https://ydb.tech/docs/ru/yql/reference/syntax/drop-async-replication.md) и [создать](https://ydb.tech/docs/ru/yql/reference/syntax/create-async-replication.md) заново.

{% endnote %}

Подробнее про классы ошибок и политики их обработки см. в разделе [Обработка ошибок](https://ydb.tech/docs/ru/reference/ydb-sdk/error_handling.md).

## Уровни согласованности реплицируемых данных {#consistency-levels}

### Согласованность данных уровня строк {#consistency-level-row}

Механизм Change Data Capture, используемый для асинхронной репликации, [гарантирует](https://ydb.tech/docs/ru/concepts/cdc.md#guarantees), что изменения по одному и тому же [первичному ключу](https://ydb.tech/docs/ru/concepts/datamodel/table.md) доставляются в том же порядке, в котором они происходили в источнике. Таким образом обеспечивается согласованность данных уровня строк.

Данные, записанные в объекты-реплики в этом режиме, сразу становятся доступными для чтения.

### Глобальная согласованность данных {#consistency-level-global}

При выполнении [транзакций](https://ydb.tech/docs/ru/concepts/transactions.md) в источнике могут быть атомарно изменены несколько строк таблицы или, более того, строки в разных партициях таблиц(ы). Глобальная согласованность данных в приемнике подразумевает сохранение свойства атомарности — изменения "проявляются" (становятся доступными для чтения) согласованно.

Для обеспечения глобальной согласованности данных необходимо создавать потоки изменений с включенными [барьерами](https://ydb.tech/docs/ru/concepts/cdc.md#barriers). Между барьерами данные буферизируются непосредственно на партициях объектов-реплик. При получении очередной порции барьеров от всех топиков записанные изменения фиксируются и становятся доступными для чтения. При этом данные в приемнике оказываются согласованными на момент времени, указанном в барьере. Если считать, что в источнике барьеры создаются каждые 10 секунд (значение по умолчанию), то в нормальном режиме приемник коммитит и публикует набор изменений от источника также каждые 10 секунд.

#### Периодичность фиксации изменений {#commit-interval}

По умолчанию изменения фиксируются (коммитятся) не чаще, чем раз в 10 секунд. Периодичность фиксации изменений можно переопределить, указав опцию [COMMIT_INTERVAL](https://ydb.tech/docs/ru/yql/reference/syntax/create-async-replication.md#params) при создании экземпляра асинхронной репликации.

{% note info %}

Периодичность фиксации изменений напрямую влияет на периодичность выгрузки барьеров в потоки изменений — значения параметров синхронизированы. Таким образом, обычно, изменения фиксируются с той же частотой, с которой в потоках изменений появляются барьеры. Однако, в некоторых случаях, например, в случае неравномерной нагрузки между таблицами, барьеры в потоках изменений могут появляться с существенной разницей во времени, что приведёт к увеличению периодичности фиксации изменений. Отставание можно получить из [описания](https://ydb.tech/docs/ru/reference/ydb-cli/commands/scheme-describe.md) экземпляра асинхронной репликации.

{% endnote %}

## Завершение асинхронной репликации {#done}

Завершение асинхронной репликации может быть конечной целью процедуры миграции данных из одной базы данных в другую. В таком случае клиент останавливает пишущую нагрузку в источнике, дожидается нулевого отставания репликации и завершает её. При завершении объекты-реплики становятся доступными как для чтения, так и для записи. После этого можно переключить нагрузку с источника на приемник и завершить процедуру миграции.

{% note info %}

Завершённый процесс асинхронной репликации не может быть возобновлён.

{% endnote %}

{% note warning %}

На данный момент поддерживается только **принудительное** завершение асинхронной репликации, при котором не производится никаких дополнительных проверок (на согласованность данных, на отставание и т.д.).

{% endnote %}

Для завершения асинхронной репликации используйте выражение [ALTER ASYNC REPLICATION](https://ydb.tech/docs/ru/yql/reference/syntax/alter-async-replication.md).

## Удаление асинхронной репликации {#drop}

При удалении асинхронной репликации:

* В исходных таблицах удаляются потоки изменений.
* В исходных таблицах разблокируется возможность изменения состава столбцов.
* Опционально могут быть удалены все объекты-реплики.
* Удаляется экземпляр асинхронной репликации.

{% note warning %}

Если удалить асинхронную репликацию без предварительного [завершения](#done) и не удалять объекты-реплики, то они останутся доступными только для чтения.

{% endnote %}

Для удаления асинхронной репликации используйте выражение [DROP ASYNC REPLICATION](https://ydb.tech/docs/ru/yql/reference/syntax/drop-async-replication.md).
