在實際數據平台架構中,ClickHouse 通常不是唯一的資料庫,而是與其他資料源(如 MySQL、PostgreSQL、S3、Kafka 等)整合,扮演 高效查詢與分析層 的角色。
在許多應用場景中,PostgreSQL 作為 OLTP 系統 儲存業務資料(如交易、用戶、訂單),但在報表分析時遇到以下挑戰:
ClickHouse 的 PostgreSQL Table Engine 可直接連線 PostgreSQL,並以類似「外部表」的方式查詢資料,適合快速整合多方資料源。
允許網路連線
# postgresql.conf
listen_addresses = '*'
建立使用者
CREATE ROLE clickhouse_user SUPERUSER LOGIN PASSWORD 'ClickHouse_123';
建立資料庫與表
CREATE DATABASE db_in_psg;
CREATE TABLE table1 (
id integer primary key,
column1 varchar(10)
);
INSERT INTO table1 VALUES (1, 'abc'), (2, 'def');
設定連線權限
# pg_hba.conf
host db_in_psg clickhouse_user 192.168.1.0/24 password
重新載入設定
pg_ctl reload
建立資料庫
CREATE DATABASE db_in_ch;
建立連線表
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'
);
測試查詢
SELECT * FROM db_in_ch.table1;
雙向測試
開啟複製功能
# postgresql.conf
listen_addresses = '*'
max_replication_slots = 10
wal_level = logical
建立使用者與資料庫
CREATE ROLE clickhouse_user SUPERUSER LOGIN PASSWORD 'ClickHouse_123';
CREATE DATABASE db1;
建立表與資料
\connect db1
CREATE TABLE table1 (
id integer primary key,
column1 varchar(10)
);
INSERT INTO table1 VALUES (1, 'abc'), (2, 'def');
設定權限
# pg_hba.conf
host db1 clickhouse_user 192.168.1.0/24 password
啟用實驗功能
SET allow_experimental_database_materialized_postgresql=1;
建立同步資料庫
CREATE DATABASE db1_postgres
ENGINE = MaterializedPostgreSQL(
'postgres-host.domain.com:5432',
'db1',
'clickhouse_user',
'ClickHouse_123'
)
SETTINGS materialized_postgresql_tables_list = 'table1';
驗證資料
SELECT * FROM db1_postgres.table1;
測試同步
在 PostgreSQL 新增資料,ClickHouse 會自動更新。
特性 | PostgreSQL Table Engine | MaterializedPostgreSQL |
---|---|---|
存取方式 | 即時查詢與寫入 | 持續複製(只讀) |
適合資料量 | 小批量、查詢即時 | 大批量、長期分析 |
延遲 | 查詢即時(依 PostgreSQL 響應) | 低延遲(CDC 同步) |
使用限制 | 受限於 PostgreSQL 性能 | 實驗功能、不可寫入 |
clickhouse-copier
或 ETL 工具將歷史資料導入 ClickHouse)透過 PostgreSQL Table Engine,ClickHouse 可以直接訪問 PostgreSQL 的即時資料,實現跨系統分析,特別適合混合查詢與即時 BI 報表需求。
在實務中,建議: