跳到主要内容
跳到主要内容

PostgreSQL

有关 PostgreSQL 到 ClickHouse 的完整迁移指南,包括关于数据建模和等效概念的建议,请访问此处。以下内容描述了如何连接 ClickHouse 和 PostgreSQL。

连接 ClickHouse 到 PostgreSQL

本页涵盖了以下将 PostgreSQL 与 ClickHouse 集成的选项

  • 使用 ClickPipes,ClickHouse Cloud 的托管集成服务 - 目前处于 Private Preview 阶段。请在此处注册
  • 使用 PeerDB by ClickHouse,这是一款专门为 PostgreSQL 数据库复制到自托管 ClickHouse 和 ClickHouse Cloud 而设计的 CDC 工具
  • 使用 PostgreSQL 表引擎,用于从 PostgreSQL 表中读取数据
  • 使用实验性的 MaterializedPostgreSQL 数据库引擎,用于将 PostgreSQL 中的数据库与 ClickHouse 中的数据库同步

使用 ClickPipes(由 PeerDB 提供支持)

PeerDB 现在已在 ClickHouse Cloud 中原生可用 - 使用我们全新的 ClickPipe 连接器实现闪电般快速的 Postgres 到 ClickHouse CDC - 目前处于 Private Preview 阶段。请在此处注册

使用 PostgreSQL 表引擎

PostgreSQL 表引擎允许对存储在远程 PostgreSQL 服务器上的数据执行 SELECTINSERT 操作,从 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 文件中。使用 PostgreSQL 服务器的子网或 IP 地址更新地址行
# 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 中使用此功能,您可能需要允许 ClickHouse Cloud IP 地址访问您的 PostgreSQL 实例。查看 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');

所需的最小参数为

参数描述示例
主机:端口主机名或 IP 和端口postgres-host.domain.com:5432
数据库PostgreSQL 数据库名称db_in_psg
用户连接到 postgres 的用户名clickhouse_user
密码连接到 postgres 的密码ClickHouse_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)

此示例演示了使用 PostrgeSQL 表引擎在 PostgreSQL 和 ClickHouse 之间进行基本集成。查看 PostgreSQL 表引擎的文档页面 以了解更多功能,例如指定模式、仅返回列的子集以及连接到多个副本。另请查看 ClickHouse 和 PostgreSQL - 数据天堂的绝配 - 第 1 部分 博客。

使用 MaterializedPostgreSQL 数据库引擎

ClickHouse Cloud 中不支持
实验性功能。 了解更多。

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 至少需要 logical wal 级别和至少 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

*出于演示目的,此处使用了明文密码身份验证方法。根据 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';

最小选项

参数描述示例
主机:端口主机名或 IP 和端口postgres-host.domain.com:5432
数据库PostgreSQL 数据库名称db1
用户连接到 postgres 的用户名clickhouse_user
密码连接到 postgres 的密码ClickHouse_123
设置引擎的其他设置materialized_postgresql_tables_list = 'table1'
信息

有关 PostgreSQL 数据库引擎的完整指南,请参阅 https://clickhouse.ac.cn/docs/en/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 命令,但可以将引擎设置为检测更改并在发生结构更改时重新加载表。

信息

有关高级选项的更多可用功能,请参阅参考文档