Перейти к основному содержанию
Полное руководство по миграции из PostgreSQL в ClickHouse, включая рекомендации по моделированию данных и сопоставлению аналогичных понятий, доступно здесь. Ниже описано, как настроить подключение ClickHouse к PostgreSQL.
На этой странице рассматриваются следующие варианты интеграции PostgreSQL с ClickHouse:
  • использование движка таблицы PostgreSQL для чтения данных из таблицы PostgreSQL
  • использование экспериментального движка базы данных MaterializedPostgreSQL для синхронизации базы данных в PostgreSQL с базой данных в ClickHouse
Ознакомьтесь с нашим сервисом Managed Postgres. Благодаря NVMe-хранилищу, физически размещённому рядом с вычислительными ресурсами, он обеспечивает до 10 раз более высокую производительность для рабочих нагрузок, ограниченных производительностью дисковой подсистемы, по сравнению с решениями на базе сетевого хранилища, такого как EBS, а также позволяет реплицировать данные из Postgres в ClickHouse с помощью коннектора Postgres CDC в ClickPipes.

Использование движка таблицы PostgreSQL

Движок таблицы PostgreSQL позволяет выполнять операции SELECT и INSERT с данными, хранящимися на удалённом сервере PostgreSQL, из ClickHouse. В этой статье показаны основные способы интеграции с использованием одной таблицы.

1. Настройка PostgreSQL

  1. В postgresql.conf добавьте следующую запись, чтобы PostgreSQL слушал на сетевых интерфейсах:
  listen_addresses = '*'
  1. Создайте пользователя, через которого ClickHouse будет подключаться. Для наглядности в этом примере ему предоставляются полные права суперпользователя.
  CREATE ROLE clickhouse_user SUPERUSER LOGIN PASSWORD 'ClickHouse_123';
  1. Создайте новую базу данных в PostgreSQL:
  CREATE DATABASE db_in_psg;
  1. Создайте новую таблицу:
  CREATE TABLE table1 (
      id         integer primary key,
      column1    varchar(10)
  );
  1. Давайте добавим несколько строк для тестирования:
  INSERT INTO table1
    (id, column1)
  VALUES
    (1, 'abc'),
    (2, 'def');
  1. Чтобы настроить PostgreSQL так, чтобы новый пользователь мог подключаться к новой базе данных для репликации, добавьте следующую запись в файл pg_hba.conf. В строке адреса укажите подсеть или IP-адрес вашего сервера PostgreSQL:
  # TYPE  DATABASE        USER            ADDRESS                 METHOD
  host    db_in_psg             clickhouse_user 192.168.1.0/24          password
  1. Перезагрузите конфигурацию pg_hba.conf (скорректируйте эту команду в зависимости от используемой версии):
  /usr/pgsql-12/bin/pg_ctl reload
  1. Убедитесь, что новый clickhouse_user может войти:
  psql -U clickhouse_user -W -d db_in_psg -h <your_postgresql_host>
Если вы используете эту возможность в ClickHouse Cloud, вам может понадобиться разрешить доступ к вашему экземпляру PostgreSQL с IP-адресов ClickHouse Cloud. Подробности об исходящем трафике см. в ClickHouse Cloud Endpoints API.

2. Создайте таблицу в ClickHouse

  1. Войдите в clickhouse-client:
  clickhouse-client --user default --password ClickHouse123!
  1. Давайте создадим новую базу данных:
  CREATE DATABASE db_in_ch;
  1. Создайте таблицу, использующую движок PostgreSQL:
  CREATE TABLE db_in_ch.table1
  (
      id UInt64,
      column1 String
  )
  ENGINE = PostgreSQL('postgres-host.domain.com:5432', 'db_in_psg', 'table1', 'clickhouse_user', 'ClickHouse_123');
Минимально необходимые параметры:
parameterDescriptionexample
host:portимя хоста или IP-адрес и портpostgres-host.domain.com:5432
databaseимя базы данных PostgreSQLdb_in_psg
userимя пользователя для подключения к Postgresclickhouse_user
passwordпароль для подключения к PostgresClickHouse_123
Полный список параметров см. на странице документации движок таблицы PostgreSQL.

3 Проверьте интеграцию

  1. В ClickHouse просмотрите первые строки:
  SELECT * FROM db_in_ch.table1
Таблица ClickHouse должна автоматически заполниться двумя строками, которые уже были в таблице PostgreSQL:
  Query id: 34193d31-fe21-44ac-a182-36aaefbd78bf

  ┌─id─┬─column1─┐
  │  1 │ abc     │
  │  2 │ def     │
  └────┴─────────┘
  1. Вернувшись в PostgreSQL, добавьте в таблицу пару строк:
  INSERT INTO table1
    (id, column1)
  VALUES
    (3, 'ghi'),
    (4, 'jkl');
  1. Эти две новые строки должны появиться в вашей таблице ClickHouse:
  SELECT * FROM db_in_ch.table1
Ответ должен быть следующим:
  Query id: 86fa2c62-d320-4e47-b564-47ebf3d5d27b

  ┌─id─┬─column1─┐
  │  1 │ abc     │
  │  2 │ def     │
  │  3 │ ghi     │
  │  4 │ jkl     │
  └────┴─────────┘
  1. Давайте посмотрим, что произойдет, если добавить строки в таблицу ClickHouse:
  INSERT INTO db_in_ch.table1
    (id, column1)
  VALUES
    (5, 'mno'),
    (6, 'pqr');
  1. Добавленные в ClickHouse строки должны появиться в таблице PostgreSQL:
  db_in_psg=# SELECT * FROM table1;
  id | column1
  ----+---------
    1 | abc
    2 | def
    3 | ghi
    4 | jkl
    5 | mno
    6 | pqr
  (6 rows)
В этом примере была показана базовая интеграция между PostgreSQL и ClickHouse с использованием движка таблицы PostrgeSQL. Ознакомьтесь с документацией по движку таблицы PostgreSQL, чтобы узнать о дополнительных возможностях, таких как указание схем, выбор только части столбцов и подключение к нескольким репликам. Также рекомендуем статью в блоге ClickHouse and PostgreSQL - a match made in data heaven - part 1.

Использование движка базы данных MaterializedPostgreSQL

Движок базы данных PostgreSQL использует возможности репликации PostgreSQL для создания реплики базы данных со всеми схемами и таблицами либо с их частью. В этой статье показаны базовые методы интеграции с использованием одной базы данных, одной схемы и одной таблицы. В следующих процедурах используются PostgreSQL CLI (psql) и ClickHouse CLI (clickhouse-client). Сервер PostgreSQL установлен на Linux. Ниже приведены минимальные настройки для новой тестовой установки базы данных PostgreSQL.

1. В PostgreSQL

  1. В postgresql.conf задайте минимальные параметры прослушивания, уровень WAL для репликации и слоты репликации:
добавьте следующие записи:
listen_addresses = '*'
max_replication_slots = 10
wal_level = logical
*Для ClickHouse требуется как минимум уровень WAL logical и не менее 2 слотов репликации
  1. Используя учетную запись администратора, создайте пользователя для подключения из ClickHouse:
CREATE ROLE clickhouse_user SUPERUSER LOGIN PASSWORD 'ClickHouse_123';
*для демонстрации предоставлены полные права суперпользователя.
  1. создайте новую базу данных:
CREATE DATABASE db1;
  1. подключитесь к новой базе данных через psql:
\connect db1
  1. создайте новую таблицу:
CREATE TABLE table1 (
    id         integer primary key,
    column1    varchar(10)
);
  1. добавьте исходные строки:
INSERT INTO table1
(id, column1)
VALUES
(1, 'abc'),
(2, 'def');
  1. Настройте PostgreSQL так, чтобы разрешить подключения к новой базе данных с новым пользователем для репликации. Ниже приведена минимальная запись, которую нужно добавить в файл pg_hba.conf:
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    db1             clickhouse_user 192.168.1.0/24          password
*в демонстрационных целях здесь используется метод аутентификации по паролю в открытом виде. в строке address укажите либо подсеть, либо адрес сервера в соответствии с документацией PostgreSQL
  1. перезагрузите конфигурацию pg_hba.conf, например так (с поправкой на вашу версию):
/usr/pgsql-12/bin/pg_ctl reload
  1. Проверьте вход в систему с новым clickhouse_user:
 psql -U clickhouse_user -W -d db1 -h <your_postgresql_host>

2. В ClickHouse

  1. войдите в ClickHouse CLI
clickhouse-client --user default --password ClickHouse123!
  1. Включите экспериментальную возможность PostgreSQL для движка базы данных:
SET allow_experimental_database_materialized_postgresql=1
  1. Создайте новую базу данных для репликации и задайте исходную таблицу:
CREATE DATABASE db1_postgres
ENGINE = MaterializedPostgreSQL('postgres-host.domain.com:5432', 'db1', 'clickhouse_user', 'ClickHouse_123')
SETTINGS materialized_postgresql_tables_list = 'table1';
минимальные параметры:
параметрОписаниепример
host:portимя хоста или IP-адрес и портpostgres-host.domain.com:5432
databaseимя базы данных PostgreSQLdb1
userимя пользователя для подключения к Postgresclickhouse_user
passwordпароль для подключения к PostgresClickHouse_123
settingsдополнительные настройки движкаmaterialized_postgresql_tables_list = ‘table1’
Полное руководство по движку базы данных PostgreSQL см. здесь: https://clickhouse.com/docs/engines/database-engines/materialized-postgresql/#settings
  1. Убедитесь, что в исходной таблице есть данные:
ch_env_2 :) select * from db1_postgres.table1;

SELECT *
FROM db1_postgres.table1

Query id: df2381ac-4e30-4535-b22e-8be3894aaafc

┌─id─┬─column1─┐
1 │ abc     │
└────┴─────────┘
┌─id─┬─column1─┐
2 │ def     │
└────┴─────────┘

3. Проверьте простую репликацию

  1. В PostgreSQL добавьте новые строки:
INSERT INTO table1
(id, column1)
VALUES
(3, 'ghi'),
(4, 'jkl');
  1. В ClickHouse убедитесь, что новые строки отображаются:
ch_env_2 :) select * from db1_postgres.table1;

SELECT *
FROM db1_postgres.table1

Query id: b0729816-3917-44d3-8d1a-fed912fb59ce

┌─id─┬─column1─┐
1 │ abc     │
└────┴─────────┘
┌─id─┬─column1─┐
4 │ jkl     │
└────┴─────────┘
┌─id─┬─column1─┐
3 │ ghi     │
└────┴─────────┘
┌─id─┬─column1─┐
2 │ def     │
└────┴─────────┘

4. Итоги

В этом руководстве по интеграции мы рассмотрели простой пример репликации базы данных с одной таблицей, однако доступны и более продвинутые варианты, включая репликацию всей базы данных или добавление новых таблиц и схем в уже существующие репликации. Хотя команды DDL для этой репликации не поддерживаются, движок можно настроить так, чтобы он обнаруживал изменения и перезагружал таблицы при изменении их структуры.
Дополнительные возможности, доступные в расширенных сценариях, см. в справочной документации.
Последнее изменение 10 июня 2026 г.