ロジカルレプリケーションを使用して ClickHouse Managed Postgres へ移行する
このガイドでは、Postgres ネイティブのロジカルレプリケーションを使用して、PostgreSQL データベースを ClickHouse Managed Postgres に移行する手順を、順を追って説明します。
前提条件
- ソースとなる PostgreSQL データベースへのアクセス権があること。
- ローカルマシンに
psql、pg_dump、pg_restoreがインストールされていること。これはターゲットデータベースに空のテーブルを作成するために使用します。これらのツールは通常、PostgreSQL のインストールに含まれています。含まれていない場合は、PostgreSQL 公式サイト からダウンロードできます。 - ソースデータベースが ClickHouse Managed Postgres から到達可能であること。必要なファイアウォールルールやセキュリティグループの設定が、この接続を許可していることを確認してください。Managed Postgres インスタンスの送信(egress)IP アドレスは、次のコマンドで取得できます。
セットアップ
ロジカル レプリケーションを動作させるには、ソースデータベースが適切に構成されている必要があります。主な要件は次のとおりです。
- ソースデータベースの
wal_levelがlogicalに設定されている必要があります。 - ソースデータベースの
max_replication_slotsが少なくとも1に設定されている必要があります。 - RDS(本ガイドで例として使用)では、パラメーターグループで
rds.logical_replicationが1に設定されていることを確認する必要があります。 - ソースデータベースのユーザーは
REPLICATION権限を持っている必要があります。RDS の場合、次のコマンドを実行します:
ソースデータベースが次のように構成されていることを確認してください:

ソースデータベースのスキーマのみのダンプ
ロジカルレプリケーションをセットアップする前に、ターゲットの ClickHouse Managed Postgres データベースにスキーマを作成する必要があります。これは、pg_dump を使用してソースデータベースのスキーマのみのダンプを取得することで行えます。
ここでは次のように指定します。
<user>、<password>、<host>、<port>、<database>をソースデータベースの認証情報に置き換えます。-sは、スキーマのみを含むダンプを取得することを指定します。--format directoryは、pg_restoreに適したディレクトリ形式でダンプを出力することを指定します。-f rds-dumpは、ダンプファイルの出力ディレクトリを指定します。このディレクトリは自動的に作成され、事前に存在していてはなりません。
この例では、events テーブルと users テーブルの 2 つがあります。events には 100 万行、users には 1,000 行があります。

Managed Postgres インスタンスを作成する
まず、Managed Postgres インスタンスが作成済みであることを確認してください。可能であれば、ソースと同じリージョンに配置します。クイックガイドはこちらを参照してください。このガイドでは、次のようなインスタンスを作成します:

ClickHouse Managed Postgres へスキーマを復元する
スキーマダンプが用意できたので、pg_restore を使って ClickHouse Managed Postgres インスタンスに復元します。
Here:
<user>,<password>,<host>,<port>,<database>を、ターゲットの ClickHouse Managed Postgres データベースの認証情報に置き換えます。--verboseは、リストア処理中の詳細な出力を行います。 このコマンドは、データを一切含めずに、ターゲットのデータベース内にすべてのテーブル、索引、ビュー、およびその他のスキーマオブジェクトを作成します。
このコマンドを実行すると、今回のケースでは 2 つのテーブルが作成されますが、中身は空の状態です。

ロジカルレプリケーションをセットアップする
スキーマの準備ができたら、ソースデータベースからターゲットとなる ClickHouse Managed Postgres データベースへのロジカルレプリケーションをセットアップします。これには、ソースデータベース側で publication を作成し、ターゲットデータベース側で subscription を作成する作業が含まれます。
ソースデータベースでパブリケーションを作成する
ソースのPostgreSQLデータベースに接続し、レプリケーション対象とするテーブルを含むパブリケーションを作成します。
多数のテーブルが存在する場合、FOR ALL TABLES で publication を作成するとネットワークのオーバーヘッドが発生する可能性があります。レプリケーション対象とするテーブルだけを指定することを推奨します。
対象の ClickHouse Managed Postgres データベース上でサブスクリプションを作成する
次に、対象の ClickHouse Managed Postgres データベースに接続し、ソースデータベースのパブリケーションに接続するサブスクリプションを作成します。
これにより、ソースデータベース上にレプリケーションスロットが自動的に作成され、指定したテーブルからターゲットデータベースへのデータのレプリケーションが開始されます。データ量によっては、この処理に時間がかかる場合があります。
このケースでは、サブスクリプションを設定すると、データが次のように流れ込みました。

ソースデータベースに新たに挿入された行は、ほぼリアルタイムでターゲットである ClickHouse Managed Postgres データベースにレプリケートされるようになります。
注意事項と考慮点
- ロジカルレプリケーションは、データの変更(INSERT、UPDATE、DELETE)のみを複製します。スキーマ変更(ALTER TABLE など)は別途対応する必要があります。
- レプリケーションの中断を避けるため、ソースデータベースとターゲットデータベース間のネットワーク接続が安定していることを確認してください。
- レプリケーションラグを監視し、ターゲットデータベースがソースデータベースに追従できていることを確認してください。ソースデータベースの
max_slot_wal_keep_sizeに適切な値を設定することで、レプリケーションスロットの肥大化を抑え、ディスク容量の過剰消費を防ぐのに役立ちます。 - ユースケースによっては、レプリケーションプロセスに対する監視およびアラート通知を設定することを検討してください。
次のステップ
おめでとうございます。pg_dump と pg_restore を使用して、PostgreSQL データベースを ClickHouse Managed Postgres へ正常に移行できました。これで、Managed Postgres の各種機能や ClickHouse との連携を活用する準備が整いました。ここから進めるための 10 分程度のクイックスタートは次のとおりです。