Параллельный снимок в 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 на раздел
Этот параметр определяет, сколько строк составляет один раздел. 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, так как такие значения пропускаются логикой разбиения.