Перейти к основному содержанию
Перейти к основному содержанию

Параллельный снимок в Postgres ClickPipe

В этом документе объясняется, как работает параллельное создание снимка и начальная загрузка в Postgres ClickPipe, а также рассматриваются параметры снимка, которые можно использовать для управления этим процессом.

Обзор

Первоначальная загрузка — это первая фаза CDC ClickPipe, в ходе которой ClickPipe синхронизирует исторические данные таблиц из исходной базы данных в ClickHouse, после чего начинает CDC. Во многих случаях разработчики делают это однопоточно — например, используя pg_dump или pg_restore, либо один поток для чтения из исходной базы данных и записи в ClickHouse. Однако Postgres ClickPipe может распараллелить этот процесс, что может значительно ускорить первоначальную загрузку.

Столбец CTID в Postgres

В Postgres каждая строка в таблице имеет уникальный идентификатор, называемый CTID. Это системный столбец, который по умолчанию не виден пользователям, но его можно использовать для уникальной идентификации строк в таблице. CTID — это комбинация номера блока и смещения внутри блока, что позволяет эффективно получать доступ к строкам.

Логическое разбиение на разделы

Postgres ClickPipe использует столбец CTID для логического разбиения исходных таблиц на разделы. Разделы формируются путём выполнения COUNT(*) по исходной таблице, а затем запроса с оконной функцией для разбиения, чтобы получить диапазоны CTID для каждого раздела. Это позволяет ClickPipe читать исходную таблицу параллельно, при этом каждый раздел обрабатывается отдельным потоком.

Рассмотрим следующие настройки:

Параметры snapshot

Количество строк snapshot на раздел

Этот параметр определяет, сколько строк составляет один раздел. ClickPipe будет читать исходную таблицу блоками такого размера, а блоки обрабатываются параллельно в соответствии с заданным уровнем параллелизма первоначальной загрузки. Значение по умолчанию — 100 000 строк на раздел.

Параллелизм первоначальной загрузки

Этот параметр определяет, сколько разделов обрабатывается параллельно. Значение по умолчанию — 4, что означает, что ClickPipe будет читать 4 раздела исходной таблицы параллельно. Это значение можно увеличить, чтобы ускорить первоначальную загрузку, но рекомендуется держать его в разумных пределах в зависимости от характеристик экземпляра вашей исходной базы данных, чтобы не перегрузить её. ClickPipe автоматически скорректирует количество разделов в зависимости от размера исходной таблицы и числа строк на раздел.

Количество таблиц snapshot, обрабатываемых параллельно

Не совсем относится к параллельному snapshot, но этот параметр определяет, сколько таблиц обрабатывается параллельно во время первоначальной загрузки. Значение по умолчанию — 1. Обратите внимание, что это — надстройка над параллелизмом разделов, поэтому если у вас 4 раздела и 2 таблицы, ClickPipe будет читать 8 разделов параллельно.

Мониторинг параллельного snapshot в Postgres

Вы можете проанализировать pg_stat_activity, чтобы увидеть работу параллельного snapshot. ClickPipe создаст несколько подключений к исходной базе данных, каждое из которых читает свой раздел исходной таблицы. Если вы видите запросы FETCH с разными диапазонами CTID, это означает, что ClickPipe читает исходные таблицы. Здесь же вы можете увидеть запрос COUNT(*) и запрос с разбиением на разделы.

Ограничения

  • Параметры snapshot нельзя изменять после создания pipe. Если вы хотите их изменить, вам нужно создать новый ClickPipe.
  • При добавлении таблиц в существующий ClickPipe вы не можете изменять параметры snapshot. ClickPipe будет использовать существующие параметры для новых таблиц.
  • Столбец ключа разбиения не должен содержать NULL, так как такие значения пропускаются логикой разбиения.