Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

PostgreSQL

データモデリングや対応する概念に関するアドバイスを含む、PostgreSQL から ClickHouse への完全な移行ガイドは、こちらを参照してください。以下では、ClickHouse と PostgreSQL を接続する方法について説明します。

このページでは、PostgreSQL を ClickHouse と統合するための次の方法について説明します。

  • PostgreSQL のテーブルから読み取るために PostgreSQL テーブルエンジンを使用する
  • PostgreSQL 内のデータベースを ClickHouse 内のデータベースと同期するために、実験的な MaterializedPostgreSQL データベースエンジンを使用する

PostgreSQL テーブルエンジン を使う

PostgreSQL テーブルエンジンを使用すると、ClickHouse からリモートの PostgreSQL サーバーに保存されているデータに対して SELECT および INSERT 操作を実行できます。 この記事では、1 つのテーブルを使った基本的なインテグレーション方法を紹介します。

PostgreSQL の設定

  1. PostgreSQL がネットワークインターフェイスで待ち受けるよう、postgresql.conf に次のエントリを追加します:
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 でテーブルを定義する

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

必要な最小限のパラメータは次のとおりです:

パラメータ 説明
host:port ホスト名または IP アドレスとポート postgres-host.domain.com:5432
database PostgreSQL データベース名 db_in_psg
user PostgreSQL への接続に使用するユーザー名 clickhouse_user
password PostgreSQL への接続に使用するパスワード ClickHouse_123

インテグレーションをテストする

  1. ClickHouse で最初の行を表示します:
SELECT * FROM db_in_ch.table1

ClickHouse テーブルには、PostgreSQL のテーブルにすでに存在していた2行が自動的に取り込まれます:

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. 新しい 2 行が 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 and PostgreSQL - a match made in data heaven - part 1 もご覧ください。

MaterializedPostgreSQL データベースエンジンを使用する

ClickHouse Cloud ではサポートされていません
実験的な機能

PostgreSQL データベースエンジンは、PostgreSQL のレプリケーション機能を使用して、データベース全体、またはその一部のスキーマやテーブルを含むデータベースのレプリカを作成します。 この記事では、1 つのデータベース、1 つのスキーマ、1 つのテーブルを使った基本的なインテグレーション方法を説明します。

以下の手順では、PostgreSQL CLI (psql) と ClickHouse CLI (clickhouse-client) を使用します。PostgreSQL サーバーは Linux にインストールされています。以下は、PostgreSQL データベースが新規のテストインストールである場合の最小構成です。

PostgreSQL で

  1. postgresql.conf で、最小の listen レベル、レプリケーション用の 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 のドキュメントに従って、address 行はサブネットまたはサーバーのアドレスに更新してください

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

最小オプション:

parameter 説明
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