مكدس ELK
مكدس ELK
مكدس ELK — الذي يضم Elasticsearch وLogstash وKibana — هو الحل مفتوح المصدر الأكثر انتشاراً لتركيز السجلات في القطاع. تُشغّل شركات كبرى مثل Netflix وLinkedIn وUber وGoldman Sachs هذا المكدس على نطاق يُقدَّر بالبيتابايت. فهم بنيته التحتية هو الأساس لكل عمل تشغيلي على السجلات بمعايير الشركات التقنية الكبرى.
بنية المكوّنات الثلاثة
لكل مكوّن وظيفة واحدة، والفصل بينها مقصود. كسر هذا الحد هو أحد أكثر أسباب حوادث ELK الإنتاجية شيوعاً.
- Elasticsearch — محرك بحث وتحليلات موزّع يعتمد الفهرس المقلوب. يخزّن السجلات ويفهرس كل حقل، وينفّذ الاستعلامات عبر تيرابايتات في أجزاء من الثانية. تُكتب السجلات في فهارس مختومة بالتاريخ مثل
logs-app-2025.06.11. يُقسَّم كل فهرس إلى أجزاء (shards) موزّعة على العقد وتُنسخ لضمان التوافر. - Logstash (أو عقد Elastic Ingest) — طبقة الاستيعاب والتحويل. تستقبل بثوث السجلات الخام وتحوّلها إلى JSON منظّم باستخدام مرشحات Grok وDissect وCSV، وتثري الحقول بمعلومات GeoIP وعميل المستخدم، ثم تُعيد توجيهها إلى Elasticsearch. تعمل أيضاً كمخزن مؤقت عند حدوث ضغط خلفي.
- Kibana — واجهة التصوير والاستعلام. يستخدم المهندسون تبويب Discover لإجراء بحث بـ KQL (لغة استعلام Kibana)، وبناء لوحات المعلومات بمخططات التجميع، وإعداد قواعد التنبيه. في الإنتاج، تُعدّ أيضاً نقطة الدخول لـ APM وإدارة Fleet.
Elasticsearch: ما يجب أن يعرفه المشغّل
يستخدم Elasticsearch فهرساً مقلوباً — يُفهرَس كل رمز في كل حقل عند الكتابة. هذا هو السبب في أن البحث النصي الكامل عبر مليارات سطور السجلات يستغرق أجزاء من الثانية، لكنه يعني أيضاً أن معدل الكتابة واستخدام القرص يبلغان 3 إلى 5 أضعاف حجم السجلات الخام. يُقسَّم كل فهرس إلى أجزاء أساسية (primary shards) كأهداف كتابة، وأجزاء نسخية (replica shards) لتوسعة القراءة والتوافر العالي. الأجزاء الخاطئة هي السبب الأكثر شيوعاً لتراجع أداء مجموعات Elasticsearch في الإنتاج.
number_of_shards صراحةً في قالب الفهرس.
Logstash: خط أنابيب الاستيعاب
يتكوّن خط أنابيب Logstash من ثلاثة أقسام: input (مصدر السجلات) وfilter (كيفية تحليلها وإثرائها) وoutput (وجهتها). أهم مرشح هو Grok، الذي يطابق سطور السجل النصي الحر مع أنماط regex مسمّاة.
Kibana: الاستعلام ولوحات المعلومات
تتصل Kibana بـ Elasticsearch عبر REST API وتوفّر عرض Discover للتحقيقات الآنية ومحرّر Dashboard للتصورات الدائمة. لغة الاستعلام هي KQL (لغة استعلام Kibana)، وهي صياغة مبسّطة فوق Elasticsearch DSL.
أنماط الفشل في الإنتاج
ثلاثة أنماط فشل تُسبّب غالبية حوادث ELK الإنتاجية:
- ضغط الكومة وتوقفات جمع القمامة. عقد Elasticsearch عمليات JVM. عندما يتجاوز استخدام الكومة 75%، يبدأ جامع القمامة في التسبب في توقفات تمتد لثوانٍ، مما يُبطّئ الاستيعاب وزمن استجابة الاستعلامات. الحد الصارم هو 50% من الذاكرة المتاحة، بحد أقصى 31 غيغابايت (بسبب OOPs المضغوطة). راقب
jvm.mem.heap_used_percentكمقياس Prometheus حرج. - الانقسام الدماغي (Split-brain). في Elasticsearch 7 وما بعده، حُلّت هذه المشكلة إلى حدٍ بعيد بفضل تنسيق المجموعة المبني على Raft، لكنها قد تظهر إذا كان
discovery.seed_hostsمُهيَّأ بشكل خاطئ أو حدثت انقسامات شبكية. دائماً شغّل عدداً فردياً من العقد المؤهلة لدور الماستر (3 أو 5) وحدّدcluster.initial_master_nodesبشكل صحيح عند التمهيد الأول فقط. - توقف خط أنابيب Logstash. إذا تعرّض Elasticsearch لضغط خلفي (قرص ممتلئ، أو قاطع دائرة مفتوح)، تمتلئ قائمة انتظار Logstash الدائمة. بدون تفعيل قائمة الانتظار الدائمة (
queue.type: persisted)، تُحذف سطور السجل بصمت. فعّل دائماً قائمة الانتظار الدائمة في الإنتاج وحجّمها لاستيعاب 30 دقيقة على الأقل من ذروة الاستيعاب.
خط الأمان الأساسي
لا تشغّل ELK أبداً بدون تفعيل الأمان. أفضت إمكانية الوصول الافتراضية المفتوحة لـ Elasticsearch إلى آلاف قواعد البيانات المكشوفة للعموم. منذ Elasticsearch 8.0، الأمان (TLS + مصادقة أساسية) مفعّل افتراضياً. للعمليات الموجودة:
- فعّل TLS على جميع اتصالات inter-node والاتصالات من العميل إلى العقدة (
xpack.security.enabled: true،xpack.security.http.ssl.enabled: true). - استخدم حسابات خدمة مخصصة بأقل الامتيازات (
logstash_writerrole: الكتابة فقط في أنماط فهارس محددة؛kibana_read_onlyلمستهلكي لوحات المعلومات). - لا تكشف أبداً منفذ HTTP الخاص بـ Elasticsearch (9200) للإنترنت — ضعه خلف مجموعة أمان VPC أو جدار حماية، ليكون متاحاً فقط من طبقة الاستيعاب وKibana.