データモデリングや対応する概念に関するアドバイスを含む、PostgreSQL から ClickHouse への完全な移行ガイドは、こちらを参照してください。以下では、ClickHouse と PostgreSQL を接続する方法について説明します。
このページでは、PostgreSQL を ClickHouse と統合するための次の方法について説明します。
- PostgreSQL のテーブルから読み取るために
PostgreSQLテーブルエンジンを使用する - PostgreSQL 内のデータベースを ClickHouse 内のデータベースと同期するために、実験的な
MaterializedPostgreSQLデータベースエンジンを使用する
PostgreSQL テーブルエンジン を使う
PostgreSQL テーブルエンジンを使用すると、ClickHouse からリモートの PostgreSQL サーバーに保存されているデータに対して SELECT および INSERT 操作を実行できます。
この記事では、1 つのテーブルを使った基本的なインテグレーション方法を紹介します。
PostgreSQL の設定
- PostgreSQL がネットワークインターフェイスで待ち受けるよう、
postgresql.confに次のエントリを追加します:
listen_addresses = '*'- ClickHouse から接続するためのユーザーを作成します。説明用として、この例ではスーパーユーザー権限をすべて付与します。
CREATE ROLE clickhouse_user SUPERUSER LOGIN PASSWORD 'ClickHouse_123';- PostgreSQL で新しいデータベースを作成します:
CREATE DATABASE db_in_psg;- 新しいテーブルを作成します:
CREATE TABLE table1 (
id integer primary key,
column1 varchar(10)
);- テスト用に数行追加しましょう:
INSERT INTO table1
(id, column1)
VALUES
(1, 'abc'),
(2, 'def');- レプリケーションのために、新しいユーザーによる新しいデータベースへの接続を許可するよう PostgreSQL を設定するには、次のエントリを
pg_hba.confファイルに追加します。アドレス行は、PostgreSQL サーバーのサブネットまたは IP アドレスに合わせて更新してください。
# TYPE DATABASE USER ADDRESS METHOD
host db_in_psg clickhouse_user 192.168.1.0/24 passwordpg_hba.confの設定を再読み込みします (このコマンドは、使用しているバージョンに応じて調整してください) :
/usr/pgsql-12/bin/pg_ctl reload- 新しい
clickhouse_userでログインできることを確認します:
psql -U clickhouse_user -W -d db_in_psg -h <your_postgresql_host>ClickHouse でテーブルを定義する
clickhouse-clientにログインします:
clickhouse-client --user default --password ClickHouse123!- 新しいデータベースを作成します:
CREATE DATABASE db_in_ch;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 |
インテグレーションをテストする
- ClickHouse で最初の行を表示します:
SELECT * FROM db_in_ch.table1ClickHouse テーブルには、PostgreSQL のテーブルにすでに存在していた2行が自動的に取り込まれます:
Query id: 34193d31-fe21-44ac-a182-36aaefbd78bf
┌─id─┬─column1─┐
│ 1 │ abc │
│ 2 │ def │
└────┴─────────┘- PostgreSQL に戻り、テーブルに数行を追加します:
INSERT INTO table1
(id, column1)
VALUES
(3, 'ghi'),
(4, 'jkl');- 新しい 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 │
└────┴─────────┘- ClickHouse テーブルに行を追加するとどうなるか見てみましょう:
INSERT INTO db_in_ch.table1
(id, column1)
VALUES
(5, 'mno'),
(6, 'pqr');- 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 データベースエンジンを使用する
PostgreSQL データベースエンジンは、PostgreSQL のレプリケーション機能を使用して、データベース全体、またはその一部のスキーマやテーブルを含むデータベースのレプリカを作成します。 この記事では、1 つのデータベース、1 つのスキーマ、1 つのテーブルを使った基本的なインテグレーション方法を説明します。
以下の手順では、PostgreSQL CLI (psql) と ClickHouse CLI (clickhouse-client) を使用します。PostgreSQL サーバーは Linux にインストールされています。以下は、PostgreSQL データベースが新規のテストインストールである場合の最小構成です。
PostgreSQL で
postgresql.confで、最小の listen レベル、レプリケーション用の WAL レベル、およびレプリケーションスロットを設定します。
次のエントリを追加します。
listen_addresses = '*'
max_replication_slots = 10
wal_level = logical*ClickHouse には、最低でも logical の WAL レベルと、2 つ以上のレプリケーションスロットが必要です
- 管理者アカウントを使用して、ClickHouse から接続するためのユーザーを作成します:
CREATE ROLE clickhouse_user SUPERUSER LOGIN PASSWORD 'ClickHouse_123';*説明のため、完全なスーパーユーザー権限を付与しています。
- 新しいデータベースを作成します:
CREATE DATABASE db1;psqlで新しいデータベースに接続します:
\connect db1- 新しいテーブルを作成します:
CREATE TABLE table1 (
id integer primary key,
column1 varchar(10)
);- 初期データを追加します:
INSERT INTO table1
(id, column1)
VALUES
(1, 'abc'),
(2, 'def');- レプリケーション用の新しいユーザーによる新しいデータベースへの接続を許可するように、PostgreSQL を設定します。以下は、
pg_hba.confファイルに追加する最小限のエントリです。
# TYPE DATABASE USER ADDRESS METHOD
host db1 clickhouse_user 192.168.1.0/24 password*説明用の例として、ここでは平文パスワードによる認証方式を使用しています。PostgreSQL のドキュメントに従って、address 行はサブネットまたはサーバーのアドレスに更新してください
- 次のように
pg_hba.confの設定を再読み込みします (お使いのバージョンに応じて調整してください) :
/usr/pgsql-12/bin/pg_ctl reload- 新しい
clickhouse_userでログインを確認します:
psql -U clickhouse_user -W -d db1 -h <your_postgresql_host>ClickHouse で
- ClickHouse CLI にログインします
clickhouse-client --user default --password ClickHouse123!- データベースエンジン向けの PostgreSQL 実験的機能を有効にします:
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';最小オプション:
| 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' |
- 初期テーブルにデータがあることを確認します:
ch_env_2 :) select * from db1_postgres.table1;
SELECT *
FROM db1_postgres.table1Query id: df2381ac-4e30-4535-b22e-8be3894aaafc
┌─id─┬─column1─┐
│ 1 │ abc │
└────┴─────────┘
┌─id─┬─column1─┐
│ 2 │ def │
└────┴─────────┘基本的なレプリケーションをテストする
- PostgreSQL で、新しい行を追加します:
INSERT INTO table1
(id, column1)
VALUES
(3, 'ghi'),
(4, 'jkl');- ClickHouse で、新しい行が表示されていることを確認します:
ch_env_2 :) select * from db1_postgres.table1;
SELECT *
FROM db1_postgres.table1Query id: b0729816-3917-44d3-8d1a-fed912fb59ce
┌─id─┬─column1─┐
│ 1 │ abc │
└────┴─────────┘
┌─id─┬─column1─┐
│ 4 │ jkl │
└────┴─────────┘
┌─id─┬─column1─┐
│ 3 │ ghi │
└────┴─────────┘
┌─id─┬─column1─┐
│ 2 │ def │
└────┴─────────┘まとめ
このインテグレーションガイドでは、テーブルを含むデータベースをレプリケートする簡単な例を紹介しましたが、データベース全体をレプリケートしたり、既存のレプリケーションに新しいテーブルやスキーマを追加したりする、より高度なオプションもあります。このレプリケーションでは DDL コマンドはサポートされていませんが、構造変更を検出してテーブルを再読み込みするようにエンジンを設定できます。