Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Подключение ClickHouse к PostgreSQL

На этой странице рассматриваются следующие варианты интеграции PostgreSQL с ClickHouse:

  • использование движка таблицы PostgreSQL для чтения данных из таблицы PostgreSQL
  • использование экспериментального движка базы данных MaterializedPostgreSQL для синхронизации базы данных PostgreSQL с базой данных в ClickHouse

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

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

Настройка 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

  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');

Минимально необходимые параметры:

parameter Description example
host:port имя хоста или IP-адрес и порт postgres-host.domain.com:5432
database имя базы данных PostgreSQL db_in_psg
user имя пользователя для подключения к Postgres clickhouse_user
password пароль для подключения к Postgres ClickHouse_123

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

  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

Не поддерживается в ClickHouse Cloud
Экспериментальная возможность

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

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

В 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>

В 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 имя базы данных PostgreSQL db1
user имя пользователя для подключения к PostgreSQL clickhouse_user
password пароль для подключения к PostgreSQL ClickHouse_123
settings дополнительные настройки для движка materialized_postgresql_tables_list = 'table1'
  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     │
└────┴─────────┘

Проверка базовой репликации

  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     │
└────┴─────────┘

Краткое содержание

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

Navigation