الانتقال إلى المحتوى الرئيسي
ClickHouse Managed Postgres هو Postgres بمستوى مؤسسي ومدعوم بتخزين NVMe، ويوفّر أداءً أسرع بما يصل إلى 10 مرات لأعباء العمل المقيّدة بأداء القرص مقارنةً بالتخزين المتصل عبر الشبكة مثل EBS. ينقسم هذا الدليل السريع إلى جزأين:
  • الجزء 1: ابدأ باستخدام NVMe Postgres واختبر أداءه
  • الجزء 2: فعّل التحليل في الوقت الفعلي من خلال التكامل مع ClickHouse
يتوفر Managed Postgres حاليًا على AWS في عدة مناطق، وهو مجاني خلال المعاينة الخاصة. في هذا الدليل السريع، ستقوم بما يلي:
  • إنشاء مثيل Managed Postgres بأداء مدعوم من NVMe
  • تحميل مليون حدث تجريبي ومشاهدة سرعة NVMe عمليًا
  • تشغيل الاستعلامات واختبار أداء منخفض الكمون
  • نسخ البيانات إلى ClickHouse للتحليل في الوقت الفعلي
  • الاستعلام من ClickHouse مباشرةً عبر Postgres باستخدام pg_clickhouse

الجزء 1: بدء استخدام NVMe Postgres

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

لإنشاء خدمة Managed Postgres جديدة، انقر على زر New service في قائمة الخدمات في Cloud Console. بعد ذلك، يمكنك اختيار Postgres كنوع قاعدة البيانات. أدخل اسمًا لمثيل قاعدة البيانات، ثم انقر على Create service. سيتم توجيهك إلى صفحة Overview. سيتم توفير مثيل Managed Postgres الخاص بك، وسيكون جاهزًا للاستخدام خلال 3 إلى 5 دقائق.

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

في الشريط الجانبي الأيسر، سترى زر Connect. انقر عليه لعرض تفاصيل الاتصال وسلاسل الاتصال بتنسيقات متعددة. انسخ سلسلة اتصال psql واتصل بقاعدة بياناتك. يمكنك أيضًا استخدام أي عميل متوافق مع Postgres، مثل DBeaver، أو أي مكتبة تطبيقات.

اختبر أداء NVMe

لنرَ أداء NVMe عمليًا. أولًا، فعّل التوقيت في psql لقياس زمن تنفيذ الاستعلام:
\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)
);
الآن، أدخِل مليون حدث وشاهد سرعة 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)
أداء NVMeتم إدراج مليون صف من بيانات JSONB في أقل من 4 ثوانٍ. في قواعد البيانات السحابية التقليدية التي تستخدم تخزينًا متصلًا عبر الشبكة مثل EBS، تستغرق العملية نفسها عادةً وقتًا أطول بمرتين إلى ثلاث مرات بسبب زمن انتقال الذهاب والإياب عبر الشبكة وتقييد IOPS. يزيل تخزين NVMe هذه الاختناقات من خلال إبقاء التخزين متصلًا فعليًا بالحوسبة.يختلف الأداء حسب حجم المثيل، والحمل الحالي، وخصائص البيانات.
أدرج 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
أصبح Postgres لديك جاهزًافي هذه المرحلة، أصبح لديك قاعدة بيانات Postgres عالية الأداء وعاملة بكامل طاقتها، وجاهزة لأعباء العمل الخاصة بالمعاملات.تابع إلى الجزء 2 لترى كيف يمكن للتكامل الأصلي مع ClickHouse أن يعزّز تحليلاتك بشكل كبير.

الجزء 2: أضِف التحليلات في الوقت الفعلي باستخدام ClickHouse

في حين يتفوّق Postgres في أعباء العمل المعاملاتية (OLTP)، صُمِّم ClickHouse خصيصًا للاستعلامات التحليلية (OLAP) على مجموعات البيانات الكبيرة. وبدمج الاثنين، ستحصل على أفضل ما في العالمين:
  • Postgres لبيانات المعاملات الخاصة بتطبيقك (عمليات الإدراج، والتحديث، وعمليات البحث المباشرة)
  • ClickHouse لتحليلات بزمن استجابة أقل من ثانية على مليارات الصفوف
يوضح لك هذا القسم كيفية مزامنة بيانات Postgres مع ClickHouse والاستعلام عنها بسلاسة.

إعداد تكامل ClickHouse

الآن بعد أن أصبحت لدينا جداول وبيانات في Postgres، لننسخ الجداول إلى ClickHouse لأغراض analytics. نبدأ بالنقر على تكامل ClickHouse في الشريط الجانبي. ثم يمكنك النقر على Replicate data in ClickHouse. في النموذج التالي، يمكنك إدخال اسم للتكامل وتحديد مثيل ClickHouse موجود لنسخ البيانات إليه. وإذا لم يكن لديك مثيل ClickHouse بعد، فيمكنك إنشاء واحد مباشرةً من هذا النموذج.
مهمتأكد من أن خدمة ClickHouse التي تحددها في حالة Running قبل المتابعة.
انقر على Next للانتقال إلى picker الجداول. وكل ما عليك فعله هنا هو:
  • تحديد قاعدة بيانات ClickHouse لنسخ البيانات إليها.
  • توسيع schema public وتحديد جدولَي users وevents اللذين أنشأناهما سابقًا.
  • النقر على Replicate data to ClickHouse.
ستبدأ عملية النسخ المتماثل، وسيتم نقلك إلى صفحة Overview الخاصة بالتكامل. وبما أن هذا هو التكامل الأول، فقد يستغرق إعداد البنية التحتية الأولية من دقيقتين إلى ثلاث دقائق. وفي أثناء ذلك، لنلقِ نظرة على الامتداد الجديد pg_clickhouse.

الاستعلام في ClickHouse من خلال Postgres

يتيح لك امتداد pg_clickhouse الاستعلام عن بيانات ClickHouse مباشرةً من Postgres باستخدام SQL القياسي. وهذا يعني أن تطبيقك يمكنه استخدام Postgres كطبقة استعلام موحّدة لكلٍّ من البيانات الخاصة بالمعاملات والبيانات التحليلية. راجع التوثيق الكامل لمزيد من التفاصيل. فعِّل الامتداد:
CREATE EXTENSION pg_clickhouse;
ثم أنشئ اتصال foreign server بـ 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 في الشريط الجانبي. الآن، نربط مستخدم 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 لديك:
\det+ organization.*

شاهد تحليلاتك على أرض الواقع

لنعد إلى صفحة التكامل. ينبغي أن ترى أن النسخ المتماثل الأولي قد اكتمل. انقر على اسم التكامل لعرض التفاصيل. انقر على اسم الخدمة لفتح وحدة تحكم 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 (عبر pg_clickhouse)عامل التسريع
أهم المستخدمين (5 عمليات تجميع)555 ms164 ms3.4x
تفاعل المستخدمين (JOIN + عمليات تجميع)1,246 ms170 ms7.3x
متى تستخدم ClickHouseحتى مع مجموعة البيانات هذه التي تضم 1M صف، يوفّر ClickHouse أداءً أسرع بمقدار 3-7x في الاستعلامات التحليلية المعقدة التي تتضمن عمليات JOIN وعمليات تجميع متعددة. ويصبح الفارق أكثر وضوحًا على نطاقات أكبر (100M+ صف)، حيث يمكن لتخزين ClickHouse العمودي وتنفيذه المتجهي أن يوفّرا تسارعًا بمقدار 10-100x.تختلف أزمنة الاستعلام حسب حجم المثيل، وزمن انتقال الشبكة بين الخدمات، وخصائص البيانات، والحمل الحالي.

التنظيف

لحذف الموارد التي أُنشئت في الدليل السريع هذا:
  1. أولًا، احذف تكامل ClickPipe من خدمة ClickHouse
  2. ثم احذف مثيل Managed Postgres من Cloud Console
آخر تعديل في ٢٥ يونيو ٢٠٢٦