VictoriaMetrics - إنشاء أفضل تخزين عن بعد لـ Prometheus

اهلا بالجميع! مؤسسو VictoriaMetrics هنا:

  • valyala
  • hagen1778
  • tenmozes

يسعدنا إلقاء بعض الضوء على VictoriaMetrics.

القليل من التاريخ

بدأنا باستخدام Prometheus و Grafana قبل عامين. كان هذا بمثابة التنفس للهواء النقي مقارنة بـ Zabbix. يمكن للمطورين الآن نشر مقاييس تعسفية حول الكود الخاص بهم ، وإنشاء لوحات معلومات مخصصة في Grafana ومراقبة تطبيقاتهم دون مسؤوليات مخصصة / DevOps.

نما عدد المقاييس الفريدة التي تلغيها نسخة بروميثيوس لدينا بسرعة من بضع مئات إلى أكثر من 300 ألف في نصف عام. لقد تحولنا إلى الإصدار بروميثيوس 2.0 أثناء النمو ، حيث إن بروميثيوس قبل الإصدار 2.0 أصبح بطيئًا للغاية بالنسبة لوحدات التخزين المترية الخاصة بنا. لكن بروميثيوس الجديد كان لديه عدد قليل من القضايا:

  • لم يكن الأمر سريعًا في نطاقات الاستعلام التي تتجاوز بضعة أيام. استخدمنا هذه النطاقات للاتجاهات طويلة الأجل ولوحات المعلومات لتخطيط القدرات.
  • بدأ تناول الكثير من مساحة التخزين بعد زيادة الاحتفاظ التدريجي من الافتراضي 15 يوما إلى سنة.
  • لم يكن من الواضح كيفية منع فقدان بيانات Prometheus في حالة تعطل التخزين. لقد انتهى الأمر بحالتين متميزتين من بروميثيوس يقومون بإلغاء نفس مجموعة الأهداف (يُعرف أيضًا باسم زوج HA). هذا تضاعف تكاليف الرصد لدينا.

بدأنا استكشاف الحلول الممكنة واكتشفنا أن Prometheus يدعم التخزين عن بُعد. ولكن جميع الحلول الحالية كانت غير مرضية لأسباب مختلفة:

  • الإعداد معقدة وعملية هشة.
  • تعطل وذكرت وفقدان البيانات.
  • بطء.
  • صفر أو دون المستوى الأمثل.

خلال نفس الوقت ، استخدمنا ClickHouse بنجاح لتخزين وتحليل تدفقات الأحداث الضخمة - ما يصل إلى 300 مليار حدث يوميًا. لقد أذهلنا البساطة التشغيلية وسرعة الاستعلام ومستوى الضغط لمحرك طاولة MergeTree الخاص به.

كانت تجربتنا مع ClickHouse رائعة جدًا ، لذا قمنا بفتح المصادر التالية للمشاريع التالية:

  • clickhouse-grafana - مصدر بيانات Grafana لـ ClickHouse.
  • chproxy - موازن التحميل وكيل التخزين المؤقت لـ ClickHouse.
  • chclient - سريع الذهاب العميل ل ClickHouse.

لقد حاولنا استخدام ClickHouse كتخزين بعيد لـ Prometheus. كانت النتائج الأولية رائعة - تمكنت ClickHouse من فحص مليارات نقاط البيانات في الثانية على خادم واحد. لسوء الحظ ، لم نتمكن من إيجاد حل جيد لبناء فهرس فعال لملصقات بروميثيوس.

ثم ظهرت فكرة مجنونة - فلنقم بإنشاء TSDB الخاص بنا مع المتطلبات التالية:

  • مؤشر فعال لتسميات بروميثيوس ويعرف أيضًا باسم علامات Metrics 2.0 ، التي تخزن وتسجل بلايين العلامات التجارية المتميزة.
  • سرعة سريعة للاستعلامات على نطاقات زمنية كبيرة ، وعدد كبير من المقاييس الفريدة وعدد كبير من نقاط البيانات.
  • ضغط تخزين جيد ، لذلك قد يتم تخزين المزيد من البيانات على مساحة القرص المحدودة.
  • نسخ احتياطي سهلة وسريعة عبر الإنترنت تشبه قسم التجميد في ClickHouse.

كان النموذج الأولي لهذا TSDB واعداً ، لذا تركت (valyala) عملي في VertaMedia وبدأت العمل على TSDB بدوام كامل. في وقت لاحق حصلت TSDB اسم جميل - VictoriaMetrics.

تفاصيل تقنية

VictoriaMetrics هو مكتوب في الذهاب. تم اختيار Go للأسباب التالية:

  • تتم كتابة العديد من حلول TSDB الحالية في Go - Prometheus و InfluxDB و Thanos و M3 و Cortex ، وما إلى ذلك. هذه تلميحات Go جيدة جدًا لكتابة TSDB.
  • لدي خبرة جيدة في Go. انظر بلدي repos على جيثب.
  • أنا مؤلف fasthttp ، لذلك أنا أعرف كيفية كتابة تطبيقات فعالة في Go.

تم تخزين مساحة VictoriaMetrics من الصفر باستخدام أفكار من محرك طاولة Clickhouse’s MergeTree:

  • تخزين أسماء الجداول الزمنية بشكل منفصل ، الطوابع الزمنية والقيم (ويعرف أيضا باسم التخزين عمودي). يعمل هذا على زيادة سرعة الاستعلامات عن طريق مسح الأعمدة المطلوبة فقط.
  • تخزين كل عمود في بنية بيانات مشابهة لشجرة دمج السجل المهيكلة (LSM). يؤدي ذلك إلى تقليل الإدخال / الإخراج العشوائي عند إضافة / مسح القيم التي تم فرزها مقارنة بهياكل البيانات المشابهة لشجرة B. هذا يسرع التخزين على الأقراص الصلبة. ملفات LSM غير قابلة للتغيير. هذا يبسط صنع لقطات سريعة والنسخ الاحتياطي. لدى LSM عيبًا مقارنة بـ B-tree - تتم إعادة كتابة البيانات المخزنة عدة مرات عند دمج الملفات الأصغر في ملفات أكبر. هذا يهدر عرض النطاق الترددي للقرص ، لكن ممارسة ClickHouse تُظهر أن هذه مقايضة جيدة.
  • معالجة البيانات في مجموعات التي تتلاءم مع ذاكرة التخزين المؤقت وحدة المعالجة المركزية. يعمل هذا على زيادة أداء وحدة المعالجة المركزية إلى الحد الأقصى ، حيث إنه لا ينتظر البيانات من ذاكرة الوصول العشوائي البطيئة. انظر أرقام الكمون التي يجب أن يعرفها كل مبرمج للحصول على التفاصيل.

في البداية تم بناء فهرس لتسميات بروميثيوس أعلى منفذ LevelDB في Go. في وقت لاحق حاولت استبداله ببديل أكثر كفاءة - RocksDB. لكن ذلك لم يكن ناجحًا بسبب النفقات العامة المرتفعة ، والتي يجب دفعها على كل ملصق تم مسحه ضوئيًا. في نهاية المطاف ، تم استبدال LevelDB بهيكل بيانات مخصص - دمج. تم تحسين بنية البيانات هذه خصيصًا لمؤشر ملصقات بروميثيوس.

لدى mergeset الاختلافات التالية مقارنة بـ LevelDB:

  • تعمل فقط على المفاتيح. ليست على دراية بالقيم.
  • لديها أقل التضخيم الكتابة.
  • لديها أسرع تسعى لكثير من المفاتيح المطلوبة.
  • إنها تضغط المفاتيح بشكل أفضل ، لذا فهي تتطلب مساحة تخزين أقل.
  • إنه يوفر لقطات بيانات فورية ونسخ احتياطية سهلة.
  • يستخدم الأفكار من محرك طاولة ClickHouse’s MergeTree.

نحن نخطط لفتح مصدر دمج في المستقبل القريب ، حتى يستفيد الآخرون منه.

في البداية كانت VictoriaMetrics حلاً لخادم واحد. في وقت لاحق تم تحويله إلى حل متفاوت المسافات. تم تقسيم خدمة واحدة إلى ثلاث خدمات أثناء التحويل:

  • vmstorage - يخزن القيم المترية المستلمة من vminsert ، ويعيد القيم المترية الأولية للاستعلامات من vmselect.
  • vminsert - يقبل القيم المترية عبر واجهة برمجة تطبيقات بروميثيوس remote_write ويرسلها إلى vmstorage.
  • vmselect - تنفذ بروميثيوس الاستعلام API. إحضار البيانات الخام من vmstorage.

يعطي التقسيم الفوائد التالية:

  • كل خدمة قد النطاق بشكل مستقل.
  • قد تعمل كل خدمة على الأجهزة المُثلى بشكل مثالي لتلبية احتياجات الخدمة.
  • لا تتداخل المدخلات الثقيلة مع التحديدات الثقيلة.
  • الأخطاء في vminsert لا كسر vmselect والعكس بالعكس.
  • أفضل المتانة vmstorage ، لأنه يفرغ منطق الاستعلام المعقدة ل vmselect.

يتم تشغيل VictoriaMetrics الآن في Google Cloud. نحن نستخدم البنية التحتية كنهج كود لإدارة الموارد وتوفيرها عبر مدير النشر.

محرك الاستعلام

في البداية vmselect شريطة API قراءة بروميثيوس عن بعد. ولكن هذا كان دون المستوى الأمثل ، لأن API تطلب نقل جميع نقاط البيانات الأولية إلى بروميثيوس لكل استعلام. على سبيل المثال ، إذا قامت بروميثيوس بإنشاء استجابة على مقاييس 1K مع نقاط بيانات 10K لكل منها ، فينبغي أن ترسل vmselect 1K * 10K = 10M نقاط بيانات إلى Prometheus في كل استعلام. هذا هو مضيعة للحركة الخروج والمال. في وقت لاحق ، تم استبدال واجهة برمجة التطبيقات للقراءة عن بُعد بمحرك استعلام متوافق تمامًا مع PromQL.

يدعم محرك الاستعلام ميزات إضافية تهدف إلى تبسيط الاستعلامات المعقدة. في الأسفل يوجد بعض الأمثلة:

  • مع قوالب تشبه تعبيرات الجدول الشائعة:
مع (
      commonFilters = {job = ~ "$ job" ، مثيل = ~ "$ مثيل"}
  ) node_filesystem_size_bytes {commonFilters} / node_filesystem_avail_bytes {commonFilters}

اقرأ المزيد عن قوالب WITH واللعب معهم في ملعب قوالب WITH.

  • العديد من الوظائف المفيدة. على سبيل المثال ، وظيفة الاتحاد لدمج نتائج الاستعلام:
اتحاد(
    node_filesystem_size_bytes،
    node_filesystem_avail_bytes،
)

القائمة الكاملة للوظائف الإضافية متاحة هنا.

حقائق الأداء

  • تشير الاختبارات الأولية إلى أن VictoriaMetrics تستخدم مساحة تخزين أقل بمقدار 10x مقارنةً بـ Prometheus 2.0–0.4 بايت لكل نقطة بيانات مقابل 4 بايت لكل نقطة بيانات في حالتنا. نقطة البيانات هي (الطابع الزمني ، metric_value).
  • خدمة vmstorage واحدة تقبل ما يصل إلى 4 ملايين نقطة بيانات في الثانية على خادم 8xCPU.
  • تقوم خدمة vmselect واحدة بفحص ما يصل إلى 500 مليون نقطة بيانات في الثانية على خادم 8xCPU.
  • تستخدم VictoriaMetrics مساحة تخزين أقل بمقدار 70 مرة مقارنةً بـ TimescaleDB على بيانات الاختبار من Time Series Benchmark Suite - 250 ميجابايت مقابل 18 جيجابايت. تتكون بيانات الاختبار من نقاط بيانات 1B - راجع وصف TSBS على GitHub.
  • هناك مجال لتحسين الأداء. جميع خدمات VictoriaMetrics مجهزة بمعالج pprof ، لذلك نحن على استعداد لضبط أدائها على عبء العمل الإنتاجي.

ميزات VictoriaMetrics

  • يدعم PromQL الكامل بالإضافة إلى PromQL الموسعة مع القوالب. قد تتم تجربة PromQL الموسعة على ملعب Grafana.
  • إعداد سهل - ما عليك سوى نسخ عنوان URL الخاص بـ remote_write الموفر إلى config Prometheus.
  • انخفاض تكاليف التشغيل. قد يتم تحويل Prometheus إلى خدمة عديمي الجنسية بعد تمكين الكتابة عن بعد إلى VictoriaMetrics.
  • يتوفر نطاق واسع من فترات الاستبقاء - من شهر واحد إلى 5 سنوات.
  • إدراج مقاييس الأداء إلى ملايين القيم المترية في الثانية.
  • حدد مقاييس الأداء إلى مليارات القيم المترية في الثانية.
  • تخزين المقاييس إلى تريليونات من القيم المترية والملايين من المقاييس الفريدة (ويعرف أيضًا باسم أصل عالي)
  • يوفر طريقة عرض استعلام عمومية عبر عدد عشوائي من مثيلات بروميثيوس المتميزة إذا كانت تستخدم نفس عنوان URL remote_write.

من الذي قد يستفيد من VictoriaMetrics؟

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

ميزات المستقبل

نحن نخطط لتنفيذ الميزات التالية في المستقبل:

  • الاختزال التلقائي للبيانات القديمة.
  • القيم الأخيرة لمرشحات التسمية المحددة.
  • عدادات الوقت.

خاتمة

نحن على يقين بأن VictoriaMetrics ستصبح أفضل وحدة تخزين عن بعد لـ Prometheus.

مواصلة استكشاف ذلك. قراءة التعليمات. قم بالتسجيل في ملعب VictoriaMetrics ، واستخدمه كتخزين تخزين عن بُعد لمثيلات بروميثيوس. إنه آمن تمامًا ، حيث تواصل Prometheus في كتابة البيانات في التخزين المحلي إلى جانب التخزين البعيد ، لذلك لا تضيع بياناتك المحلية عند تمكين التخزين عن بُعد. انظر البداية السريعة لمزيد من التفاصيل.

تحرير لوحات المعلومات والرسوم البيانية في ملعب غرافانا. يستخدم هذا الملعب مصدر بيانات VictoriaMetrics للإشارة إلى المقاييس الداخلية لملعب VictoriaMetrics ، لذلك تتوفر جميع الميزات من Extended PromQL.

إنتاج VictoriaMetrics سيكون متاحًا قريبًا. لا تنزعج ونشر الكلمة عن ذلك!

تحديث: صور عامل الميناء مع خادم واحد VictoriaMetrics متاحة هنا. إذا كنت لا تحب Docker ، فاستخدم ثنائيات ثابتة ثابتة.

Update2: اقرأ مقالنا الجديد - معايير TSDB عالية الأهمية: VictoriaMetrics و TimescaleDB و InfluxDB.

تحديث 3: VictoriaMetrics مفتوح المصدر الآن!

انضم إلى مجتمعنا Slack وقراءة موضوعات Faun الأسبوعية الخاصة بنا ⬇

إذا كانت هذه المشاركة مفيدة ، فالرجاء النقر على زر التصفيق أدناه عدة مرات لإظهار دعمك للمؤلف! ⬇