Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

ClickHouse Managed Postgres のクイックスタート

ベータ

ClickHouse Managed Postgres は、NVMe ストレージを基盤とするエンタープライズグレードの Postgres で、EBS のようなネットワーク接続ストレージと比べてディスクバウンドなワークロードで最大 10 倍の高速化を実現します。このクイックスタートは次の2つのパートに分かれています:

  • 第1部: NVMe Postgres を使い始め、そのパフォーマンスを体感する
  • 第2部: ClickHouse と統合してリアルタイム分析を実現する

ClickHouse Managed Postgres は現在、AWS の複数のリージョンで利用可能であり、パブリックベータ版として提供されています。

このクイックスタートでは、以下を行います:

  • NVMe による高性能を備えた Managed Postgres インスタンスを作成
  • 100万件のサンプルイベントを読み込み、NVMe の速度を実際に確認
  • クエリを実行し、低レイテンシのパフォーマンスを体感
  • リアルタイム分析のためにデータを ClickHouse にレプリケート
  • pg_clickhouse を使用して、Postgres から ClickHouse に直接クエリ

第1部: NVMe Postgres を使い始める

データベースを作成する

新しい ClickHouse Managed Postgres サービスを作成するには、Cloud Console のサービス一覧にある New service ボタンをクリックします。その後、データベースタイプとして Postgres を選択できます。

ClickHouse Managed Postgres サービスを作成する

データベースインスタンスの名前を入力し、Create service をクリックします。概要ページに移動します。

ClickHouse Managed Postgres の概要

ClickHouse Managed Postgres インスタンスは 3~5 分で準備が完了し、使用できるようになります。

データベースに接続する

左側のサイドバーにConnectボタンが表示されます。クリックすると、接続の詳細と複数の形式の接続文字列を表示できます。

ClickHouse Managed Postgres の「Connect」モーダル

psql の接続文字列をコピーして、データベースに接続します。DBeaver などの Postgres 互換クライアントや、任意のアプリケーションライブラリを使用することもできます。

NVMe のパフォーマンスを体感する

NVMe によるパフォーマンスを実際に確認してみましょう。まず、クエリの実行時間を測定できるよう、psql でタイミング計測を有効にします。

\

イベント用とユーザー用のサンプルテーブルを2つ作成します。

CREATE TABLE events (
   event_id SERIAL PRIMARY KEY,
   event_name VARCHAR(255) NOT NULL,
   event_type VARCHAR(100),
   event_timestamp TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
   event_data JSONB,
   user_id INT,
   user_ip INET,
   is_active BOOLEAN DEFAULT TRUE,
   created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
   updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE users (
   user_id SERIAL PRIMARY KEY,
   name VARCHAR(100),
   country VARCHAR(50),
   platform VARCHAR(50)
);

それでは、100万件のイベントを挿入して、NVMeの速度を見てみましょう:

INSERT INTO events (event_name, event_type, event_timestamp, event_data, user_id, user_ip)
SELECT
   'Event ' || gs::text AS event_name,
   CASE
       WHEN random() < 0.5 THEN 'click'
       WHEN random() < 0.75 THEN 'view'
       WHEN random() < 0.9 THEN 'purchase'
       WHEN random() < 0.98 THEN 'signup'
       ELSE 'logout'
   END AS event_type,
   NOW() - INTERVAL '1 day' * (gs % 365) AS event_timestamp,
   jsonb_build_object('key', 'value' || gs::text, 'additional_info', 'info_' || (gs % 100)::text) AS event_data,
   GREATEST(1, LEAST(1000, FLOOR(POWER(random(), 2) * 1000) + 1)) AS user_id,
   ('192.168.1.' || ((gs % 254) + 1))::inet AS user_ip
FROM
   generate_series(1, 1000000) gs;
INSERT 0 1000000
Time: 3596.542 ms (00:03.597)

1,000 人のユーザーを挿入します:

INSERT INTO users (name, country, platform)
SELECT
    first_names[first_idx] || ' ' || last_names[last_idx] AS name,
    CASE
        WHEN random() < 0.25 THEN 'India'
        WHEN random() < 0.5 THEN 'USA'
        WHEN random() < 0.7 THEN 'Germany'
        WHEN random() < 0.85 THEN 'China'
        ELSE 'Other'
    END AS country,
    CASE
        WHEN random() < 0.2 THEN 'iOS'
        WHEN random() < 0.4 THEN 'Android'
        WHEN random() < 0.6 THEN 'Web'
        WHEN random() < 0.75 THEN 'Windows'
        WHEN random() < 0.9 THEN 'MacOS'
        ELSE 'Linux'
    END AS platform
FROM
    generate_series(1, 1000) AS seq
    CROSS JOIN LATERAL (
        SELECT
            array['Alice', 'Bob', 'Charlie', 'Diana', 'Eve', 'Frank', 'Grace', 'Hank', 'Ivy', 'Jack', 'Liam', 'Olivia', 'Noah', 'Emma', 'Sophia', 'Benjamin', 'Isabella', 'Lucas', 'Mia', 'Amelia', 'Aarav', 'Riya', 'Arjun', 'Ananya', 'Wei', 'Li', 'Huan', 'Mei', 'Hans', 'Klaus', 'Greta', 'Sofia'] AS first_names,
            array['Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis', 'Martinez', 'Taylor', 'Anderson', 'Thomas', 'Jackson', 'White', 'Harris', 'Martin', 'Thompson', 'Moore', 'Lee', 'Perez', 'Sharma', 'Patel', 'Gupta', 'Reddy', 'Zhang', 'Wang', 'Chen', 'Liu', 'Schmidt', 'Müller', 'Weber', 'Fischer'] AS last_names,
            1 + (seq % 32) AS first_idx,
            1 + ((seq / 32)::int % 32) AS last_idx
    ) AS names;

データに対してクエリを実行する

それでは、NVMe ストレージを使用した場合に Postgres がどれほど高速に応答するか、いくつかのクエリを実行して確認してみましょう。

100万件のイベントをタイプ別に集計する:

SELECT event_type, COUNT(*) as count 
FROM events 
GROUP BY event_type 
ORDER BY count DESC;
 event_type | count  
------------+--------
 click      | 499523
 view       | 375644
 purchase   | 112473
 signup     |  12117
 logout     |    243
(5 rows)

Time: 114.883 ms

JSONB フィルタリングと日付範囲を使用したクエリ:

SELECT COUNT(*) 
FROM events 
WHERE event_timestamp > NOW() - INTERVAL '30 days'
  AND event_data->>'additional_info' LIKE 'info_5%';
 count 
-------
  9042
(1 row)

Time: 109.294 ms

イベントとユーザーを結合する:

SELECT u.country, COUNT(*) as events, AVG(LENGTH(e.event_data::text))::int as avg_json_size
FROM events e
JOIN users u ON e.user_id = u.user_id
GROUP BY u.country
ORDER BY events DESC;
 country | events | avg_json_size 
---------+--------+---------------
 USA     | 383748 |            52
 India   | 255990 |            52
 Germany | 223781 |            52
 China   | 127754 |            52
 Other   |   8727 |            52
(5 rows)

Time: 224.670 ms

第2部: ClickHouse でリアルタイム分析を追加する

Postgres はトランザクション系ワークロード (OLTP) に優れている一方、ClickHouse は大規模データセットに対する分析クエリ (OLAP) 向けに特化して設計されています。両者を統合することで、双方の利点を享受できます:

  • アプリケーションのトランザクションデータ (挿入、更新、ポイントルックアップ) には Postgres
  • 数十億行規模のデータに対するサブ秒の分析には ClickHouse

このセクションでは、Postgres のデータを ClickHouse にレプリケーションし、シームレスにクエリを実行する方法を説明します。

ClickHouse 連携のセットアップ

Postgres にテーブルとデータが揃ったので、分析のためにテーブルを ClickHouse にレプリケートしましょう。まず、サイドバーの Sync to ClickHouse をクリックします。次に、Replicate data in ClickHouse をクリックします。

ClickHouse Managed Postgres インテグレーションが空です

次のフォームでは、インテグレーションの名前を入力し、レプリケーション先となる既存の ClickHouse インスタンスを選択できます。ClickHouse インスタンスをまだお持ちでない場合は、このフォームから直接作成できます。

ClickHouse Managed Postgres のインテグレーションフォーム

次へをクリックすると、テーブルピッカーに移動します。ここで必要な操作は以下のとおりです:

  • レプリケート先の ClickHouse データベースを選択します。
  • public スキーマを展開し、先ほど作成した users テーブルと events テーブルを選択します。
  • Replicate data to ClickHouse をクリックします。
ClickHouse Managed Postgres テーブル選択

レプリケーションプロセスが開始され、インテグレーションの概要ページに移動します。初回のインテグレーションでは、初期インフラストラクチャのセットアップに2〜3分かかる場合があります。その間に、新しい pg_clickhouse 拡張機能を確認してみましょう。

Postgres から ClickHouse をクエリする

pg_clickhouse 拡張機能を使用すると、Standard SQL を使って Postgres から直接 ClickHouse のデータをクエリできます。これにより、アプリケーションはトランザクションデータと分析データの両方に対して、Postgres を統合クエリレイヤーとして利用できます。詳細については、完全なドキュメントを参照してください。

拡張機能を有効にします:

CREATE EXTENSION pg_clickhouse;

次に、ClickHouse への foreign server 接続を作成します。セキュアな接続にはポート 8443 を使用する http ドライバーを指定します:

CREATE SERVER ch FOREIGN DATA WRAPPER clickhouse_fdw
       OPTIONS(driver 'http', host '<clickhouse_cloud_host>', dbname '<database_name>', port '8443');

<clickhouse_cloud_host> をご使用の ClickHouse のホスト名に、<database_name> をレプリケーション設定時に選択したデータベース名に置き換えてください。ホスト名は、サイドバーの Connect をクリックすることで ClickHouse サービス上で確認できます。

ClickHouse のホストを取得する

次に、Postgres ユーザーを ClickHouse サービスの認証情報にマップします:

CREATE USER MAPPING FOR CURRENT_USER SERVER ch 
OPTIONS (user 'default', password '<clickhouse_password>');

次に、ClickHouse のテーブルを Postgres のスキーマにインポートします。

CREATE SCHEMA organization;
IMPORT FOREIGN SCHEMA "<database_name>" FROM SERVER ch INTO organization;

<database_name> には、サーバーの作成時に使用したデータベース名と同じ名前を指定してください。

これで、Postgres クライアントですべての ClickHouse テーブルを確認できます:

\

分析機能を実際に確認する

インテグレーションページに戻って確認しましょう。初期レプリケーションが完了しているはずです。詳細を表示するには、インテグレーション名をクリックしてください。

ClickHouse Managed Postgres 分析一覧

サービス名をクリックして ClickHouse コンソールを開き、レプリケートテーブルを確認します。

ClickHouse 内の ClickHouse Managed Postgres レプリケートテーブル

Postgres と ClickHouse のパフォーマンスを比較する

次に、いくつかの分析クエリを実行して、Postgres と ClickHouse のパフォーマンスを比較してみましょう。なお、レプリケートされたテーブルは public_<table_name> という命名規則を使用します。

クエリ 1: アクティビティ別上位ユーザー

このクエリは、複数の集計を用いて最もアクティブなユーザーを見つけます。

-- Via ClickHouse
SELECT 
    user_id,
    COUNT(*) as total_events,
    COUNT(DISTINCT event_type) as unique_event_types,
    SUM(CASE WHEN event_type = 'purchase' THEN 1 ELSE 0 END) as purchases,
    MIN(event_timestamp) as first_event,
    MAX(event_timestamp) as last_event
FROM organization.public_events
GROUP BY user_id
ORDER BY total_events DESC
LIMIT 10;
 user_id | total_events | unique_event_types | purchases |        first_event         |         last_event         
---------+--------------+--------------------+-----------+----------------------------+----------------------------
       1 |        31439 |                  5 |      3551 | 2025-01-22 22:40:45.612281 | 2026-01-21 22:40:45.612281
       2 |        13235 |                  4 |      1492 | 2025-01-22 22:40:45.612281 | 2026-01-21 22:40:45.612281
...
(10 rows)

Time: 163.898 ms   -- ClickHouse
Time: 554.621 ms   -- Same query on Postgres

クエリ 2: 国別・プラットフォーム別のユーザーエンゲージメント

このクエリはイベントとユーザーを結合し、エンゲージメントメトリクスを計算します:

-- Via ClickHouse
SELECT 
    u.country,
    u.platform,
    COUNT(DISTINCT e.user_id) as users,
    COUNT(*) as total_events,
    ROUND(COUNT(*)::numeric / COUNT(DISTINCT e.user_id), 2) as events_per_user,
    SUM(CASE WHEN e.event_type = 'purchase' THEN 1 ELSE 0 END) as purchases
FROM organization.public_events e
JOIN organization.public_users u ON e.user_id = u.user_id
GROUP BY u.country, u.platform
ORDER BY total_events DESC
LIMIT 10;
 country | platform | users | total_events | events_per_user | purchases 
---------+----------+-------+--------------+-----------------+-----------
 USA     | Android  |   115 |       109977 |             956 |     12388
 USA     | Web      |   108 |       105057 |             972 |     11847
 USA     | iOS      |    83 |        84594 |            1019 |      9565
 Germany | Android  |    85 |        77966 |             917 |      8852
 India   | Android  |    80 |        68095 |             851 |      7724
...
(10 rows)

Time: 170.353 ms   -- ClickHouse
Time: 1245.560 ms  -- Same query on Postgres

パフォーマンス比較:

クエリ Postgres (NVMe) ClickHouse (via pg_clickhouse) 高速化倍率
上位ユーザー (5つの集計) 555 ms 164 ms 3.4x
ユーザーエンゲージメント (JOIN + 集計) 1,246 ms 170 ms 7.3x

クリーンアップ

このクイックスタートで作成したリソースを削除するには:

  1. まず、ClickHouse サービスから ClickPipe インテグレーションを削除します
  2. 次に、Cloud Console から ClickHouse Managed Postgres インスタンスを削除します
ベータ

この方法は、自分で進めても、スクリプト化しても、AI Agent に任せてもかまいません。コンソール版を使う場合は、Cloud UI 表示に切り替えてください。

このページでは、ClickHouse CLI (clickhousectl) と psql を使って、ClickHouse Managed Postgres のプロビジョニング、データの読み込み、ClickHouse へのレプリケーション、クエリの実行を、すべてコマンドラインから行う方法を説明します。コマンドは非対話型で、clickhousectl--json を指定すると JSON を出力します。

前提条件

ClickHouse CLIをインストールします:

curl https://clickhouse.com/cli | sh

psql (PostgreSQL client ツール。macOS では brew install libpq) と jq も必要です。

書き込み操作 (作成、削除) には API key 認証 が必要です。OAuth ログインは読み取り専用です:

clickhousectl cloud auth login --api-key <YOUR_KEY> --api-secret <YOUR_SECRET>

または、環境変数 CLICKHOUSE_CLOUD_API_KEYCLICKHOUSE_CLOUD_API_SECRET を設定します。clickhousectl cloud auth status で確認し、スコープが read/write のエントリが表示されることを確認してください。

第1部: Postgresを作成し、データを読み込む

Postgresサービスを作成する

サービスを作成し、レスポンスを保存します。パスワードは一度しか表示されません:

clickhousectl cloud postgres create \
  --name quickstart-pg \
  --region us-east-1 \
  --size m6gd.large \
  --pg-version 18 \
  --json > pg.json

レスポンスには、サービス ID、ホスト名、すぐに使える接続文字列が含まれます。

{
  "id": "3b5a3112-bf02-82d0-bd02-fbe67d5caa7a",
  "name": "quickstart-pg",
  "provider": "aws",
  "region": "us-east-1",
  "postgresVersion": "18",
  "size": "m6gd.large",
  "storageSize": 118,
  "haType": "none",
  "state": "creating",
  "createdAt": "2026-07-22T13:21:22Z",
  "hostname": "quickstart-pg-c1406b50.pg7dd324nz0a1qm1fqskxbjn7m.c0.us-east-1.aws.pg.clickhouse.cloud",
  "username": "postgres",
  "password": "vV6cfEr2p_-TzkCDrZOx",
  "connectionString": "postgres://postgres:vV6cfEr2p_-TzkCDrZOx@quickstart-pg-c1406b50.pg7dd324nz0a1qm1fqskxbjn7m.c0.us-east-1.aws.pg.clickhouse.cloud:5432/postgres?channel_binding=require",
  "isPrimary": true,
  "tags": []
}

このガイドの以降で必要になる情報を抽出します:

PG_ID=$(jq -r .id pg.json)
PG_URL=$(jq -r .connectionString pg.json)

パスワードを紛失した場合は、clickhousectl cloud postgres reset-password $PG_ID --generate で新しいパスワードを生成します。

サービスの Provisioning が完了するまで待機する

Provisioning には数分かかります。状態が running になるまでポーリングしてください:

while [ "$(clickhousectl cloud postgres get "$PG_ID" --json | jq -r .state)" != "running" ]; do
  sleep 15
done

サンプルデータを読み込む

2 つのテーブルを作成し、psql を使って 100 万件のイベントを挿入します:

psql "$PG_URL" <<'SQL'
\timing
CREATE TABLE events (
   event_id SERIAL PRIMARY KEY,
   event_name VARCHAR(255) NOT NULL,
   event_type VARCHAR(100),
   event_timestamp TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
   event_data JSONB,
   user_id INT,
   user_ip INET,
   is_active BOOLEAN DEFAULT TRUE,
   created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
   updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE users (
   user_id SERIAL PRIMARY KEY,
   name VARCHAR(100),
   country VARCHAR(50),
   platform VARCHAR(50)
);

INSERT INTO events (event_name, event_type, event_timestamp, event_data, user_id, user_ip)
SELECT
   'Event ' || gs::text AS event_name,
   CASE
       WHEN random() < 0.5 THEN 'click'
       WHEN random() < 0.75 THEN 'view'
       WHEN random() < 0.9 THEN 'purchase'
       WHEN random() < 0.98 THEN 'signup'
       ELSE 'logout'
   END AS event_type,
   NOW() - INTERVAL '1 day' * (gs % 365) AS event_timestamp,
   jsonb_build_object('key', 'value' || gs::text, 'additional_info', 'info_' || (gs % 100)::text) AS event_data,
   GREATEST(1, LEAST(1000, FLOOR(POWER(random(), 2) * 1000) + 1)) AS user_id,
   ('192.168.1.' || ((gs % 254) + 1))::inet AS user_ip
FROM
   generate_series(1, 1000000) gs;

INSERT INTO users (name, country, platform)
SELECT
    first_names[first_idx] || ' ' || last_names[last_idx] AS name,
    CASE
        WHEN random() < 0.25 THEN 'India'
        WHEN random() < 0.5 THEN 'USA'
        WHEN random() < 0.7 THEN 'Germany'
        WHEN random() < 0.85 THEN 'China'
        ELSE 'Other'
    END AS country,
    CASE
        WHEN random() < 0.2 THEN 'iOS'
        WHEN random() < 0.4 THEN 'Android'
        WHEN random() < 0.6 THEN 'Web'
        WHEN random() < 0.75 THEN 'Windows'
        WHEN random() < 0.9 THEN 'MacOS'
        ELSE 'Linux'
    END AS platform
FROM
    generate_series(1, 1000) AS seq
    CROSS JOIN LATERAL (
        SELECT
            array['Alice', 'Bob', 'Charlie', 'Diana', 'Eve', 'Frank', 'Grace', 'Hank', 'Ivy', 'Jack', 'Liam', 'Olivia', 'Noah', 'Emma', 'Sophia', 'Benjamin', 'Isabella', 'Lucas', 'Mia', 'Amelia', 'Aarav', 'Riya', 'Arjun', 'Ananya', 'Wei', 'Li', 'Huan', 'Mei', 'Hans', 'Klaus', 'Greta', 'Sofia'] AS first_names,
            array['Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis', 'Martinez', 'Taylor', 'Anderson', 'Thomas', 'Jackson', 'White', 'Harris', 'Martin', 'Thompson', 'Moore', 'Lee', 'Perez', 'Sharma', 'Patel', 'Gupta', 'Reddy', 'Zhang', 'Wang', 'Chen', 'Liu', 'Schmidt', 'Müller', 'Weber', 'Fischer'] AS last_names,
            1 + (seq % 32) AS first_idx,
            1 + ((seq / 32)::int % 32) AS last_idx
    ) AS names;
SQL
Timing is on.
CREATE TABLE
Time: 86.029 ms
CREATE TABLE
Time: 80.962 ms
INSERT 0 1000000
Time: 7120.357 ms (00:07.120)
INSERT 0 1000
Time: 84.807 ms

NVMeストレージにより、100万行の insert は m6gd.large (最小サイズ) で約7秒で完了します。クエリで確認してください。データは random() で生成されるため、行数は実行のたびに異なります。

psql "$PG_URL" -c "SELECT event_type, COUNT(*) FROM events GROUP BY event_type ORDER BY 2 DESC;"

第2部: ClickHouse にレプリケートする

ClickHouse サービスを作成する

同じリージョンにサービスを作成し、レスポンスを保存します。パスワードは作成時のレスポンスにのみ表示されます。

clickhousectl cloud service create \
  --name quickstart-ch \
  --region us-east-1 \
  --json > ch.json

CH_ID=$(jq -r .service.id ch.json)
CH_PASSWORD=$(jq -r .password ch.json)

稼働状態になるまで待機してください。ClickPipe には稼働中の宛先が必要です:

while [ "$(clickhousectl cloud service get "$CH_ID" --json | jq -r .state)" != "running" ]; do
  sleep 15
done

代わりに既存のサービスを使用する場合は、clickhousectl cloud service list で取得した CH_ID を設定し、CH_PASSWORD にはその default ユーザーのパスワードを設定します。これは pg_clickhouse のステップで必要です。

テーブルを ClickHouse にレプリケートする

ClickHouse サービス 上に、ClickHouse Managed Postgres の ホスト名 を指定した Postgres CDC ClickPipe を作成します。このパイプは既存の行をコピーし、その後も継続的な変更に合わせて ClickHouse を同期した状態に保ちます。

PG_HOST=$(jq -r .hostname pg.json)
PG_PASSWORD=$(jq -r .password pg.json)

clickhousectl cloud clickpipe create postgres "$CH_ID" \
  --name quickstart-sync \
  --host "$PG_HOST" \
  --pg-database postgres \
  --username postgres \
  --password "$PG_PASSWORD" \
  --table-mapping public.events:public_events \
  --table-mapping public.users:public_users \
  --json > pipe.json

PIPE_ID=$(jq -r .id pipe.json)

注意:

  • レプリケートテーブルは ClickHouse サービス 上の default データベースに作成され、名前は --table-mapping のターゲットで指定したものになります
  • publicationreplication slot は自動的に作成され、publication の対象はマップされたテーブルに限定されます。自分で管理するものを使う場合は --publication-name を指定してください
  • Postgres の ホスト名 は直接指定してください。PgBouncer 経由のレプリケーションはサポートされていません

パイプがRunningになるまで待機します

パイプはRunningに到達するまでに、ProvisioningSetup、 (大きなテーブルの場合は) Snapshotを経由します。サービス上の最初のパイプでは、これに約4分かかります。FailedInternalErrorは終端状態です:

while :; do
  STATE=$(clickhousectl cloud clickpipe get "$CH_ID" "$PIPE_ID" --json | jq -r .state)
  case "$STATE" in
    Running) break ;;
    Failed|InternalError) echo "ClickPipe entered terminal state: $STATE" >&2; exit 1 ;;
  esac
  sleep 15
done

ClickHouse でレプリケートされたデータにクエリを実行する

CLI から ClickHouse サービスに直接 SQL を実行します。最初の呼び出しで、Query API エンドポイントとサービス スコープの API キーが自動的に作成されます:

clickhousectl cloud service query --id "$CH_ID" \
  --query "SELECT count() FROM public_events"
Provisioning Query API endpoint + key for service 'quickstart-ch'...
1000000

Postgres への新しい書き込みは継続的にレプリケートされます。1 行を挿入し、件数が 1,000,001 に達するまでポーリングしてください (通常は 1 分未満です) :

psql "$PG_URL" -c "INSERT INTO events (event_name, event_type, user_id, user_ip) VALUES ('cdc-test', 'click', 42, '10.0.0.1');"

while [ "$(clickhousectl cloud service query --id "$CH_ID" \
  --query "SELECT count() FROM public_events")" != "1000001" ]; do
  sleep 10
done

Postgres から ClickHouse をクエリする

pg_clickhouse 拡張機能を使うと、Postgres をトランザクションデータと分析データの両方に対応する統合クエリレイヤーとして利用できます。ClickHouse の HTTPS ホスト名を取得し、psql でこの拡張機能を設定します。

CH_HOST=$(clickhousectl cloud service get "$CH_ID" --json \
  | jq -r '.endpoints[] | select(.protocol=="https") | .host')

psql "$PG_URL" <<SQL
CREATE EXTENSION pg_clickhouse;
CREATE SERVER ch FOREIGN DATA WRAPPER clickhouse_fdw
       OPTIONS(driver 'http', host '$CH_HOST', dbname 'default', port '8443');
CREATE USER MAPPING FOR CURRENT_USER SERVER ch
       OPTIONS (user 'default', password '$CH_PASSWORD');
CREATE SCHEMA organization;
IMPORT FOREIGN SCHEMA "default" FROM SERVER ch INTO organization;
SQL

ヒアドキュメントは意図的にクォートしていないため、SQL が Postgres に届く前に、シェルが $CH_HOST$CH_PASSWORD を展開します。これで、レプリケートテーブルが organization スキーマ内の外部テーブルとして参照できるようになり、それらに対するクエリは ClickHouse で実行されます。

このデータセットを m6gd.large で測定したところ、分析クエリは外部テーブル経由のほうが 6~9 倍高速でした (たとえば、5 つの集計を含む GROUP BY は ClickHouse 経由で 176 ms、ローカルでは 1,133 ms、集計を伴う JOIN は 298 ms、ローカルでは 2,764 ms) 。

クリーンアップ

まず ClickPipe を削除し、次に Postgres サービスを削除します。サービスを削除すると、そのサービス内のすべてのデータが完全に削除されます。

clickhousectl cloud clickpipe delete "$CH_ID" "$PIPE_ID"
clickhousectl cloud postgres delete "$PG_ID"

稼働中の ClickHouse サービス は直接削除できません。いったん停止し、stopped になるのを待ってから削除してください。

clickhousectl cloud service stop "$CH_ID"

while [ "$(clickhousectl cloud service get "$CH_ID" --json | jq -r .state)" != "stopped" ]; do
  sleep 10
done

clickhousectl cloud service delete "$CH_ID"
Navigation