هل يتم نسخ المعاملات التي تم التراجع عنها إلى ClickHouse؟
هل يمكنني الاحتفاظ بالبيانات في ClickHouse لمدة أطول من الاحتفاظ بها في Postgres المصدر؟
كيف يمكنني إثراء البيانات أثناء تدفقها من Postgres إلى ClickHouse؟
هل يمكنني إجراء النسخ المتماثل من عدة مثيلات Postgres إلى خدمة ClickHouse واحدة أو أكثر؟
كيف تؤثر حالة الخمول في ClickPipe لـ Postgres CDC الخاص بي؟
كيف يتعامل ClickPipes for Postgres مع أعمدة TOAST؟
كيف يُتعامَل مع الأعمدة المُولَّدة في ClickPipes for Postgres؟
هل يجب أن تحتوي الجداول على مفاتيح أساسية لتكون جزءًا من Postgres CDC؟
- المفتاح الأساسي: أبسط نهج هو تعريف مفتاح أساسي للجدول. يوفّر ذلك معرّفًا فريدًا لكل صف، وهو أمر بالغ الأهمية لتتبّع التحديثات وعمليات الحذف. في هذه الحالة، يمكنك ضبط REPLICA IDENTITY على
DEFAULT(السلوك الافتراضي). - replica identity: إذا لم يكن للجدول مفتاح أساسي، فيمكنك تعيين replica identity. ويمكن ضبط replica identity على
FULL، ما يعني استخدام الصف بالكامل لتحديد التغييرات. وبدلًا من ذلك، يمكنك ضبطها لاستخدام فهرس فريد إذا كان موجودًا على الجدول، ثم تعيين REPLICA IDENTITY إلىUSING INDEX index_name. لتعيين replica identity إلى FULL، يمكنك استخدام أمر SQL التالي:
REPLICA IDENTITY FULL أيضًا تكرار أعمدة TOAST غير المتغيرة. المزيد حول ذلك هنا.
لاحظ أن استخدام REPLICA IDENTITY FULL قد يؤثر في الأداء، وقد يؤدي أيضًا إلى زيادة أسرع في WAL، خاصةً للجداول التي لا تحتوي على مفتاح أساسي وتشهد تحديثات أو عمليات حذف متكررة، إذ يتطلب ذلك تسجيل مزيد من البيانات لكل تغيير. إذا كانت لديك أي استفسارات أو كنت بحاجة إلى مساعدة في إعداد المفاتيح الأساسية أو replica identity لجداولك، فيرجى التواصل مع فريق الدعم لدينا للحصول على الإرشادات.
من المهم ملاحظة أنه إذا لم يتم تعريف مفتاح أساسي أو replica identity، فلن يتمكن ClickPipes من تكرار التغييرات لهذا الجدول، وقد تواجه أخطاء أثناء عملية التكرار. لذلك، يُنصح بمراجعة مخططات الجداول لديك والتأكد من أنها تستوفي هذه المتطلبات قبل إعداد ClickPipe.
هل تدعمون الجداول المُقسَّمة كجزء من Postgres CDC؟
هل يمكنني الاتصال بقواعد بيانات Postgres التي لا تحتوي على عنوان IP عام أو الموجودة ضمن شبكات خاصة؟
كيف يتم التعامل مع UPDATEs وDELETEs؟
_peerdb_) في ClickHouse. ويجري محرك الجدول ReplacingMergeTree إزالة التكرار دوريًا في الخلفية استنادًا إلى مفتاح الترتيب (أعمدة ORDER BY)، مع الاحتفاظ فقط بالصف ذي أحدث إصدار من _peerdb_.
تُمرَّر DELETEs من Postgres كصفوف جديدة مُعلَّمة بأنها محذوفة (باستخدام العمود _peerdb_is_deleted). ونظرًا لأن عملية إزالة التكرار غير متزامنة، فقد تظهر لك تكرارات بشكل مؤقت. ولمعالجة ذلك، عليك التعامل مع إزالة التكرار على مستوى الاستعلام.
لاحظ أيضًا أنه، افتراضيًا، لا يرسل Postgres قيم الأعمدة التي لا تكون جزءًا من المفتاح الأساسي أو من REPLICA IDENTITY أثناء عمليات DELETE. وإذا كنت تريد التقاط بيانات الصف كاملة أثناء DELETEs، فيمكنك ضبط REPLICA IDENTITY على FULL.
لمزيد من التفاصيل، راجع:
- أفضل الممارسات لمحرك الجدول ReplacingMergeTree
- مدونة حول الجوانب الداخلية لـ CDC من Postgres إلى ClickHouse
هل يمكنني تحديث أعمدة المفتاح الأساسي في PostgreSQL؟
هل تدعمون تغييرات المخطط؟
ما هي تكاليف ClickPipes for Postgres CDC؟
حجم فتحة النسخ المتماثل لديّ يزداد أو لا ينخفض؛ فما السبب المحتمل؟
-
ارتفاعات مفاجئة في نشاط قاعدة البيانات
- قد تؤدي التحديثات الكبيرة على دفعات، وعمليات الإدراج المجمّعة، أو تغييرات المخطط الكبيرة إلى توليد كمية كبيرة من بيانات WAL بسرعة.
- تحتفظ فتحة النسخ المتماثل بسجلات WAL هذه إلى أن يتم استهلاكها، مما يؤدي إلى زيادة مؤقتة في الحجم.
-
المعاملات طويلة الأمد
- تُجبر المعاملة المفتوحة Postgres على الاحتفاظ بجميع مقاطع WAL التي تم إنشاؤها منذ بدء المعاملة، ما قد يزيد حجم الفتحة بشكل كبير.
- اضبط
statement_timeoutوidle_in_transaction_session_timeoutعلى قيم معقولة لمنع بقاء المعاملات مفتوحة إلى أجل غير مسمى:استخدم هذا الاستعلام لتحديد المعاملات التي تستغرق وقتًا أطول من المعتاد.
-
عمليات الصيانة أو الأدوات المساعدة (مثل
pg_repack)- يمكن لأدوات مثل
pg_repackإعادة كتابة جداول كاملة، مما يولّد كميات كبيرة من بيانات WAL خلال فترة قصيرة. - جدوِل هذه العمليات خلال فترات انخفاض حركة المرور، أو راقب استخدام WAL عن كثب أثناء تشغيلها.
- يمكن لأدوات مثل
-
VACUUM و VACUUM ANALYZE
- رغم أن هذه العمليات ضرورية لصحة قاعدة البيانات، فإنها قد تولّد حركة WAL إضافية، خاصةً إذا كانت تفحص جداول كبيرة.
- فكّر في استخدام معلمات ضبط
autovacuumأو جدولة عمليات VACUUM اليدوية خلال ساعات انخفاض الحمل.
-
مستهلك النسخ المتماثل لا يقرأ من الفتحة بشكل نشط
- إذا توقّف مسار CDC لديك (مثل ClickPipes) أو أي مستهلك نسخ متماثل آخر، أو توقّف مؤقتًا، أو تعطّل، فستتراكم بيانات WAL في الفتحة.
- تأكد من أن المسار قيد التشغيل باستمرار، وتحقق من السجلات بحثًا عن أخطاء الاتصال أو المصادقة.
كيف تُطابَق أنواع بيانات Postgres مع ClickHouse؟
هل يمكنني تحديد تعيين أنواع البيانات الخاص بي عند نسخ البيانات من Postgres إلى ClickHouse؟
كيف تُنسخ أعمدة json وjsonb من Postgres؟
json وjsonb بنوع String في ClickHouse بسبب عدم التوافق مع نوع JSON الأصلي. على سبيل المثال:
- يتيح PostgreSQL أي قيمة JSON صالحة في المستوى الأعلى (سلاسل نصية أو أرقام أو مصفوفات)، بينما لا يدعم نوع JSON في ClickHouse إلا الكائنات.
- كما أن المفاتيح التي تحتوي على نقاط (مثل
"app.kubernetes.io/name") تُفسَّر على أنها مسارات متداخلة في نوع JSON لدى ClickHouse، مما قد يغيّر بنية البيانات.
ماذا يحدث لعمليات الإدراج عندما يتم إيقاف mirror مؤقتًا؟
- بالنسبة إلى المزامنة، إذا أُلغيت في منتصف الطريق، فلن تتقدم قيمة confirmed_flush_lsn في Postgres، لذا ستبدأ المزامنة التالية من الموضع نفسه الذي بدأت منه المزامنة المُجهضة، مما يضمن اتساق البيانات.
- بالنسبة إلى التطبيع، يتكفّل ترتيب عمليات insert في ReplacingMergeTree بإزالة التكرار.
هل يمكن أتمتة إنشاء ClickPipe أو تنفيذه عبر واجهة برمجة تطبيقات أو CLI؟
كيف أُسرّع التحميل الأولي؟
snapshot number of tables in parallel أو تحديد عمود تقسيم مخصّص ومفهرس للجداول الكبيرة.
كيف ينبغي أن أحدّد نطاق منشوراتي عند إعداد النسخ المتماثل؟
REPLICA IDENTITY FULL. وإذا كانت لديك جداول بلا مفتاح أساسي، فإن إنشاء منشور يشمل جميع الجداول سيؤدي إلى فشل عمليتَي DELETE وUPDATE على تلك الجداول.
لتحديد الجداول التي لا تحتوي على مفاتيح أساسية في قاعدة بياناتك، يمكنك استخدام هذا الاستعلام:
-
استبعاد الجداول التي لا تحتوي على مفتاح أساسي من ClickPipes:
أنشئ الـ منشور بحيث تقتصر على الجداول التي لديها مفتاح أساسي:
-
تضمين الجداول التي لا تحتوي على مفتاح أساسي في ClickPipes:
إذا كنت تريد تضمين الجداول التي لا تحتوي على مفتاح أساسي، فعليك تعديل replica identity الخاصة بها إلى
FULL. وهذا يضمن عمل عمليتَي UPDATE وDELETE بشكل صحيح:
إعدادات max_slot_wal_keep_size الموصى بها
- كحد أدنى: اضبط
max_slot_wal_keep_sizeللاحتفاظ بما لا يقل عن بيانات WAL لمدة يومين. - لقواعد البيانات الكبيرة (ذات حجم معاملات مرتفع): احتفظ بما لا يقل عن ضعفين إلى ثلاثة أضعاف ذروة توليد WAL يوميًا.
- للبيئات المقيّدة من حيث التخزين: اضبط هذه القيمة بحذر لتجنّب نفاد مساحة القرص مع ضمان استقرار النسخ المتماثل.
كيفية حساب القيمة المناسبة
لإصدارات PostgreSQL 10 والأحدث
بالنسبة إلى PostgreSQL 9.6 وما دونه:
- شغّل الاستعلام أعلاه في أوقات مختلفة من اليوم، لا سيّما خلال الفترات التي تزداد فيها المعاملات.
- احسب مقدار WAL الذي يتم توليده خلال كل فترة تمتد 24 ساعة.
- اضرب هذا الرقم في 2 أو 3 لضمان احتفاظ كافٍ.
- اضبط
max_slot_wal_keep_sizeعلى القيمة الناتجة بوحدة MB أو GB.
مثال
أرى خطأ ReceiveMessage EOF في السجلات. ماذا يعني ذلك؟
ReceiveMessage دالة في بروتوكول Postgres لفك الترميز المنطقي، وتقرأ الرسائل من دفق النسخ المتماثل. ويشير خطأ EOF (نهاية الملف) إلى أن الاتصال بخادم Postgres أُغلِق بشكل غير متوقع أثناء محاولة القراءة من دفق النسخ المتماثل.
هذا خطأ يمكن التعافي منه، وليس خطأً جسيمًا على الإطلاق. سيحاول ClickPipes تلقائيًا إعادة الاتصال واستئناف عملية النسخ المتماثل.
قد يحدث ذلك لعدة أسباب:
- مشكلات الشبكة: قد تتسبب انقطاعات الشبكة المؤقتة في انقطاع الاتصال.
- إعادة تشغيل خادم Postgres: إذا أُعيد تشغيل خادم Postgres أو تعطّل، فسيُفقد الاتصال.
أصبحت فتحة النسخ المتماثل الخاصة بي غير صالحة. ماذا ينبغي أن أفعل؟
max_slot_wal_keep_size في قاعدة بيانات PostgreSQL لديك (على سبيل المثال، بضع غيغابايتات). نوصي بزيادة هذه القيمة. راجِع هذا القسم لمعرفة كيفية ضبط max_slot_wal_keep_size. ومن الناحية المثالية، ينبغي ضبطه على 200GB على الأقل لمنع فقدان صلاحية فتحة النسخ المتماثل.
في حالات نادرة، لاحظنا حدوث هذه المشكلة حتى عندما لا يكون max_slot_wal_keep_size مُعدًّا. وقد يرجع ذلك إلى خطأ نادر ومعقّد في PostgreSQL، رغم أن السبب لا يزال غير واضح.
أواجه حالات نفاد في الذاكرة (OOMs) على ClickHouse أثناء قيام ClickPipe بإدخال البيانات. هل يمكنكم المساعدة؟
-
من أساليب التحسين الشائعة لعمليات
JOINأنه إذا كان لديكLEFT JOINوكان الجدول الموجود على الجانب الأيمن كبيرًا جدًا، فأعِد كتابة الاستعلام لاستخدامRIGHT JOINوانقل الجدول الأكبر إلى الجانب الأيسر. يتيح ذلك لمُخطِّط الاستعلام العمل بكفاءة أعلى في استخدام الذاكرة. -
ومن أساليب التحسين الأخرى لعمليات
JOINتصفية الجداول صراحةً باستخدامsubqueriesأوCTEsثم تنفيذJOINعلى هذه الاستعلامات الفرعية. يزوّد هذا مُخطِّط الاستعلام بإشارات تساعده على تصفية الصفوف بكفاءة وتنفيذJOIN.
أواجه الخطأ invalid snapshot identifier أثناء التحميل الأولي. ماذا ينبغي أن أفعل؟
invalid snapshot identifier عند انقطاع الاتصال بين ClickPipes وقاعدة بيانات Postgres الخاصة بك. وقد يحدث ذلك بسبب انتهاء مهلة البوابة، أو إعادة تشغيل قاعدة البيانات، أو مشكلات عابرة أخرى.
يُوصى بألّا تُجري أي عمليات قد تسبب انقطاعًا، مثل الترقيات أو إعادة التشغيل، على قاعدة بيانات Postgres أثناء تقدّم التحميل الأولي، مع التأكد من أن اتصال الشبكة بقاعدة البيانات مستقر.
لحل هذه المشكلة، يمكنك تشغيل إعادة المزامنة من واجهة مستخدم ClickPipes. سيؤدي ذلك إلى إعادة بدء عملية التحميل الأولي من البداية.
ماذا يحدث إذا حذفتُ منشور في Postgres؟
منشور في Postgres إلى قطع اتصال ClickPipe، لأن منشور مطلوبة لكي يتمكّن ClickPipe من سحب التغييرات من المصدر. وعند حدوث ذلك، ستتلقى عادةً تنبيهًا بالخطأ يفيد بأن منشور لم تعد موجودة.
لاستعادة ClickPipe بعد حذف منشور:
- أنشئ
منشورجديدة بالاسم نفسه والجداول المطلوبة في Postgres - انقر على زر ‘Resync tables’ في علامة التبويب Settings الخاصة بـ ClickPipe
منشور التي أُعيد إنشاؤها سيكون لها معرّف كائن (OID) مختلف في Postgres، حتى إذا كان اسمها هو نفسه. وتعمل عملية إعادة المزامنة على تحديث جداول الوجهة واستعادة الاتصال.
بدلًا من ذلك، يمكنك إنشاء pipe جديدة بالكامل إذا كنت تفضّل ذلك.
لاحظ أنه إذا كنت تعمل مع جداول مُقسّمة إلى partition، فتأكّد من إنشاء منشور بالإعدادات المناسبة:
ماذا لو كنت أرى أخطاء Unexpected Datatype أو Cannot parse type XX ...
تظهر لي أخطاء مثل invalid memory alloc request size <XXX> أثناء النسخ المتماثل/إنشاء الـslot
أحتاج إلى الاحتفاظ بسجل تاريخي كامل في ClickHouse، حتى عند حذف البيانات من قاعدة بيانات Postgres المصدر. هل يمكنني تجاهل عمليتَي DELETE وTRUNCATE من Postgres تمامًا في ClickPipes؟
لماذا يتعذّر عليّ إجراء النسخ المتماثل لجدولي الذي يحتوي على نقطة؟
اكتمل التحميل الأولي، ولكن لا توجد بيانات/توجد بيانات مفقودة في ClickHouse. ما السبب المحتمل؟
- ما إذا كان المستخدم يملك الأذونات الكافية لقراءة جداول المصدر.
- ما إذا كانت هناك سياسات صفوف على جانب ClickHouse قد تؤدي إلى تصفية بعض الصفوف.
هل يمكنني جعل ClickPipe ينشئ فتحة النسخ المتماثل مع تمكين failover؟
Advanced Settings أثناء إنشاء ClickPipe. لاحظ أن إصدار Postgres لديك يجب أن يكون 17 أو أحدث لاستخدام هذه الميزة.
إذا كان المصدر مُهيّأً وفقًا لذلك، فستظل فتحة النسخ المتماثل محفوظة بعد عمليات failover إلى replica قراءة في Postgres، مما يضمن استمرار نسخ البيانات المتماثل. تعرّف على المزيد هنا.
أرى أخطاءً مثل Internal error encountered during logical decoding of aborted sub-transaction
ReorderBufferPreserveLastSpilledSnapshot، فهذا يشير إلى أن فك الترميز المنطقي غير قادر على قراءة اللقطة التي جرى تفريغها إلى القرص. قد يكون من المفيد محاولة زيادة قيمة logical_decoding_work_mem إلى مستوى أعلى.
أرى أخطاءً مثل error converting new tuple to map أو error parsing logical message أثناء النسخ المتماثل لـ CDC
هل يمكنني تضمين الأعمدة التي استبعدتها في البداية من النسخ المتماثل؟
ألاحظ أن ClickPipe الخاص بي قد دخل في حالة Snapshot، لكن البيانات لا تتدفق؛ فما السبب المحتمل؟
يستغرق التقاط اللقطات المتوازي وقتًا للحصول على التقسيمات
إنشاء فتحة النسخ المتماثل محجوب بسبب معاملة
CREATE_REPLICATION_SLOT عالقًا في الحالة Lock. وقد يحدث ذلك بسبب معاملة أخرى تحتفظ بأقفال على كائنات يستخدمها Postgres لإنشاء فتحات النسخ المتماثل.
وللاطّلاع على الاستعلامات المتسببة في الحظر، يمكنك تشغيل الاستعلام أدناه على مصدر Postgres لديك: