Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

الدليل السريع لـ ClickHouse Managed Postgres

Beta

ClickHouse Managed Postgres هو Postgres بمستوى المؤسسات مدعومٌ بتخزين NVMe، يوفر أداءً أسرع بما يصل إلى 10 أضعاف للأعباء المقيّدة بالقرص مقارنةً بالتخزين المتصل عبر الشبكة مثل EBS. ينقسم هذا الدليل التمهيدي إلى قسمين:

  • Part 1: ابدأ باستخدام NVMe Postgres واختبر أداءه
  • Part 2: استفِد من التحليلات في الوقت الفعلي عبر التكامل مع ClickHouse

ClickHouse Managed Postgres متاح حاليًا على AWS في عدة مناطق وهو في مرحلة Public Beta.

في هذا الدليل التمهيدي، ستتعلم:

  • أنشئ مثيل ClickHouse Managed Postgres بأداء مدعوم بـ NVMe
  • أدخِل مليون حدث تجريبي وشاهد سرعة NVMe عمليًا
  • شغّل الاستعلامات واختبر أداءً بزمن انتقال منخفض
  • انسخ البيانات إلى ClickHouse لإجراء تحليلات في الوقت الفعلي
  • استعلم من ClickHouse مباشرةً من داخل Postgres باستخدام pg_clickhouse

الجزء 1: البدء مع NVMe Postgres

إنشاء قاعدة بيانات

لإنشاء خدمة ClickHouse Managed Postgres جديدة، انقر على زر New service في قائمة الخدمات في Cloud Console. ستتمكن بعد ذلك من اختيار Postgres نوعًا لقاعدة البيانات.

أنشئ خدمة ClickHouse Managed Postgres

أدخل اسمًا لـ instance قاعدة البيانات الخاصة بك وانقر على Create service. سيتم نقلك إلى صفحة Overview.

نظرة عامة على ClickHouse Managed Postgres

سيتم توفير مثيل ClickHouse Managed Postgres الخاص بك وسيكون جاهزًا للاستخدام في غضون 3-5 دقائق.

الاتصال بقاعدة البيانات

في الشريط الجانبي على اليسار، ستجد زر الاتصال. انقر عليه لعرض تفاصيل الاتصال وسلاسل الاتصال بتنسيقات متعددة.

النافذة المنبثقة Connect لـ ClickHouse Managed Postgres

انسخ سلسلة اتصال psql واتصل بقاعدة بياناتك. يمكنك أيضًا استخدام أي عميل متوافق مع Postgres مثل DBeaver، أو أي مكتبة تطبيق.

اختبر أداء NVMe

لنرَ أداء NVMe عمليًا. أولًا، فعّل التوقيت في psql لقياس زمن تنفيذ الاستعلام:

\

أنشئ جدولين تجريبيين للأحداث والمستخدمين:

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

الآن، أدخِل مليون حدث وشاهد سرعة 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;

تشغيل الاستعلامات على بياناتك

الآن لنُشغّل بعض الاستعلامات لنرى مدى سرعة استجابة Postgres مع تخزين NVMe.

تجميع مليون حدث حسب النوع:

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

الجزء الثاني: إضافة تحليلات فورية مع ClickHouse

بينما يتفوق Postgres في أعباء العمل المعاملاتية (OLTP)، تم تصميم ClickHouse خصيصًا للاستعلامات التحليلية (OLAP) على مجموعات البيانات الكبيرة. من خلال دمجهما معًا، تحصل على أفضل ما في العالمين:

  • Postgres لبيانات تطبيقك الخاصة بالمعاملات (عمليات الإدراج، والتحديث، وعمليات البحث المباشر)
  • ClickHouse لإجراء تحليلات على مليارات الصفوف في أقل من ثانية

يوضح لك هذا القسم كيفية نسخ بيانات Postgres إلى ClickHouse والاستعلام عنها بسلاسة.

إعداد تكامل ClickHouse

بعد أن أصبح لدينا جداول وبيانات في Postgres، دعونا ننسخ الجداول إلى ClickHouse لأغراض التحليلات. نبدأ بالنقر على مزامنة إلى ClickHouse في الشريط الجانبي. ثم يمكنك النقر على مزامنة البيانات في ClickHouse.

تكامل Managed Postgres فارغ

في النموذج التالي، يمكنك إدخال اسم للتكامل الخاص بك واختيار مثيل ClickHouse موجود لنسخ البيانات إليه. إذا لم يكن لديك مثيل ClickHouse بعد، يمكنك إنشاء واحد مباشرةً من هذا النموذج.

نموذج تكامل ClickHouse Managed Postgres

انقر على التالي للانتقال إلى منتقي الجداول. كل ما عليك فعله هنا هو:

  • اختر قاعدة بيانات في ClickHouse لنسخ البيانات إليها.
  • وسّع المخطط public وحدد جدولي users وevents اللذين أنشأناهما سابقًا.
  • انقر على Replicate data to ClickHouse.
منتقي الجداول في ClickHouse Managed Postgres

ستبدأ عملية النسخ المتماثل، وسيتم نقلك إلى صفحة نظرة عامة على التكامل. بما أن هذا هو التكامل الأول، فقد يستغرق إعداد البنية التحتية الأولية دقيقتين إلى ثلاث دقائق. في هذه الأثناء، دعنا نطلع على الإضافة الجديدة pg_clickhouse.

الاستعلام عن ClickHouse من Postgres

تتيح إضافة pg_clickhouse الاستعلام عن بيانات ClickHouse مباشرةً من Postgres باستخدام SQL القياسي. وهذا يعني أن تطبيقك يمكنه استخدام Postgres كطبقة استعلام موحّدة لكل من البيانات المعاملاتية والتحليلية. راجع التوثيق الكامل للتفاصيل.

فعّل الإضافة:

CREATE EXTENSION pg_clickhouse;

بعد ذلك، أنشئ اتصال خادم خارجي بـ ClickHouse. استخدم برنامج التشغيل http مع المنفذ 8443 للاتصالات الآمنة:

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> بقاعدة البيانات التي اخترتها أثناء إعداد النسخ المتماثل. يمكنك العثور على اسم المضيف في خدمة ClickHouse الخاصة بك بالنقر على Connect في الشريط الجانبي.

الحصول على مضيف 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> باسم قاعدة البيانات نفسه الذي استخدمته عند إنشاء الخادم.

يمكنك الآن رؤية جميع جداول ClickHouse في عميل Postgres الخاص بك:

\

شاهد تحليلاتك عمليًا

لنعُد إلى صفحة التكامل. ينبغي أن ترى أن النسخ المتماثل الأولي قد اكتمل. انقر على اسم التكامل لعرض التفاصيل.

قائمة تحليلات ClickHouse Managed Postgres

انقر على اسم الخدمة لفتح وحدة تحكم ClickHouse وعرض الجداول المُنسوخة.

الجداول المُكرَّرة لـ ClickHouse Managed Postgres في ClickHouse

مقارنة أداء 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. أولًا، احذف تكامل ClickPipe من خدمة ClickHouse
  2. ثم احذف مثيل ClickHouse Managed Postgres من Cloud Console
Beta

يمكنك اتباع هذا المسار بنفسك، أو أتمتته ببرنامج نصي، أو تسليمه إلى وكيل ذكاء اصطناعي. انتقل إلى عرض Cloud UI لنسخة Console.

تتناول هذه الصفحة تهيئة ClickHouse Managed Postgres، وتحميل البيانات، ونسخها إلى ClickHouse، والاستعلام عنها، وكل ذلك من خلال سطر الأوامر باستخدام ClickHouse CLI (clickhousectl) وpsql. الأوامر غير تفاعلية؛ ويُخرج clickhousectl مخرجات JSON مع --json.

المتطلبات الأساسية

ثبّت ClickHouse CLI:

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

ستحتاج أيضًا إلى psql (أدوات عميل PostgreSQL؛ على MacOS، brew install libpq) وjq.

تتطلب عمليات الكتابة (الإنشاء، الحذف) المصادقة بمفتاح API؛ أما تسجيل الدخول عبر OAuth فهو للقراءة فقط:

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

بدلًا من ذلك، عيّن متغيرَي البيئة CLICKHOUSE_CLOUD_API_KEY وCLICKHOUSE_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": "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.

انتظر حتى يكتمل تجهيز الخدمة

تستغرق عملية التجهيز بضع دقائق. تحقّق دوريًا حتى تصبح الحالة running:

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

تحميل بيانات نموذجية

أنشئ جدولين ونفّذ insert لمليون حدث عبر psql:

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

يكتمل إدراج مليون صف خلال نحو 7 ثوانٍ على m6gd.large (أصغر فئة) بفضل تخزين NVMe. تحقّق من ذلك بإجراء استعلام؛ إذ تختلف أعداد الصفوف بين مرات التشغيل لأن البيانات تُولَّد باستخدام 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

لاستخدام خدمة موجودة بدلًا من ذلك، عيّن CH_ID من clickhousectl cloud service list وعيّن CH_PASSWORD إلى كلمة مرور المستخدم default الخاصة بها، والتي تحتاجها خطوة pg_clickhouse.

انسخ الجداول إلى ClickHouse

أنشئ ClickPipe لـ Postgres CDC على خدمة ClickHouse، مع توجيهه إلى اسم مضيف الخاص بـ ClickHouse Managed Postgres. ينسخ هذا الـ قناة الصفوف الحالية، ثم يُبقي 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)

ملاحظات:

  • تُنشأ الجداول المُكرَّرة في قاعدة البيانات default على خدمة ClickHouse، وتُسمّى بحسب أهداف --table-mapping
  • يُنشأ كلٌّ من الـ publication وreplication slot تلقائيًا، ويقتصر نطاق الـ publication على الجداول المعيّنة؛ مرّر --publication-name لاستخدام اسم تديره بنفسك
  • استخدم اسم مضيف المباشر لـ Postgres؛ replication غير مدعومة عبر PgBouncer

انتظر حتى تصل القناة إلى Running

تنتقل القناة عبر Provisioning وSetup و(بالنسبة إلى الجداول الأكبر) Snapshot قبل أن تصل إلى Running، ويستغرق ذلك نحو 4 دقائق لأول قناة في خدمة. وتُعد حالتا Failed وInternalError نهائيتين:

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

نفّذ استعلامات SQL على خدمة ClickHouse مباشرةً من خلال CLI. تنشئ أول عملية استدعاء تلقائيًا نقطة نهاية لواجهة برمجة تطبيقات الاستعلام ومفتاح 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 باستمرار. أدرِج صفًا وأجرِ poll حتى يصل العدد إلى 1,000,001 (عادةً خلال أقل من دقيقة):

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

الاستعلام عن ClickHouse من Postgres

يتيح الامتداد 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

تم ترك Heredoc بدون علامات اقتباس عمدًا، لكي يستبدل مفسّر الأوامر $CH_HOST و$CH_PASSWORD قبل أن يصل SQL إلى Postgres. أصبحت الجداول المُكرَّرة الآن مرئية كجداول خارجية في مخطط organization؛ وتُنفَّذ الاستعلامات عليها في ClickHouse.

عند القياس على m6gd.large باستخدام مجموعة البيانات هذه، تعمل الاستعلامات التحليلية أسرع بمقدار 6–9 مرات عبر الجداول الخارجية (على سبيل المثال، GROUP BY مع 5 عمليات تجميع: ‏176 مللي ثانية عبر ClickHouse مقابل 1,133 مللي ثانية محليًا؛ وJOIN مع عمليات تجميع: ‏298 مللي ثانية مقابل 2,764 مللي ثانية).

التنظيف

احذف 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