Параллельный снапшот в ClickPipe для Postgres
В этом документе объясняется, как работает параллельная начальная загрузка (snapshot/initial load) в Postgres ClickPipe, и описываются параметры snapshot, с помощью которых её можно настраивать.
Обзор
Начальная загрузка — это первая фаза CDC ClickPipe, в ходе которой ClickPipe синхронизирует исторические данные таблиц из исходной базы данных в ClickHouse, прежде чем начать CDC. Часто разработчики выполняют это однопоточным способом — например, используя pg_dump или pg_restore, либо один поток для чтения из исходной базы данных и записи в ClickHouse. Однако Postgres ClickPipe может распараллелить этот процесс, что может значительно ускорить начальную загрузку.
Столбец CTID в Postgres
В Postgres каждая строка таблицы имеет уникальный идентификатор, называемый CTID. Это системный столбец, который по умолчанию скрыт, но может использоваться для уникальной идентификации строк в таблице. CTID представляет собой комбинацию номера блока и смещения внутри блока, что обеспечивает эффективный доступ к строкам.
Логическое разбиение на партиции
Postgres ClickPipe использует столбец CTID для логического разбиения исходных таблиц на партиции. Для получения партиций он сначала выполняет COUNT(*) по исходной таблице, а затем оконный запрос с разбиением для вычисления диапазонов CTID для каждой партиции. Это позволяет ClickPipe читать исходную таблицу параллельно, при этом каждая партиция обрабатывается отдельным потоком.
Рассмотрим следующие настройки:

Число строк снимка на партицию
Этот параметр определяет, сколько строк составляет партицию. ClickPipe будет считывать исходную таблицу фрагментами такого размера, и фрагменты будут обрабатываться параллельно в соответствии с заданным уровнем параллелизма начальной загрузки. Значение по умолчанию — 100 000 строк на партицию.
Параллелизм первоначальной загрузки
Этот параметр определяет, сколько партиций обрабатывается параллельно. Значение по умолчанию — 4, то есть ClickPipe будет читать 4 партиции исходной таблицы одновременно. Это значение можно увеличить, чтобы ускорить первоначальную загрузку, но рекомендуется выбирать его разумно в зависимости от характеристик исходного экземпляра, чтобы не перегрузить исходную базу данных. ClickPipe автоматически скорректирует количество партиций на основе размера исходной таблицы и количества строк в каждой партиции.
Количество таблиц в параллельном snapshot
Не совсем связано с параллельным snapshot, но этот параметр определяет, сколько таблиц обрабатывается параллельно во время начальной загрузки. Значение по умолчанию — 1. Обратите внимание, что это дополнительно к параллелизму по партициям, поэтому, если у вас есть 4 партиции и 2 таблицы, ClickPipe будет читать 8 партиций параллельно.
Мониторинг параллельного снимка в Postgres
Вы можете проанализировать pg_stat_activity, чтобы увидеть, как выполняется параллельный снимок. ClickPipe создаст несколько подключений к исходной базе данных, каждое из которых читает свою партицию исходной таблицы. Если вы видите запросы FETCH с разными диапазонами CTID, это означает, что ClickPipe читает исходные таблицы. Здесь вы также можете увидеть COUNT(*) и запрос разбиения на партиции.
Ограничения
- Параметры snapshot нельзя изменить после создания pipe. Если вы хотите их изменить, нужно создать новый ClickPipe.
- При добавлении таблиц в уже существующий ClickPipe вы не можете изменять параметры snapshot. ClickPipe будет использовать существующие параметры для новых таблиц.
- Столбец ключа партиции не должен содержать значений
NULL, так как они пропускаются логикой партиционирования.