Database Engineering

كسر حدّ التفرّد: تحسين استيعاب بيانات السلاسل الزمنية عالية الحجم في Prometheus وVictoriaMetrics

تُعدّ المراقبة (Observability) العمود الفقري للنظم الموزعة الحديثة، لكنها تأتي بتكلفة أداء كبيرة: التفرّد (Cardinality). بينما يضيف المطورون علامات إلى المقاييس لتمكين الاستعلامات الدقيقة، فإننا غالباً ما نخلق عن غير قصد انفجاراً تركيبياً في بيانات السلاسل الزمنية. يمكن أن يؤدي هذا "الانفجار في التفرّد" إلى أخطاء نفاد الذاكرة، واختناقات في عمليات الإدخال/الإخراج على القرص، وتكاليف بنية تحتية باهظة. في هذا المنشور، سنستكشف استراتيجيات لتحسين استيعاب السلاسل الزمنية عالية التفرّد، مع مقارنة البنية الأصلية لـ Prometheus بكفاءة VictoriaMetrics السحابية.

فهم فخ التفرّد

يشير التفرّد إلى عدد السلاسل الزمنية الفريدة الناتجة عن مزيج من أسماء المقاييس وأزواج العلامات. على سبيل المثال، تعريض مقياس http_requests_total مع علامة user_id أمر خطير. إذا كان لديك مليون مستخدم نشط، فستقوم بإنشاء مليون سلسلة زمنية فريدة على الفور. يقوم Prometheus بتخزين جميع البيانات محلياً على القرص بتنسيق مُحسّن للاستعلامات ضمن نطاق زمني، ولكنه ليس مُحسّناً لمجموعات العلامات الضخمة. عندما ترتفع معدلات الاستيعاب أو يكبر عدد قيم العلامات الفريدة بشكل كبير، فإن مكون قاعدة بيانات السلاسل الزمنية (TSDB) يواجه صعوبة في إدارة مقاطع سجل الكتابة المسبقة (WAL) وملفات الخرائط الذاكرة.

الاستراتيجية 1: تصفية العلامات استباقياً في Prometheus

الخط الدفاعي الأول هو منع العلامات عالية التفرّد من دخول النظام أصلاً. في Prometheus، يمكنك استخدام metric_relabel_configs في تكوين السحب (scraping configuration) لتجاهل المقاييس أو العلامات التي تنتهك قواعد التفرّد الخاصة بك.

على سبيل المثال، إذا قمت عن غير قصد بسحب نقطة نهاية تعرض معلومات تعريف شخصية (PII) مثل معرفات الجلسة، فيجب عليك إزالة هذه العلامة قبل التخزين. إليك كيفية تكوين قاعدة تجاهل في ملف prometheus.yml:

scrape_configs:
  - job_name: 'web_app'
    metrics_path: '/metrics'
    relabel_configs:
      - source_labels: [__name__]
        regex: 'my_app_(.+)'
        action: drop
    metric_relabel_configs:
      # تجاهل المقاييس التي تحتوي على علامات عالية التفرّد مثل session_id
      - source_labels: [session_id]
        regex: '.+'
        action: drop

يضمن هذا النهج ألا تخصص قاعدة البيانات الذاكرة لهذه السلاسل. ومع ذلك، فإن هذا نهج "خاسر"؛ حيث تفقد القدرة على استعلام تلك السلاسل المحددة تماماً. تأكد من تجاهل العلامات التي لا تتطلبها احتياجات المراقبة الخاصة بك.

الاستراتيجية 2: الاستفادة من VictoriaMetrics للاستيعاب واسع النطاق

بينما يعد Prometheus ممتازاً للمراقبة قصيرة المدى وعالية الدقة، لم يتم تصميمه للتخزين طويل المدى للبيانات عالية التفرّد. هنا تبرز قوة VictoriaMetrics. تم بناؤه خصيصاً لمعالجة قيود Prometheus على النطاق الواسع، حيث يستخدم محرك تخزين وخوارزميات ضغط أكثر كفاءة.

يدعم VictoriaMetrics "VMAlert" للتنبيهات ويقدم بروتوكول كتابة عن بُعد متوافقاً مع Prometheus. إحدى مزاياه الرئيسية هي قدرته على التعامل مع معدلات استيعاب عالية دون الحاجة إلى التجزئة (sharding) أو إدارة معقدة للعقد في عمليات النشر ذات العقدة الواحدة. يستخدم بنية ذات عقدة واحدة يمكنها التعامل مع مليارات السلاسل الزمنية الفريدة على جهاز واحد، مما يقلل من التعقيد التشغيلي.

للانتقال إلى VictoriaMetrics، يمكنك ببساطة تغيير نقطة النهاية remote_write في تكوين Prometheus لتشير إلى VictoriaMetrics:

global:
  scrape_interval: 15s

remote_write:
  - url: 'http://victoriametrics:8428/api/v1/write'
    queue_config:
      max_samples_per_send: 5000
      capacity: 25000

الاستراتيجية 3: تقليل الدقة وسياسات الاحتفاظ بالبيانات

بغض النظر عن الخلفية المستخدمة، فإن تخزين البيانات الخام بدقة ميلي ثانية لأشهر غالباً ما يكون غير ضروري. يدعم كل من Prometheus وVictoriaMetrics تقليل الدقة (downsampling). يسمح VictoriaMetrics، على وجه الخصوص، بسياسات تقليل دقة صارمة حيث يتم تجميع البيانات القديمة تلقائياً في دقة دقيقة واحدة أو ساعة واحدة.

يقلل هذا بشكل كبير من حجم القرص. من خلال فترات الاحتفاظ التي توازن بين التكلفة واحتياجات المراقبة، يمكنك الاحتفاظ بالبيانات عالية الدقة لبضعة أسابيع (كافية لتصحيح الأخطاء في الحوادث الأخيرة) والبيانات منخفضة الدقة لسنوات (مفيدة لتحليل الاتجاهات).

الخاتمة

لا يتعلق تحسين استيعاب السلاسل الزمنية عالية التفرّد بتوسيع نطاق الأجهزة فحسب؛ بل يتطلب انضباطاً معمارياً. ابدأ بمراجعة مقاييسك بحثاً عن "علامات سيئة" مثل معرفات المستخدمين، وعناوين IP، أو معرفات الطلبات الديناميكية. استخدم قواعد إعادة تسمية Prometheus لإزالة هذه العلامات من المصدر. للتخزين طويل المدى والتحليل التاريخي، فكر في نقل البيانات إلى VictoriaMetrics، الذي يوفر ضغطاً وأداء استيعاب متفوقين. من خلال الجمع بين نظافة العلامات والخلفية التخزينية المناسبة، يمكنك الحفاظ على مجموعة مراقبة قوية وفعالة من حيث التكلفة تتوسع مع نمو تطبيقك.

Share: