يُوصى لمستخدمي ClickHouse Cloud باستخدام ClickPipes لنسخ PostgreSQL إلى ClickHouse. ويدعم ذلك أصلاً CDC (التقاط تغييرات البيانات) عالي الأداء لـ PostgreSQL.
MaterializedPostgreSQL لقطة لقاعدة بيانات PostgreSQL وتحمّل الجداول المطلوبة. ويمكن أن تشمل الجداول المطلوبة أي subset من الجداول من أي subset من المخططات ضمن قاعدة البيانات المحددة. وبالتزامن مع إنشاء لقطة، يحصل محرك قاعدة البيانات على LSN، وبعد تنفيذ تفريغ أولي للجداول يبدأ في سحب التحديثات من WAL. بعد إنشاء قاعدة البيانات، لا تتم إضافة الجداول التي تُضاف لاحقاً إلى قاعدة بيانات PostgreSQL تلقائياً إلى النسخ المتماثل. ويجب إضافتها يدوياً باستخدام الاستعلام ATTACH TABLE db.table.
يُنفَّذ النسخ المتماثل باستخدام PostgreSQL Logical Replication Protocol، الذي لا يسمح بتكرار DDL، لكنه يتيح معرفة ما إذا كانت قد حدثت breaking changes تؤثر في النسخ المتماثل (مثل تغيير نوع العمود أو إضافة الأعمدة/إزالتها). تُكتشف هذه التغييرات، وعندها تتوقف الجداول المعنية عن تلقي التحديثات. في هذه الحالة، يجب استخدام استعلامي ATTACH و DETACH PERMANENTLY لإعادة تحميل الجدول بالكامل. وإذا كان DDL لا يعطّل النسخ المتماثل (على سبيل المثال، إعادة تسمية عمود)، فسيستمر الجدول في تلقي التحديثات (تتم عملية insertion حسب الموضع).
محرك قاعدة البيانات هذا تجريبي. لاستخدامه، اضبط
allow_experimental_database_materialized_postgresql على 1 في configuration files أو باستخدام الأمر SET:إنشاء قاعدة بيانات
host:port— نقطة نهاية خادم PostgreSQL.database— اسم قاعدة بيانات PostgreSQL.user— اسم مستخدم PostgreSQL.password— كلمة مرور المستخدم.
مثال للاستخدام
إضافة جداول جديدة إلى النسخ المتماثل بشكل ديناميكي
MaterializedPostgreSQL، فإنها لا تكتشف تلقائيًا الجداول الجديدة في قاعدة بيانات PostgreSQL المقابلة. ويمكن إضافة هذه الجداول يدويًا:
إزالة الجداول من النسخ المتماثل ديناميكيًا
مخطط PostgreSQL
- مخطط واحد لكل محرك قاعدة بيانات
MaterializedPostgreSQL. يتطلب ذلك استخدام الإعدادmaterialized_postgresql_schema. يتم الوصول إلى الجداول باستخدام اسم الجدول فقط:
- أي عدد من المخططات مع مجموعة جداول محددة لمحرك قاعدة بيانات
MaterializedPostgreSQLواحد. يتطلب ذلك استخدام الإعدادmaterialized_postgresql_tables_list. يُذكر كل جدول مع المخطط التابع له. يتم الوصول إلى الجداول باستخدام اسم المخطط واسم الجدول في الوقت نفسه:
materialized_postgresql_tables_list مع اسم الـ مخطط الخاص بها.
يتطلب ذلك materialized_postgresql_tables_list_with_schema = 1.
تحذير: في هذه الحالة، لا يُسمح بوجود نقاط في اسم الجدول.
- أي عدد من الـ مخططات مع المجموعة الكاملة من الجداول لمحرك قاعدة البيانات
MaterializedPostgreSQLواحد. يتطلب ذلك استخدام الإعدادmaterialized_postgresql_schema_list.
المتطلبات
-
يجب أن تكون قيمة إعداد wal_level هي
logical، وأن تكون قيمة المَعلمةmax_replication_slotsفي ملف إعدادات PostgreSQL2على الأقل. - يجب أن يتضمن كل جدول مكرّر أحد خيارات هوية النسخة المتماثلة التالية:
- المفتاح الأساسي (افتراضيًا)
- فهرس
لا يدعم النسخ المتماثل لقيم 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، فسيُسمح بإعداد عدة جداول MaterializedPostgreSQL تشير إلى جدول PostgreSQL نفسه.
materialized_postgresql_use_extended_date_and_time_types
date وtimestamp/timestamptz بالنوعين Date32 وDateTime64 في ClickHouse، لأنهما يغطيان نطاق القيم الأوسع لهذه الأنواع في PostgreSQL. القيمة الافتراضية: 1.
إذا ضُبط على 0، فستُستخدم بدلًا من ذلك الأنواع الأضيق Date وDateTime (إذ لا يمكن تمثيل القيم الواقعة خارج نطاقها أو التي تتضمن دقة أجزاء من الثانية).
لا يتحكم هذا الإعداد إلا في أنواع الأعمدة التي يحددها استنتاج النوع عند إنشاء الجداول المتداخلة، لذا يجب تحديده عند تنفيذ CREATE DATABASE. ولا يمكن تغييره بعد ذلك باستخدام ALTER DATABASE ... MODIFY SETTING (إذ تحتفظ الجداول المتداخلة التي أُنشئت بالفعل بأنواع أعمدتها الثابتة، ويُرفض مثل هذا التغيير)؛ أعد إنشاء قاعدة البيانات لتغييره. ولا ينطبق هذا على محرك الجداول MaterializedPostgreSQL، حيث تُصرَّح أنواع الأعمدة صراحةً.
ملاحظات
التبديل عند الفشل لفتحة النسخ المنطقي
materialized_postgresql_replication_slot، ويجب تصديرها باستخدام الخيار EXPORT SNAPSHOT. كما يجب تمرير معرّف اللقطة عبر الإعداد materialized_postgresql_snapshot.
يرجى ملاحظة أن هذا يجب استخدامه فقط عند الحاجة الفعلية إليه. إذا لم تكن هناك حاجة حقيقية لذلك أو فهم واضح لسببه، فمن الأفضل السماح لـ table engine بإنشاء فتحة النسخ المتماثل الخاصة به وإدارتها.
مثال (من @bchrobot)
-
هيّئ فتحة النسخ المتماثل في PostgreSQL.
-
انتظر حتى تصبح فتحة النسخ المتماثل جاهزة، ثم ابدأ معاملة وصدّر معرّف لقطة المعاملة:
-
في ClickHouse، أنشئ database:
-
أنهِ معاملة PostgreSQL بمجرد تأكيد النسخ إلى ClickHouse DB. تحقّق من أن النسخ يستمر بعد التبديل عند الفشل:
الأذونات المطلوبة
- CREATE PUBLICATION — امتياز إنشاء الاستعلام.
- CREATE_REPLICATION_SLOT — امتياز النسخ المتماثل.
- pg_drop_replication_slot — امتياز النسخ المتماثل أو superuser.
-
DROP PUBLICATION — مالك publication (أي
usernameفي engine MaterializedPostgreSQL نفسه).
2 و3 وتجنّب الحاجة إلى هذه الأذونات. استخدم الإعدادين materialized_postgresql_replication_slot وmaterialized_postgresql_snapshot، ولكن بحذر شديد.
الوصول إلى الجداول:
- pg_publication
- pg_replication_slots
- pg_publication_tables
النسخ الاحتياطي والاستعادة
MaterializedPostgreSQL. تُخزَّن بيانات كل جدول مُكرَّر في جدول ReplacingMergeTree متداخل، لذلك يشمل الأمر BACKUP DATABASE هذه البيانات عبر التفويض إلى الجدول المتداخل.
MaterializedPostgreSQL في موضعه غير مدعومة. إذ يبدأ كائن MaterializedPostgreSQL المستعاد فورًا في النسخ المتماثل من مصدر PostgreSQL المباشر، لذا فإن استعادة لقطة من النسخة الاحتياطية فوقه ستؤدي إلى خلط اللقطة بالحالة الحالية للمصدر البعيد. لذلك تفشل عملية RESTORE عمدًا في هذه الحالة. بدلاً من ذلك، استعد البيانات الملتقطة إلى جداول ReplacingMergeTree عادية:
-
في نسخة احتياطية لقاعدة بيانات، يكون التعريف المخزن لكل جدول هو بالفعل جدول
ReplacingMergeTreeالمتداخل الاصطناعي (وليس المحركMaterializedPostgreSQL)، لذلك يمكن استعادة كل جدول مباشرةً إلى جدول جديد غير موجود بعد: -
بالنسبة إلى نسخة احتياطية لجدول
MaterializedPostgreSQLمستقل، يكون التعريف المخزن هو المحركMaterializedPostgreSQLنفسه. أنشئ مسبقًا جدولReplacingMergeTreeبالبنية نفسها الخاصة بالجدول المتداخل (بما في ذلك العمودان_signو_version) ثم استعد البيانات إليه: