من Kafka إلى ClickHouse
إذا كنت تستخدم ClickHouse Cloud، فننصحك باستخدام ClickPipes بدلاً منه. يوفّر ClickPipes دعمًا أصليًا لاتصالات الشبكة الخاصة، ولتوسيع موارد الإدخال وموارد العنقود بشكل مستقل، ولمراقبة شاملة لإدخال بيانات Kafka المتدفقة إلى ClickHouse.
نظرة عامة
TO وجهة البيانات، والتي تكون عادةً جدولًا من عائلة MergeTree. يوضّح الشكل التالي هذه العملية:
الخطوات
1. التحضير
2. تهيئة ClickHouse
conf.d/، أو أن تدمجه في ملفات الإعدادات الحالية. للاطلاع على الإعدادات التي يمكن ضبطها، راجع هنا.
سننشئ أيضًا قاعدة بيانات باسم KafkaEngine لاستخدامها في هذا الدليل العملي:
3. أنشئ جدول الوجهة
4. إنشاء الـ topic وتعبئته
github مع 5 partitions عبر تشغيل الأمر التالي:
5. إنشاء محرك جدول Kafka
JSONEachRow كنوع البيانات لاستهلاك JSON من Kafka topic. وتمثل القيمتان github وclickhouse اسمي الـ topic ومجموعة المستهلكين، على التوالي. ويمكن أن تكون الـ topics في الواقع قائمة من القيم.
SELECT بسيط على الجدول github_queue بعض الصفوف. لاحظ أن هذا سيُقدّم إزاحات المستهلك إلى الأمام، مما يمنع إعادة قراءة هذه الصفوف دون إعادة تعيين. لاحظ القيد والمعلَمة المطلوبة stream_like_engine_allow_direct_select.
6. أنشئ العرض المادي
7. تأكّد من إدراج الصفوف
العمليات الشائعة
إيقاف استهلاك الرسائل & إعادة تشغيله
إضافة البيانات الوصفية لـ Kafka
_.
يمكن العثور على قائمة كاملة بالأعمدة الافتراضية هنا.
لتحديث جدولنا بالأعمدة الافتراضية، سنحتاج إلى حذف العرض المادي، ثم إعادة إرفاق جدول محرك Kafka، ثم إعادة إنشاء العرض المادي.
تعديل إعدادات محرك Kafka
استكشاف المشكلات وإصلاحها
التعامل مع الرسائل غير السليمة
- تعامل مع حقل الرسالة على أنه سلاسل نصية. ويمكن استخدام الدوال في عبارة
materialized viewلإجراء التنظيف وCAST عند الحاجة. لا ينبغي أن يُعدّ هذا حلًا لبيئة production، لكنه قد يساعد في الإدخال لمرة واحدة. - إذا كنت تستهلك JSON من topic، باستخدام التنسيق JSONEachRow، فاستخدم الإعداد
input_format_skip_unknown_fields. عند كتابة البيانات، يرفع ClickHouse افتراضيًا استثناءً إذا كانت بيانات الإدخال تحتوي على أعمدة غير موجودة في الجدول الهدف. ومع ذلك، إذا كان هذا الخيار مفعّلًا، فسيتم تجاهل هذه الأعمدة الزائدة. ومرة أخرى، لا يُعدّ هذا حلًا على مستوى production وقد يسبب التباسًا للآخرين. - ضع في اعتبارك الإعداد
kafka_skip_broken_messages. يتطلب هذا من المستخدم تحديد مستوى التحمّل لكل كتلة تجاه الرسائل غير السليمة، وذلك في سياق kafka_max_block_size. وإذا تم تجاوز هذا التحمّل (ويُقاس بعدد الرسائل المطلق)، فسيعود سلوك الاستثناء المعتاد، وسيتم تخطي الرسائل الأخرى.
دلالات التسليم والتحديات المرتبطة بالتكرارات
عمليات الإدراج القائمة على النصاب
ClickHouse إلى Kafka
الخطوات
1. إدراج الصفوف مباشرةً
2. استخدام العروض المادية
github_out أو ما يعادله. وتأكد من أن محرك جدول Kafka باسم github_out_queue يشير إلى هذا الـ topic.
github_out_mv يشير إلى جدول GitHub، بحيث يُدرِج الصفوف في المحرّك المذكور أعلاه عند تفعيله. ونتيجةً لذلك، ستُدفَع الإضافات إلى جدول GitHub إلى Kafka topic الجديد لدينا.
github_out وصول الرسائل.
العناقيد والأداء
العمل مع عناقيد ClickHouse
ضبط الأداء
- يختلف الأداء بحسب حجم الرسائل، والتنسيق، وأنواع الجداول المستهدفة. ويمكن اعتبار 100 ألف صف/ثانية على table engine واحد معدلًا يمكن تحقيقه. افتراضيًا، تُقرأ الرسائل على شكل كتل، ويتحكم في ذلك المعلَمة kafka_max_block_size. افتراضيًا، تُضبط هذه القيمة على max_insert_block_size، وقيمتها الافتراضية 1,048,576. وما لم تكن الرسائل كبيرة جدًا، فمن الأفضل تقريبًا دائمًا زيادة هذه القيمة. كما أن القيم بين 500 ألف ومليون ليست غير شائعة. اختبر هذا وقيّم أثره في أداء معدل النقل.
- يمكن زيادة عدد المستهلكين لمحرك الجدول باستخدام kafka_num_consumers. لكن افتراضيًا، ستُسلسل عمليات الإدراج في thread واحد ما لم يتم تغيير kafka_thread_per_consumer عن القيمة الافتراضية 1. اضبطه على 1 لضمان تنفيذ عمليات التفريغ بالتوازي. لاحظ أن إنشاء جدول Kafka engine بعدد N من المستهلكين (ومع kafka_thread_per_consumer=1) يكافئ منطقيًا إنشاء N من Kafka engines، لكل منها materialized view وkafka_thread_per_consumer=0.
- زيادة عدد المستهلكين ليست بلا تكلفة. إذ يحتفظ كل مستهلك بمخازنه المؤقتة وthreads الخاصة به، مما يزيد الحمل الإضافي على الخادم. لذلك، انتبه إلى الحمل الإضافي الناتج عن المستهلكين، ووسّع أفقيًا عبر عنقود أولًا إن أمكن.
- إذا كان معدل نقل رسائل Kafka متغيرًا وكانت التأخيرات مقبولة، ففكّر في زيادة stream_flush_interval_ms لضمان تفريغ كتل أكبر.
- يحدّد background_message_broker_schedule_pool_size عدد threads التي تنفّذ tasks في الخلفية. وتُستخدم هذه threads في Kafka streaming. يُطبَّق هذا الإعداد عند بدء تشغيل ClickHouse server ولا يمكن تغييره ضمن session للمستخدم، وقيمته الافتراضية 16. إذا رأيت حالات timeout في السجلات، فقد يكون من المناسب زيادة هذه القيمة.
- في الاتصال مع Kafka، تُستخدم مكتبة librdkafka، وهي بدورها تنشئ threads. لذلك، قد يؤدي العدد الكبير من جداول Kafka أو المستهلكين إلى عدد كبير من عمليات تبديل السياق. وزّع هذا الحمل عبر عنقود، مع الاكتفاء بتكرار الجداول المستهدفة فقط إن أمكن، أو فكّر في استخدام محرك جدول للقراءة من topics متعددة، إذ إن قائمة من القيم مدعومة. كما يمكن قراءة عدة materialized views من جدول واحد، بحيث يرشّح كلٌّ منها البيانات الخاصة بـ topic معيّن.
إعدادات إضافية
- Kafka_max_wait_ms - مدة الانتظار بالمللي ثانية لقراءة الرسائل من Kafka قبل إعادة المحاولة. يُضبط هذا الإعداد على مستوى profile المستخدم، وتكون قيمته الافتراضية 5000.