استراتيجية التشغيل المتوازي
- أدنى قدر من المخاطر: من خلال تشغيل النظامين بالتوازي، تحافظ على إمكانية الوصول إلى البيانات الحالية ولوحات المعلومات، مع اختبار ClickStack وتعويد المستخدمين على النظام الجديد.
- انقضاء البيانات بشكل طبيعي: تكون لمعظم بيانات رصد مدة احتفاظ محدودة (عادةً 30 يومًا أو أقل)، مما يتيح انتقالًا طبيعيًا مع انقضاء البيانات من Elastic.
- ترحيل أكثر بساطة: لا حاجة إلى أدوات أو عمليات معقدة لنقل البيانات التاريخية بين الأنظمة.
ترحيل البياناتنعرض نهجًا لترحيل البيانات الأساسية من Elasticsearch إلى ClickHouse في قسم “ترحيل البيانات”. لا ينبغي استخدام هذا النهج مع مجموعات البيانات الكبيرة، لأنه نادرًا ما يوفّر أداءً جيدًا، إذ تحدّه قدرة Elasticsearch على التصدير بكفاءة، مع دعم تنسيق JSON فقط.
خطوات التنفيذ
تهيئة الإدخال المزدوج
اضبط pipeline جمع البيانات لديك لإرسال البيانات إلى كلٍّ من Elastic وClickStack في الوقت نفسه.وتعتمد طريقة تنفيذ ذلك على الوكلاء الذين تستخدمهم حاليًا لعملية الجمع — راجع “ترحيل الوكلاء”.التحقق والمقارنة
- شغّل استعلامات على كلا النظامين للتأكد من اتساق البيانات
- قارن أداء الاستعلامات والنتائج
- انقل لوحات المعلومات والتنبيهات إلى ClickStack. هذه العملية يدوية حاليًا.
- تحقّق من أن جميع لوحات المعلومات والتنبيهات المهمة تعمل كما هو متوقع في ClickStack
الانتقال التدريجي
- مع انتهاء صلاحية البيانات في Elastic بشكل طبيعي، ستعتمد تدريجيًا على ClickStack بصورة أكبر
- وبعد ترسخ الثقة في ClickStack، يمكنك البدء في إعادة توجيه الاستعلامات ولوحات المعلومات
الاحتفاظ طويل الأمد
- واصل تشغيل النظامين بالتوازي إلى أن تنتهي مدة احتفاظ جميع البيانات في Elastic
- يمكن أن تساعد إمكانات ClickStack الخاصة بـالتخزين المتدرج في إدارة البيانات طويلة الأمد بكفاءة.
- فكّر في استخدام العروض المادية للاحتفاظ بالبيانات التاريخية المجمّعة أو المُرشَّحة، مع السماح بانتهاء صلاحية البيانات الخام.
الجدول الزمني للترحيل
- الاحتفاظ لمدة 30 يومًا: يمكن إتمام الترحيل خلال شهر.
- الاحتفاظ لمدة أطول: استمر في التشغيل المتوازي حتى تنقضي مدة الاحتفاظ بالبيانات في Elastic.
- البيانات التاريخية: إذا كانت هناك ضرورة قصوى، ففكّر في استخدام ترحيل البيانات لاستيراد بيانات تاريخية محددة.
ترحيل الإعدادات
الإعدادات الموصى بها
- ClickHouse Cloud: يستخدم افتراضيًا معمارية shard واحد مع عدة نسخ متماثلة. ويتوسّع كل من التخزين والقدرة الحاسوبية بشكل مستقل، مما يجعله مثاليًا لحالات استخدام رصد ذات أنماط استيعاب غير متوقعة وأعباء العمل التي تتركز على القراءة.
- ClickHouse OSS: في عمليات النشر المُدارة ذاتيًا، نوصي بما يلي:
- البدء بـ shard واحد
- التوسّع رأسيًا بإضافة CPU وRAM
- استخدام تخزين متدرج لتوسيع القرص المحلي باستخدام تخزين كائنات متوافق مع S3
- استخدام
ReplicatedMergeTreeإذا كان التوافر العالي مطلوبًا - لتحقيق تحمّل الأعطال، تكون نسخة متماثلة واحدة من الـ shard كافية عادةً في أعباء عمل رصد.
متى تحتاج إلى التجزئة
- تجاوز معدل إدخال البيانات لديك سعة عقدة واحدة (عادةً >500K صف/ثانية)
- كنت بحاجة إلى عزل المستأجرين أو فصل البيانات حسب المنطقة
- كانت مجموعة بياناتك الإجمالية كبيرة جدًا بالنسبة إلى خادم واحد، حتى مع تخزين الكائنات
الاحتفاظ بالبيانات وTTL
- تحذف البيانات منتهية الصلاحية تلقائيًا
- تنقل البيانات الأقدم إلى تخزين كائني بارد
- تحتفظ فقط بالسجلات الحديثة كثيرة الاستعلام على قرص سريع
ترحيل البيانات
- جداول بحث صغيرة تُستخدم في إثراء البيانات (مثل تعيينات المستخدمين وكتالوجات الخدمات)
- بيانات أعمال مخزنة في Elasticsearch تحتاج إلى ربطها ببيانات الرصد، إذ تجعل إمكانات SQL في ClickHouse وتكاملات ذكاء الأعمال صيانة البيانات والاستعلام عنها أسهل مقارنةً بخيارات الاستعلام الأكثر محدودية في Elasticsearch.
- بيانات التهيئة التي يجب الحفاظ عليها أثناء الترحيل
ترحيل المخطط
أنشئ جدولاً في ClickHouse للفهرس المُراد ترحيله من Elasticsearch. يمكنك تعيين أنواع Elasticsearch إلى ما يقابلها في ClickHouse. وبدلاً من ذلك، يمكنك الاعتماد على نوع بيانات JSON في ClickHouse، الذي سيُنشئ تلقائياً أعمدةً بالنوع المناسب عند إدراج البيانات.خذ بعين الاعتبار تعيين Elasticsearch التالي لفهرس يحتوي على بياناتsyslog:التعيين في Elasticsearch
التعيين في Elasticsearch
مخطط ClickHouse
مخطط ClickHouse
- تُستخدم Tuples لتمثيل الهياكل المتداخلة بدلًا من صيغة النقطة
- استخدم أنواع ClickHouse المناسبة وفقًا للتعيين:
keyword→Stringdate→DateTimeboolean→UInt8long→Int64ip→Array(Variant(IPv4, IPv6)). نستخدمVariant(IPv4, IPv6)هنا لأن الحقل يحتوي على مزيج منIPv4وIPv6.object→JSONلكائن syslog ذي البنية غير المتوقعة.
- العمودان
host.ipوhost.macمن نوعArrayصراحةً، بخلاف Elasticsearch حيث تكون جميع الأنواع مصفوفات. - تُضاف عبارة
ORDER BYباستخدام الطابع الزمني واسم المضيف لتحسين كفاءة الاستعلامات المعتمدة على الوقت - يُستخدم
MergeTree، وهو الأنسب لبيانات السجلات، كنوع المحرّك
- التحقق من صحة البيانات – إن فرض مخطط صارم يتجنب خطر تضخم الأعمدة خارج البُنى المحددة.
- تجنب خطر تضخم الأعمدة: رغم أن نوع JSON يمكن أن يتوسع إلى آلاف الأعمدة المحتملة، حيث تُخزَّن الأعمدة الفرعية كأعمدة مخصصة، فقد يؤدي ذلك إلى تضخم ملفات الأعمدة، إذ يُنشأ عدد مفرط من ملفات الأعمدة بما يؤثر في الأداء. وللتخفيف من ذلك، يوفّر نوع Dynamic الأساسي الذي يستخدمه JSON معامِل
max_dynamic_paths، الذي يحدّ من عدد المسارات الفريدة المخزنة كملفات أعمدة منفصلة. وبمجرد بلوغ الحد، تُخزَّن المسارات الإضافية في ملف أعمدة مشترك باستخدام تنسيق مُرمَّز مضغوط، مما يحافظ على الأداء وكفاءة التخزين مع دعم مرونة استيعاب البيانات. ومع ذلك، فإن الوصول إلى ملف الأعمدة المشترك هذا لا يقدّم المستوى نفسه من الأداء. وتجدر الإشارة أيضًا إلى أنه يمكن استخدام عمود JSON مع تلميحات الأنواع. وستقدّم الأعمدة “المُشار إليها” الأداء نفسه الذي تقدمه الأعمدة المخصصة. - استبطان أبسط للمسارات والأنواع: رغم أن نوع JSON يدعم دوال الاستبطان لتحديد الأنواع والمسارات التي جرى استنتاجها، فإن البُنى الثابتة قد تكون أسهل في الاستكشاف، على سبيل المثال باستخدام
DESCRIBE.
بدلاً من ذلك، يمكنك ببساطة إنشاء جدول يحتوي على عمود
JSON واحد.نوفّر تلميحًا للنوع للعمودين
host.name وtimestamp في تعريف JSON لأننا نستخدمهما في الترتيب/المفتاح الأساسي. يساعد ذلك ClickHouse على معرفة أن هذين العمودين لن تكون قيمتهما null، ويضمن أيضًا معرفة الأعمدة الفرعية التي يجب استخدامها (إذ قد توجد عدة أعمدة فرعية لكل نوع، ما يجعل الأمر ملتبسًا لولا ذلك).JSON فقط للبنى الفرعية الديناميكية عند الضرورة.لمزيد من التفاصيل حول استخدام نوع JSON في المخططات وكيفية تطبيقه بكفاءة، نوصي بالرجوع إلى الدليل “تصميم مخططك”.ثبّت elasticdump
نوصي باستخدام elasticdump لتصدير البيانات من Elasticsearch. تتطلب هذه الأداة node، ويجب تثبيتها على جهاز يتمتع بقرب شبكي من كلٍّ من Elasticsearch وClickHouse. نوصي باستخدام خادم مخصّص يحتوي على 4 أنوية على الأقل و16GB من RAM لمعظم عمليات التصدير.elasticdump عدة مزايا لترحيل البيانات:- يتفاعل مباشرةً مع واجهة برمجة تطبيقات REST الخاصة بـ Elasticsearch، مما يضمن تصدير البيانات على نحو صحيح.
- يحافظ على اتساق البيانات أثناء عملية التصدير باستخدام واجهة برمجة تطبيقات Point-in-Time (PIT) — ما ينشئ لقطة متسقة للبيانات في لحظة زمنية محددة.
- يصدّر البيانات مباشرةً بتنسيق JSON، ويمكن تمريرها كتدفّق إلى
clickhouse clientلإدراجها.
elastic dump جميعها ضمن منطقة التوفّر نفسها أو مركز البيانات نفسه لتقليل حركة البيانات الصادرة عبر الشبكة إلى الحد الأدنى وزيادة معدل النقل إلى الحد الأقصى.تثبيت عميل ClickHouse
تأكد من أنّ ClickHouse مثبّت على الخادم الذي يوجد عليهelasticdump. لا تشغّل خادم ClickHouse — فهذه الخطوات لا تتطلب سوى العميل.دفق البيانات
لدفق البيانات بين Elasticsearch وClickHouse، استخدم الأمرelasticdump مع توجيه المخرجات مباشرةً إلى clickhouse client. يقوم ما يلي بإدراج البيانات في جدولنا المنظَّم جيدًا logs_system_syslog.elasticdump:type=data- يقيّد الاستجابة بحيث تقتصر على محتوى المستند فقط في Elasticsearch.input-index- فهرس الإدخال لدينا في Elasticsearch.output=$- يعيد توجيه جميع النتائج إلى stdout.- العلامة
sourceOnlyتضمن حذف حقول البيانات الوصفية من الاستجابة. - العلامة
searchAfterلاستخدامsearchAfterAPI من أجل ترقيم صفحات النتائج بكفاءة. pit=trueلضمان الحصول على نتائج متسقة بين الاستعلامات باستخدام point in time API.
معلمات عميل ClickHouse هنا (باستثناء بيانات الاعتماد):
max_insert_block_size=1000- سيرسل عميل ClickHouse البيانات بمجرد الوصول إلى هذا العدد من الصفوف. تؤدي زيادته إلى تحسين معدل النقل، لكن على حساب الوقت اللازم لتجميع كتلة، مما يعني زيادة الوقت قبل ظهور البيانات في ClickHouse.min_insert_block_size_bytes=0- يعطّل دمج الكتل في الخادم حسب عدد البايتات.min_insert_block_size_rows=1000- يدمج الكتل القادمة من العملاء على جانب الخادم. في هذه الحالة، نضبطه علىmax_insert_block_sizeبحيث تظهر الصفوف فورًا. زِد هذه القيمة لتحسين معدل النقل.query="INSERT INTO logs_system_syslog FORMAT JSONAsRow"- إدراج البيانات بتنسيق JSONEachRow format. وهذا مناسب عند الإرسال إلى مخطط محدد بوضوح مثلlogs_system_syslog.
يمكنك توقّع معدل نقل في حدود آلاف الصفوف في الثانية.
الإدراج في صف JSON واحدإذا كنت تُدرج في عمود JSON واحد (راجع مخطط راجع “Reading JSON as an object” لمزيد من التفاصيل.
syslog_json أعلاه)، فيمكن استخدام أمر الإدراج نفسه. ولكن يجب تحديد JSONAsObject بوصفه التنسيق بدلًا من JSONEachRow، على سبيل المثال:تحويل البيانات (اختياري)
تفترض الأوامر أعلاه وجود مطابقة 1:1 بين حقول Elasticsearch وأعمدة ClickHouse. وغالبًا ما يحتاج المستخدمون إلى تصفية بيانات Elasticsearch وتحويلها قبل إدخالها إلى ClickHouse.يمكن تحقيق ذلك باستخدام table function input، التي تتيح لنا تنفيذ أي استعلام SELECT على stdout.لنفترض أننا نريد تخزين حقلي timestamp وhostname فقط من بياناتنا السابقة. بنية ClickHouse:elasticdump إلى هذا الجدول، يمكننا ببساطة استخدام دالة الجدول input، مع استخدام نوع JSON لاكتشاف الأعمدة المطلوبة وتحديدها ديناميكيًا. لاحظ أن استعلام SELECT هذا يمكن أن يتضمن شرط تصفية بسهولة.@timestamp واستخدام صيغة الإدخال JSONAsObject.