ClickHouse Cloud ユーザーには、PostgreSQL から ClickHouse へのレプリケーションに ClickPipes を使用することを推奨します。これは、PostgreSQL 向けの高性能な CDC (変更データキャプチャ) をネイティブでサポートしています。
MaterializedPostgreSQL エンジンのデータベースが PostgreSQL データベースのスナップショットを作成し、必要なテーブルを読み込みます。必要なテーブルには、指定したデータベース内の任意のスキーマにある任意のテーブルの部分集合を含めることができます。スナップショットの作成とあわせて、データベースエンジンは LSN を取得し、テーブルの初期ダンプが完了すると WAL から更新の取り込みを開始します。データベースの作成後に PostgreSQL データベースへ新たに追加されたテーブルは、自動的にはレプリケーションに追加されません。これらは ATTACH TABLE db.table クエリで手動で追加する必要があります。
レプリケーションは PostgreSQL Logical Replication Protocol を用いて実装されています。このプロトコルでは DDL はレプリケートできませんが、レプリケーションを破壊する変更 (カラム型の変更、カラムの追加・削除) が発生したかどうかは把握できます。こうした変更が検出されると、該当するテーブルは更新を受信しなくなります。この場合は、ATTACH / DETACH PERMANENTLY クエリを使用してテーブル全体を再読み込みする必要があります。DDL がレプリケーションを破壊しない場合 (たとえばカラム名の変更など) は、テーブルは引き続き更新を受信します (挿入は位置ベースで行われます) 。
このデータベースエンジンは Experimental です。使用するには、設定ファイルで
allow_experimental_database_materialized_postgresql を 1 に設定するか、SET コマンドを使用します。データベースの作成
host:port— PostgreSQL サーバーのエンドポイント。database— PostgreSQL データベースの名前。user— PostgreSQL ユーザー。password— ユーザーのパスワード。
使用例
レプリケーションに新しいテーブルを動的に追加する
MaterializedPostgreSQL データベースを作成しても、対応する PostgreSQL データベース内の新しいテーブルは自動では検出されません。こうしたテーブルは手動で追加できます。
テーブルをレプリケーション対象から動的に外す
PostgreSQL スキーマ
MaterializedPostgreSQLデータベースエンジン 1 つにつき 1 つのスキーマ。設定materialized_postgresql_schemaを使用する必要があります。 テーブルには、テーブル名だけでアクセスします:
- 1 つの
MaterializedPostgreSQLデータベースエンジンに対して、指定したテーブルのセットを含むスキーマを任意の数だけ指定できます。設定materialized_postgresql_tables_listを使用する必要があります。各テーブルは、対応するスキーマとあわせて記述します。 テーブルには、スキーマ名とテーブル名を併せて使用してアクセスします:
materialized_postgresql_tables_list 内のすべてのテーブルは、スキーマ名を付けて記述する必要があります。
materialized_postgresql_tables_list_with_schema = 1 が必要です。
警告: この場合、テーブル名にドットは使用できません。
- 1 つの
MaterializedPostgreSQLデータベースエンジンに対して、完全なテーブルセットを含む任意の数のスキーマ。設定materialized_postgresql_schema_listを使用する必要があります。
要件
-
PostgreSQL の設定ファイルで、wal_level の値を
logicalに設定し、max_replication_slotsパラメータの値を少なくとも2にする必要があります。 - 各レプリケートテーブルには、以下のいずれかの replica identity が必要です。
- 主キー (デフォルト)
- 索引
TOAST の値のレプリケーションはサポートされていません。代わりに、データ型のデフォルト値が使用されます。
設定
materialized_postgresql_tables_list
materialized_postgresql_schema
materialized_postgresql_schema_list
materialized_postgresql_max_block_size
- 正の整数。
65536.
materialized_postgresql_replication_slot
materialized_postgresql_snapshot と一緒に使用する必要があります。
materialized_postgresql_snapshot
materialized_postgresql_replication_slotとあわせて使用する必要があります。
materialized_postgresql_tables_list 設定は変更できません。この設定内のテーブル一覧を更新するには、ATTACH TABLE クエリを使用します。
materialized_postgresql_use_unique_replication_consumer_identifier
0 です。
1 に設定すると、同じ PostgreSQL テーブルを参照する複数の MaterializedPostgreSQL テーブルを設定できます。
注記
論理レプリケーションスロットのフェイルオーバー
materialized_postgresql_replication_slot 設定で渡す必要があり、そのスロットは EXPORT SNAPSHOT オプション付きで export されている必要があります。スナップショット識別子は materialized_postgresql_snapshot 設定で渡す必要があります。
これは、実際に必要な場合にのみ使用してください。明確な必要性がない場合や、理由を十分に理解していない場合は、テーブルエンジン にレプリケーションスロットの作成と管理を任せるほうが適切です。
例 (@bchrobot 提供)
-
PostgreSQL でレプリケーションスロットを設定します。
-
レプリケーションスロットの準備ができるまで待ってから、transaction を開始し、transaction スナップショット識別子を export します。
-
ClickHouse でデータベースを作成します。
-
ClickHouse DB へのレプリケーションを確認したら、PostgreSQL の transaction を終了します。フェイルオーバー後もレプリケーションが継続することを確認してください。
必要な権限
- CREATE PUBLICATION — 作成権限。
- CREATE_REPLICATION_SLOT — レプリケーション権限。
- pg_drop_replication_slot — レプリケーション権限、またはスーパーユーザー権限。
-
DROP PUBLICATION — publication の所有者 (MaterializedPostgreSQL エンジン自体の
username) 。
2 と 3 のコマンドを実行せず、これらの権限を持たずに済ませることも可能です。設定 materialized_postgresql_replication_slot と materialized_postgresql_snapshot を使用してください。ただし、十分に注意してください。
テーブルへのアクセス:
- pg_publication
- pg_replication_slots
- pg_publication_tables