Как происходит репликация данных?
Логическое декодирование PostgreSQL
ReplacingMergeTree
_peerdb_version), а удаления — как вставки более новой версии строки, в которой _peerdb_is_deleted имеет значение true. Движок ReplacingMergeTree выполняет дедупликацию и слияние данных в фоновом режиме, сохраняя последнюю версию строки для заданного первичного ключа (id), что позволяет эффективно обрабатывать UPDATE и DELETE как версионированные вставки.
Ниже приведен пример оператора CREATE TABLE, который ClickPipes выполняет для создания таблицы в ClickHouse.
Наглядный пример
users между PostgreSQL и ClickHouse с помощью ClickPipes.
Шаг 1 показывает исходный снимок 2 строк в PostgreSQL и то, как ClickPipes выполняет начальную загрузку этих 2 строк в ClickHouse. Как видно, обе строки копируются в ClickHouse без изменений.
Шаг 2 показывает три операции с таблицей users: вставку новой строки, обновление существующей строки и удаление другой строки.
Шаг 3 показывает, как ClickPipes реплицирует операции INSERT, UPDATE и DELETE в ClickHouse в виде версионированных вставок. UPDATE отображается как новая версия строки с ID 2, а DELETE — как новая версия строки с ID 1, помеченная значением true с помощью _is_deleted. Из-за этого в ClickHouse становится на три строки больше, чем в PostgreSQL.
В результате выполнение простого запроса, например SELECT count(*) FROM users;, может давать разные результаты в ClickHouse и PostgreSQL. Согласно документации ClickHouse о слияниях, устаревшие версии строк со временем отбрасываются в процессе слияния. Однако момент такого слияния непредсказуем, а значит, запросы в ClickHouse до этого могут возвращать несогласованные результаты.
Как обеспечить одинаковые результаты запросов и в ClickHouse, и в PostgreSQL?
Дедупликация с помощью ключевого слова FINAL
- Простой запрос count: Подсчёт количества постов.
- Простая агрегация с JOIN: Топ-10 пользователей с наибольшим числом просмотров.
Настройка FINAL
ROW policy
_peerdb_is_deleted = 0 — использовать ROW policy. Ниже приведён пример создания ROW POLICY, которая исключает удалённые строки из всех запросов к таблице votes.
Политики доступа на уровне строк применяются к списку пользователей и ролей. В этом примере они применяются ко всем пользователям и ролям. При необходимости их можно настроить так, чтобы они применялись только к определённым пользователям или ролям.
Запросы как в Postgres
Представления
Refreshable materialized view
deduplicated_posts как обычно.