VictoriaMetrics - δημιουργώντας το καλύτερο απομακρυσμένο αποθηκευτικό χώρο για τον Prometheus

Γεια σε όλους! Οι ιδρυτές της VictoriaMetrics εδώ:

  • valyala
  • hagen1778
  • tenmozes

Είμαστε στην ευχάριστη θέση να ρίξουμε φως στο VictoriaMetrics.

Λίγη ιστορία

Ξεκινήσαμε τη χρήση του Prometheus και του Grafana πριν από δύο χρόνια. Αυτή ήταν μια ανάσα καθαρού αέρα συγκριτικά με τον Zabbix. Τώρα οι προγραμματιστές θα μπορούσαν να διασκορπίσουν αυθαίρετες μετρήσεις γύρω από τον κώδικα τους, να δημιουργήσουν προσαρμοσμένους πίνακες dashboards στο Grafana και να παρακολουθήσουν τις εφαρμογές τους χωρίς να αφιερώσουν sysadmins / DevOps.

Ο αριθμός των μοναδικών μετρήσεων που εξαγνίστηκαν από το παράδειγμά μας Prometheus γρήγορα μεγάλωσε από μερικές εκατοντάδες έως περισσότερο από 300Κ σε μισό χρόνο. Πραγματοποιήσαμε αλλαγή στο Prometheus 2.0 κατά τη διάρκεια της ανάπτυξης, δεδομένου ότι ο προ-2.0 Prometheus έγινε πολύ αργός για τους μετρικούς όγκους μας. Αλλά ο νέος Προμηθέας είχε μερικά θέματα:

  • Δεν ήταν τόσο γρήγορο στις σειρές ερωτήσεων που υπερβαίνουν τις λίγες ημέρες. Χρησιμοποιήσαμε τέτοιες σειρές για μακροπρόθεσμες τάσεις και πίνακες προγραμματισμού χωρητικότητας.
  • Άρχισε να τρώει πολλούς αποθηκευτικούς χώρους μετά από τη σταδιακή αύξηση της διατήρησης από προεπιλογή 15 ημερών σε ένα έτος.
  • Δεν ήταν σαφές πώς να αποτρέψουμε την απώλεια δεδομένων του Prometheus σε περίπτωση συντριβής αποθήκευσης. Καταλήγουμε με δύο ξεχωριστές περιπτώσεις Prometheus που αποξεσώνουν το ίδιο σύνολο στόχων (γνωστό και ως ζεύγος ΗΑ). Αυτό διπλασίασε το κόστος παρακολούθησης.

Ξεκινήσαμε τη διερεύνηση πιθανών λύσεων και ανακάλυψα ότι ο Prometheus υποστηρίζει απομακρυσμένη αποθήκευση. Όμως, όλες οι υπάρχουσες λύσεις δεν ήταν ικανοποιητικές λόγω διαφόρων παραγόντων:

  • Σύνθετη ρύθμιση και εύθραυστη λειτουργία.
  • Αναφέρθηκαν διακοπές και απώλεια δεδομένων.
  • Βραδύτης.
  • Μηδενική ή υπο-βέλτιστη κλιμάκωση.

Την ίδια στιγμή χρησιμοποιήσαμε με επιτυχία το ClickHouse για την αποθήκευση και την ανάλυση μεγάλων ροών εκδηλώσεων - έως και 300 δισεκατομμύρια γεγονότα την ημέρα. Ήμασταν έκπληκτοι με την απλότητα λειτουργίας, την ταχύτητα ερώτησης και το επίπεδο συμπίεσης του τραπεζιού MergeTree.

Η εμπειρία μας με το ClickHouse ήταν τόσο μεγάλη, οπότε ανοίξαμε τα ακόλουθα έργα για αυτό:

  • clickhouse-grafana - Πηγή δεδομένων Grafana για το ClickHouse.
  • chproxy - balancer load και proxy caching για το ClickHouse.
  • chclient - γρήγορος πελάτης Go για το ClickHouse.

Προσπαθήσαμε να χρησιμοποιήσουμε το ClickHouse ως απομακρυσμένο αποθηκευτικό χώρο για τον Prometheus. Τα αρχικά αποτελέσματα ήταν εξαιρετικά - το ClickHouse κατάφερε να σαρώσει δισεκατομμύρια σημεία δεδομένων ανά δευτερόλεπτο σε ένα μόνο διακομιστή. Δυστυχώς δεν βρήκαμε μια καλή λύση για την κατασκευή αποτελεσματικού δείκτη για τις ετικέτες του Προμηθέα.

Έπειτα εμφανίστηκε μια τρελή ιδέα - ας δημιουργήσουμε το δικό μας TSDB με τις ακόλουθες απαιτήσεις:

  • Αποτελεσματικό ευρετήριο για τις ετικέτες Prometheus aka Metrics 2.0 tags, το οποίο αποθηκεύει και διεγείρει εύκολα δισεκατομμύρια ξεχωριστές ετικέτες.
  • Γρήγορη ταχύτητα για ερωτήματα σε μεγάλες σειρές ημερομηνιών, μεγάλο αριθμό μοναδικών μετρήσεων και τεράστιο αριθμό σημείων δεδομένων.
  • Καλή συμπίεση αποθήκευσης, ώστε περισσότερα δεδομένα να μπορούν να αποθηκευτούν στον περιορισμένο χώρο στο δίσκο.
  • Εύκολο και γρήγορο online backup παρόμοιο με το FREEZE PARTITION στο ClickHouse.

Το πρωτότυπο αυτού του TSDB ήταν πολλά υποσχόμενο, οπότε εγώ (valyala) άφησα τη δουλειά μου στο VertaMedia και άρχισα να δουλεύω με το TSDB με πλήρη απασχόληση. Αργότερα το TSDB πήρε ωραίο όνομα - VictoriaMetrics.

Τεχνικές λεπτομέρειες

Το VictoriaMetrics είναι γραμμένο στο Go. Go έχει επιλεγεί για τους ακόλουθους λόγους:

  • Πολλές υπάρχουσες λύσεις TSDB είναι γραμμένες σε Go - Prometheus, InfluxDB, Thanos, M3, Cortex, κλπ. Αυτό υποδηλώνει ότι το Go είναι αρκετά καλό για την γραφή TSDB.
  • Έχω καλή εμπειρία στο Go. Δείτε τα repos μου στο GitHub.
  • Είμαι ο συγγραφέας του fasthttp, οπότε ξέρω πώς να γράφω αποτελεσματικές εφαρμογές στο Go.

Το αποθηκευτικό χώρο της VictoriaMetrics είναι χτισμένο από την αρχή με ιδέες από την τράπεζα MergeTree του Clickhouse:

  • Αποθηκεύστε χωριστά ονόματα χρονικών ονομάτων, χρονικά σήματα και τιμές (γνωστά και ως αποθήκευση σε στήλες). Αυτό επιταχύνει τα ερωτήματα με τη σάρωση μόνο των απαιτούμενων στηλών.
  • Αποθηκεύστε κάθε στήλη σε μια δομή δεδομένων παρόμοια με το δομημένο δομή συγχώνευσης (LSM). Αυτό μειώνει τυχαία εισόδου / εξόδου κατά την προσθήκη / σάρωση ταξινομημένων τιμών σε σύγκριση με δομές δεδομένων τύπου B-tree. Αυτό επιταχύνει την αποθήκευση σε σκληρούς δίσκους. Τα αρχεία LSM είναι αμετάβλητα. Αυτό απλοποιεί τη δημιουργία γρήγορων στιγμιότυπων και αντιγράφων ασφαλείας. Το LSM έχει ένα μειονέκτημα σε σύγκριση με το B-tree - τα αποθηκευμένα δεδομένα επανεγγράφονται πολλές φορές όταν τα μικρότερα αρχεία συγχωνεύονται σε μεγαλύτερα αρχεία. Αυτό το εύρος ζώνης δίσκων αποβλήτων, αλλά η πρακτική ClickHouse δείχνει ότι αυτό είναι αρκετά καλό εμπόριο.
  • Διαδικασία δεδομένων σε κομμάτια που ταιριάζουν στην προσωρινή μνήμη CPU. Αυτό μεγιστοποιεί την απόδοση της CPU, καθώς δεν περιμένει τα δεδομένα από αργή μνήμη RAM. Δείτε τους αριθμούς καθυστέρησης που πρέπει να γνωρίζει ο κάθε προγραμματιστής για λεπτομέρειες.

Αρχικά, ο δείκτης για τις ετικέτες Prometheus έχει χτιστεί πάνω από τη θύρα LevelDB στο Go. Αργότερα προσπάθησα να την αντικαταστήσω με πιο αποτελεσματική εναλλακτική λύση - RocksDB. Αλλά δεν ήταν επιτυχής λόγω των υψηλών γενικών επιβαρύνσεων, οι οποίες πρέπει να καταβάλλονται σε κάθε σαρωμένη ετικέτα. Τελικά το LevelDB αντικαταστάθηκε από μια προσαρμοσμένη δομή δεδομένων - mergeset. Αυτή η δομή δεδομένων βελτιστοποιείται ειδικά για τον δείκτη Prometheus labels.

το mergeset έχει τις ακόλουθες διαφορές σε σύγκριση με το LevelDB:

  • Λειτουργεί μόνο σε πλήκτρα. Δεν γνωρίζει τις αξίες.
  • Έχει χαμηλότερη ενίσχυση εγγραφής.
  • Έχει επιδιώξει γρηγορότερα πολλά κλειδιά.
  • Συμπίπτει καλύτερα τα κλειδιά, επομένως χρειάζονται μικρότερο χώρο αποθήκευσης.
  • Παρέχει στιγμιαία στιγμιότυπα δεδομένων και εύκολη δημιουργία αντιγράφων ασφαλείας.
  • Χρησιμοποιεί ιδέες από τον πίνακα MergeTree του ClickHouse.

Σκοπεύουμε να ανοίξουμε mergeset στο εγγύς μέλλον, έτσι ώστε να μπορούν να επωφεληθούν και άλλοι.

Αρχικά, η VictoriaMetrics ήταν μια λύση για ένα διακομιστή. Αργότερα μετασχηματίστηκε σε μια συσπειρωμένη λύση. Μια ενιαία υπηρεσία χωρίστηκε σε τρεις υπηρεσίες κατά τη διάρκεια του μετασχηματισμού:

  • vmstorage - αποθηκεύει τις μετρικές τιμές που λαμβάνονται από vminsert, επιστρέφει τις ακατέργαστες μετρικές τιμές για τα ερωτήματα από το vmselect.
  • vminsert - αποδέχεται μετρήσεις μέσω του API Prometheus remote_write API και τις στέλνει στο vmstorage.
  • vmselect - υλοποιεί το API προτροπής του Prometheus. Λαμβάνει πρωτογενή δεδομένα από vmstorage.

Η διάσπαση παρέχει τα ακόλουθα πλεονεκτήματα:

  • Κάθε υπηρεσία μπορεί να κλιμακωθεί ανεξάρτητα.
  • Κάθε υπηρεσία μπορεί να λειτουργεί με υλικό ιδανικά βελτιστοποιημένο για τις ανάγκες της υπηρεσίας.
  • Τα βαριά ένθετα δεν παρεμποδίζουν τα βαριά επιλεγμένα.
  • Τα σφάλματα στο vminsert δεν σπάνε το vmselect και το αντίστροφο.
  • Καλύτερη ανθεκτικότητα vmstorage, δεδομένου ότι εκφορτώνει πολύπλοκη ερώτηση λογική για vmselect.

Τώρα η VictoriaMetrics εκτελείται στο Google Cloud. Χρησιμοποιούμε την Υποδομή ως προσέγγιση κώδικα για τη διαχείριση πόρων και την παροχή πόρων μέσω του Διαχειριστή Ανάπτυξης.

Μηχανή αναζήτησης

Αρχικά το vmselect παρείχε το API απομακρυσμένης ανάγνωσης Prometheus. Αλλά αυτό δεν ήταν βέλτιστο, αφού το API απαιτούσε τη μεταφορά όλων των ακατέργαστων σημείων δεδομένων στον Prometheus για κάθε ερώτημα. Για παράδειγμα, αν ο Prometheus χτίσει την απόκριση πάνω από μετρήσεις 1Κ με 10K σημεία κάθε φορά, τότε το vmselect θα πρέπει να στείλει 1K * 10K = 10M σημεία δεδομένων στον Prometheus σε κάθε ερώτημα. Αυτό είναι σπατάλη της κυκλοφορίας και των χρημάτων. Έτσι αργότερα το API απομακρυσμένης ανάγνωσης έχει αντικατασταθεί από κινητήρα ερωτήματος πλήρως συμβατό με PromQL.

Η μηχανή ερωτήματος υποστηρίζει πρόσθετα χαρακτηριστικά που στοχεύουν στην απλοποίηση των πολύπλοκων ερωτημάτων. Ακολουθούν μερικά παραδείγματα:

  • ΜΕ πρότυπα που μοιάζουν με κοινές εκφράσεις πίνακα:
ΜΕ (
      commonFilters = {job = ~ "$ job", παράδειγμα = "$ instance"}
  ) node_filesystem_size_bytes {commonFilters} / node_filesystem_avail_bytes {commonFilters}

Διαβάστε περισσότερα σχετικά με τα πρότυπα WITH και παίξτε μαζί τους στην παιδική χαρά WITH templates.

  • Πολλές χρήσιμες λειτουργίες. Για παράδειγμα, συνδικαλιστική συνάρτηση για το συνδυασμό αποτελεσμάτων ερωτήματος:
ένωση(
    node_filesystem_size_bytes,
    node_filesystem_avail_bytes,
)

Ο πλήρης κατάλογος πρόσθετων λειτουργιών είναι διαθέσιμος εδώ.

Στοιχεία απόδοσης

  • Οι αρχικές δοκιμές δείχνουν ότι η VictoriaMetrics χρησιμοποιεί 10x λιγότερο χώρο αποθήκευσης σε σύγκριση με το Prometheus 2,0-0,4 bytes ανά σημείο δεδομένων έναντι 4 bytes ανά σημείο δεδομένων στην περίπτωσή μας. Το σημείο δεδομένων είναι (timestamp, metric_value) πλειάδα.
  • Μια ενιαία υπηρεσία vmstorage δέχεται έως 4 εκατομμύρια δεδομένα ανά δευτερόλεπτο σε διακομιστή 8xCPU.
  • Μία υπηρεσία vmselect σαρώνει έως και 500 εκατομμύρια σημεία δεδομένων ανά δευτερόλεπτο σε διακομιστή 8xCPU.
  • Η VictoriaMetrics χρησιμοποιεί 70x φορές λιγότερο αποθηκευτικό χώρο σε σύγκριση με το TimescaleDB σε δεδομένα δοκιμών από το Time Series Benchmark Suite - 250MB έναντι 18GB. Τα δεδομένα δοκιμής αποτελούνται από σημεία δεδομένων 1Β - ανατρέξτε στην περιγραφή TSBS στο GitHub.
  • Υπάρχει χώρος για βελτιώσεις στην απόδοση. Όλες οι υπηρεσίες της VictoriaMetrics είναι εξοπλισμένες με χειριστή pprof, έτσι είμαστε έτοιμοι να συντονίσουμε τις επιδόσεις τους στο φόρτο εργασίας παραγωγής.

Χαρακτηριστικά VictoriaMetrics

  • Υποστηρίζει το πλήρες PromQL και το εκτεταμένο PromQL με πρότυπα WITH. Η εκτεταμένη PromQL μπορεί να δοκιμαστεί στην παιδική χαρά Grafana.
  • Εύκολη ρύθμιση - απλώς αντιγράψτε-n-επικολλήστε την παρεχόμενη διεύθυνση URL remote_write στο Configuration Prometheus.
  • Μειωμένο λειτουργικό κόστος. Ο Prometheus μπορεί να μετατραπεί σε υπηρεσία ανιθαγείας αφού επιτρέψει τη μακρινή εγγραφή στο VictoriaMetrics.
  • Διατίθεται μεγάλος αριθμός περιόδων διατήρησης - από 1 μήνα έως 5 έτη.
  • Τοποθετήστε κλίμακες απόδοσης σε εκατομμύρια μετρικές τιμές ανά δευτερόλεπτο.
  • Επιλέξτε κλίμακες απόδοσης σε δισεκατομμύρια μετρικές τιμές ανά δευτερόλεπτο.
  • Οι κλίμακες αποθήκευσης σε τρισεκατομμύρια μετρικές αξίες και εκατομμύρια μοναδικές μετρήσεις (γνωστές και ως υψηλές καρδιανότητες).
  • Παρέχει σφαιρική προβολή ερωτημάτων σε έναν αυθαίρετο αριθμό ξεχωριστών στιγμιότυπων Prometheus εάν χρησιμοποιούν την ίδια διεύθυνση URL remote_write.

Ποιος μπορεί να ωφεληθεί από την VictoriaMetrics;

  • Όποιος χρησιμοποιεί τον Προμηθέα. Απλά ρυθμίστε το VictoriaMetrics ως απομακρυσμένο αποθηκευτικό χώρο και σταματήστε να ενοχλείτε τα επιχειρησιακά ζητήματα τοπικής αποθήκευσης, όπως αντίγραφα ασφαλείας, αναπαραγωγή, σχεδιασμό χωρητικότητας και άλλα φορτία συντήρησης.
  • Οι χρήστες αναπτύσσουν τον Προμηθέα στα Kubernetes. Επί του παρόντος, αυτοί οι χρήστες πρέπει να διαχειρίζονται προσεκτικά τους επίμονους τόμους για την τοπική αποθήκευση του Prometheus. Συνήθως, δημιούργησαν τον Προμηθέα ως μια κρατική εφαρμογή, η οποία μπορεί να περιορίσει την Kubernetes στις αποφάσεις προγραμματισμού. Απλώς χρησιμοποιήστε το VictoriaMetrics ως απομακρυσμένο αποθηκευτικό χώρο και εκτελέστε τον Prometheus ως εφαρμογή χωρίς κράτη.
  • Χρήστες με πολλές διακριτές εμφανίσεις Prometheus που βρίσκονται σε διαφορετικά δίκτυα / κέντρα δεδομένων. Το VictoriaMetrics παρέχει παγκόσμια προβολή ερωτημάτων σε όλες τις περιπτώσεις του Prometheus.

Μελλοντικά χαρακτηριστικά

Σκοπεύουμε να εφαρμόσουμε τα ακόλουθα χαρακτηριστικά στο μέλλον:

  • Αυτόματη δειγματοληψία παλαιών δεδομένων.
  • Τελευταίες τιμές για τα φίλτρα της ετικέτας.
  • Χρονομετρητές.

συμπέρασμα

Είμαστε βέβαιοι ότι η VictoriaMetrics θα γίνει το καλύτερο απομακρυσμένο αποθηκευτικό χώρο για τον Prometheus.

Συνεχίστε την εξερεύνηση. Διαβάστε τα FAQ. Εγγραφείτε στην παιδική χαρά VictoriaMetrics, χρησιμοποιήστε την ως απομακρυσμένο αποθηκευτικό χώρο δοκιμών για τις περιπτώσεις Prometheus. Είναι απολύτως ασφαλές, καθώς ο Prometheus συνεχίζει να γράφει δεδομένα σε τοπικό αποθηκευτικό χώρο παράλληλα με την απομακρυσμένη αποθήκευση, έτσι ώστε τα τοπικά σας δεδομένα να μην χάνονται όταν επιτρέπεται η απομακρυσμένη αποθήκευση. Ανατρέξτε στην ενότητα Γρήγορη εκκίνηση για περισσότερες λεπτομέρειες.

Επεξεργασία πινακίδων και γραφημάτων στην παιδική χαρά Grafana. Αυτή η παιδική χαρά χρησιμοποιεί τη βάση δεδομένων VictoriaMetrics που δείχνει εσωτερικές μετρήσεις της παιδικής χαράς της VictoriaMetrics, έτσι ώστε να είναι διαθέσιμες όλες οι λειτουργίες της Extended PromQL.

Η παραγωγή VictoriaMetrics θα είναι σύντομα διαθέσιμη. Μείνετε συντονισμένοι και εξαπλώστε τη λέξη γι 'αυτό!

Ενημέρωση: Οι εικόνες Docker με VictoriaMetrics ενός διακομιστή είναι διαθέσιμες εδώ. Αν δεν σας αρέσει το Docker, χρησιμοποιήστε μόνο τα αντίστοιχα στατικά δυαδικά αρχεία.

Ενημέρωση2: Διαβάστε τη νέα μας δημοσίευση - Υψηλή αξιοπιστία TSDB: VictoriaMetrics vs TimescaleDB vs InfluxDB.

Update3: Η VictoriaMetrics είναι ανοιχτή πηγή τώρα!

Γίνετε μέλος της κοινότητας μας Χαλαρώστε και διαβάστε τα εβδομαδιαία θέματα Faun ⬇

Εάν αυτή η ανάρτηση ήταν χρήσιμη, κάντε κλικ στο πλήκτρο below κάτω από μερικές φορές για να δείξετε την υποστήριξή σας στον συντάκτη! ⬇