Αποθήκευση χρονοσειρών
1) Γιατί μια ξεχωριστή αρχιτεκτονική για χρονοσειρές
Οι χρονοσειρές είναι ακολουθίες ζευγαριών (χρονοσφραγίδα, τιμή) με ετικέτες (ετικέτες), οι οποίες χαρακτηρίζονται από:- Υψηλή ταχύτητα καταγραφής (κατάποση) και συχνότητα.
- Διαβάζει από χρονικές κλίμακες (σάρωση + συγκεντρωτικά στοιχεία/συναρτήσεις παραθύρων).
- Εκρηκτική πληθικότητα λόγω συνδυασμών ετικετών.
- Η ανάγκη κατακράτησης (περιορισμοί διάρκειας ζωής) και μείωσης της δειγματοληψίας (χρονική συμπίεση).
- Ως εκ τούτου - ένα ειδικό μοντέλο αποθήκευσης, μορφότυποι συμπίεσης και πρωτόκολλα αιτήσεων.
2) Μοντέλο δεδομένων και συμβατικές μετρήσεις
2. 1 Ονομασία και ετικέτες
: μοναδικό ρήμα/ουσιαστικό ('http _ αιτήματα _ σύνολο', 'cpu _ χρήση _ δευτερόλεπτα _ σύνολο').
ετικέτες: κλειδιά χαρακτηριστικών ("εργασία", "παράδειγμα", "dc", "po ," κατάσταση "," μέθοδος ").
Αναλλοίωτες: μην αλλάξετε τη σημασιολογία του ονόματος, προσθέστε εκδόσεις ('metric _ v2') με ασύμβατες αλλαγές.
2. 2 Τύποι γραμμών
Gauge, Counter, Histogram/Περίληψη, Event/Span.
Για χρηματοοικονομικά στοιχεία/πυκνότητες - Καθορισμός μονάδων και συγκεντρωτικότητα (άθροισμα/μέσος όρος).
2. 3 Πολιτική διατήρησης και παράτασης
Θερμή λεπτομέρεια (δευτερόλεπτα/1-10 λεπτά) → θερμές μονάδες (5m/1h) → ψυχρές (1d/1w).
Για μετρητές - τιμή αποθήκευσης/συγκεντρωτικά μεγέθη deriv.
3) Διαδρομή καταγραφής: λήψη, ρυθμιστικό διάλυμα, συμπαγής
3. 1 Αγωγός κατάποσης
Ξύστρα (pull, Prometheus) ή ώθηση (OTLP/StatsD/Graphite), συχνά μέσω πύλης/παράγοντα.
Ρυθμιστικό διάλυμα σε WAL (λογάριθμος αναφοράς), κατόπιν συμπίεση σε τμήματα/μπλοκ (αρχιτεκτονική τύπου LSM).
Η παρτίδα και η διαλογή του χρόνου αυξάνουν τη συμπίεση και την ταχύτητα.
3. 2 Χειρισμός εκτός λειτουργίας και λήψη
Παράθυρο ανοχής (παράθυρο καθυστέρησης, για παράδειγμα 5-15 λεπτά) + πολιτική: 'drop
Αφαίρεση με '(series_id, χρονοσφραγίδα)' με έκδοση ή «τελευταία νίκη ρεκόρ».
3. 3 Συμπίεση
Delta-of-delta για χρονοσφραγίδες, Gorilla/XOR για πλωτήρες, RLE και varint για ακέραιους, λεξικό για ετικέτες.
Το βέλτιστο μέγεθος μπλοκ («κομμάτι») των σημείων 1-8K είναι ένας συμβιβασμός μεταξύ IOPS και CPU.
4) Συστήματα αποθήκευσης: TSDB έναντι SQL/στήλες
4. 1 Ειδική TSDB
Prometheus (τοπική, σύντομη κατακράτηση, PromQL, remote_write).
οριζόντια κλιμάκωση, μακρά κατακράτηση, απομακρυσμένη ανάγνωση.
Οι μορφές μπλοκ βελτιστοποιούνται για σάρωση εύρους + συσσώρευση προσφορών.
4. 2 Κινητήρες σχεσιμότητας/στήλης
Χρονοδιάγραμμα DB (PostgreSQL): υπερτάκτες, κομμάτια ανά χρόνο/χώρο, συνεχή συγκεντρωτικά μεγέθη.
ClickHouse: MergeTree/TTL/υλοποιημένες απόψεις, εξαιρετική συμπίεση και συγκέντρωση χρόνου.
Επιλογή - ανά ερωτηματικό οικοσύστημα (SQL/PromQL), απαιτήσεις συμμετοχής/ΔΥ και επιχειρησιακές δεξιότητες της ομάδας.
5) Σχέδιο και παραδείγματα
5. 1 Χρονοδιάγραμμα DB: υπερτάπητος + συνεχές σύνολο
sql
CREATE TABLE metrics_cpu(
ts timestamptz NOT NULL,
host text NOT NULL,
dc text NOT NULL,
usage double precision NOT NULL,
PRIMARY KEY (ts, host, dc)
);
SELECT create_hypertable('metrics_cpu', by_range('ts'), chunk_time_interval => interval '1 day');
-- Continuous unit (5 minutes)
CREATE MATERIALIZED VIEW cpu_5m
WITH (timescaledb. continuous) AS
SELECT time_bucket('5 minutes', ts) AS ts5m, host, dc, avg(usage) AS avg_usage
FROM metrics_cpu GROUP BY 1,2,3;
-- Politicians
SELECT add_retention_policy('metrics_cpu', INTERVAL '14 days');
SELECT add_retention_policy('cpu_5m', INTERVAL '180 days');
5. 2 ClickHouse: Συγκέντρωση αποθήκευσης
sql
CREATE TABLE metrics_cpu (
ts DateTime,
host LowCardinality(String),
dc LowCardinality(String),
usage Float32
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(ts)
ORDER BY (host, dc, ts)
TTL ts + INTERVAL 14 DAY
SETTINGS index_granularity = 8192;
-- Rollup in hourly detail
CREATE MATERIALIZED VIEW cpu_1h
ENGINE = SummingMergeTree()
PARTITION BY toYYYYMM(ts)
ORDER BY (host, dc, ts)
POPULATE AS
SELECT toStartOfHour(ts) AS ts, host, dc, avg(usage) AS usage
FROM metrics_cpu GROUP BY ts, host, dc;
5. 3 Προμηθέας/VictoriaMetrics: remote_write
yaml global:
scrape_interval: 15s remote_write:
- url: http://vminsert:8480/insert/0/prometheus/api/v1/write
6) Καρδινότητα: πώς να μην «ανατινάξετε» την αποθήκη
6. 1 Κανόνες
Οριακή πληθικότητα της ετικέτας (αριθμός μοναδικών τιμών). Δεν περιλαμβάνεται το 'χρήστης _ id', το 'request _ i , το' trace _ id '.
Κανονικοποιήστε τις ετικέτες «πολλαπλών αξιών» (κατηγορίες → κωδικοί).
Χρησιμοποιήστε τύπους LowCardinality (σε CH), λεξικά/δένδρα ετικετών (σε TSDB).
6. 2 Έλεγχοι και προειδοποιήσεις
Μετρικές: 'series _ count', 'label _ value {label}', top-N «ακριβές» σειρές.
Γράψτε πολιτικές αποτυχίας όταν σημειώνεται υπέρβαση του ορίου πληθικότητας ανά ενοικιαστή/θέση εργασίας.
6. 3 Ιστορικά/Ιστογράμματα
Για την υψηλή πληθικότητα, είναι προτιμότερο να αποθηκεύονται συγκεντρωτικά στοιχεία (κουβάδες ιστογράμματος) και προ-κυλίνδρους. ποσοτικά στοιχεία για τον υπολογισμό των επιγραμμικών μεγεθών.
7) Διατήρηση, μείωση της δειγματοληψίας και κλιμακωτή αποθήκευση
7. 1 Πολιτικές
3-30 ημέρες λεπτομέρειας δευτέρου/λεπτού.
Θερμό: 90-365 ημέρες συγκεντρωτικών υλικών 5m/1h.
Κρύο: έτη ημερήσιων μεγεθών, αρχείο αποθήκευσης αντικειμένων (S3/Glacier) με Parquet.
7. 2 Τεχνικοί
Συνεχή μεγέθη (Timescale), υλοποιημένες απόψεις (CH), εργασίες κατακράτησης + ανατροπής (Victoria/M3/Influence).
Κλιμακωτή αποθήκευση: «θερμά μπλοκ» τοπικά, «κρύο» σε αντικείμενο με τοπική κρύπτη.
8) Ερωτήματα και γλώσσες
8. 1 PromQL (παράδειγμα)
promql rate(http_requests_total{job="api",status=~"5.."}[5m])
Αναζήτηση ποσοστού σφάλματος 5xx API.
8. 2 συγκεντρωτικά μεγέθη SQL ανά παράθυρο
sql
SELECT time_bucket('1h', ts) AS hour,
dc, avg(usage) AS avg, max(usage) AS pmax
FROM metrics_cpu
WHERE ts >= now() - interval '24 hours'
GROUP BY 1,2 ORDER BY 1;
8. 3 Ανωμαλίες (σκίτσο)
Z-score/ESD ανά window statistics, STL αποσύνθεση της εποχικότητας· αποθηκεύουν τα αποτελέσματα σε ξεχωριστή σειρά «ανωμαλία = 1/0».
9) Ολοκλήρωση και πρωτόκολλα
OTLP (OpenTelemetry): μετρήσεις/μονοπάτια/αρχεία καταγραφής, εξαγωγείς σε πράκτορες (otel-collector) → TSDB/clickhouse/αντικείμενο.
StatsD/γραφίτης: απλοί μετρητές/χρονοδιακόπτες. διαμεσολαβητής προς την άκρη, στη συνέχεια μετατροπή σε ένα ενιαίο μορφότυπο.
Kafka/NATS: ρυθμιστικό διάλυμα για εκρήξεις κατάποσης, αναπαραγωγή για οπισθοπλήρωση· οι καταναλωτές γράφουν batchami.
text kafka(topic=metrics) -> stream processor (normalize/tags) -> CH INSERT INTO metrics_cpu FORMAT RowBinary
10) Προσβασιμότητα, HA και Ομοσπονδία
Ζεύγη αντιγράφων/TSDB HA ή ομοσπονδία Προμηθέα (περιοχή → παγκόσμιο επίπεδο).
Απομακρυσμένη ανάγνωση/εγγραφή για μακροπρόθεσμη αποθήκευση και κεντρικά ταμπλό.
Shard-by-label/time: ομοιόμορφη κατανομή της κατανάλωσης, τοποθεσία ανά «dc/ενοικιαστή».
11) Παρατηρησιμότητα της ίδιας της αποθήκευσης
11. 1 Μετρήσεις
Εισαγωγή: 'δείγματα/sec', 'append _ latency', 'wal _ fsync _ m .
: 'blocks _ coun Хранение,' compaction _ queue _ len ',' chunk _ compression _ ratio '.
: 'query _ qp Запросы,' scan _ bytes ',' p95/p99 _ latency ',' http _ bytes '.
Cardinality: 'series _ count', top-labels.
11. 2 SLO
«p99 latency for 1h range ≤ 200ms at QPS≤500».
"Κατάποση-σταγόνα ≤ 0. 01% σε διάρρηξη πριν από X δείγματα/sec"
«Εκκρεμότητες συμπίεσης <10 λεπτά».
11. 3 Καταχωρίσεις
Αύξηση 'σειρές _ καταμέτρηση'> Y %/ώρα.
Σειρά αναμονής συμπίεσης/κατώφλι έκπλυσης>.
εκτός τάξης> N%, dedup/late-drops.
12) Ασφάλεια και πολυπλοκότητα
απομόνωση από τον «ενοικιαστή» (επισήμανση σε κλειδιά, μεμονωμένοι πίνακες/βάσεις δεδομένων, ποσοστώσεις).
Απολύμανση ετικετών (απαγόρευση PII), έλεγχος μεγέθους/αξίας.
Κρυπτογράφηση «σε ηρεμία» και στις μεταφορές, έλεγχος πρόσβασης σε «ευαίσθητες» μετρήσεις.
13) Πρακτικές λειτουργίας
Προθέρμανση και κρύο ξεκίνημα: καρφίτσα από «ζεστά» μπλοκ στην κρύπτη, πρόγνωση των τελευταίων N ωρών.
Backfill: μεμονωμένοι αγωγοί χαμηλής προτεραιότητας δεν αναμειγνύονται με το διαδίκτυο.
Έκδοση σχήματος: μετανάστευση με παράλληλη γραφή (διπλή γραφή) και επακόλουθο διακόπτη.
Προϋπολογισμός αποθήκευσης: έλεγχος της «cost _ per _ TB _ μήνα» + πρόβλεψη της αύξησης της πληθικότητας.
14) Αντι-μοτίβα
Ετικέτες με υψηλή πληθικότητα (user_id, uuid) → έκρηξη γραμμών.
«Αιώνιες» σειρές χωρίς συγκράτηση → ανεξέλεγκτη ανάπτυξη.
Καταγραφή μη σφαγής/διαλογής → κακή συμπίεση και καταιγίδα IOPS.
Αναμίξτε OLTP και μακριές σαρώσεις στην ίδια δεξαμενή δίσκων.
Έλλειψη πολιτικής εκτός τάξης → επαναλήψεις και φούσκωμα.
Τα ιστογράμματα με εκατοντάδες κουβάδες κοστίζουν × 10 χωρίς όφελος.
15) Κατάλογος ελέγχου εφαρμογής
- Ορισμός των μετρήσεων, των τύπων και των μονάδων τους. καθορίζει την ονομασία/το σήμα σύμβασης.
- Επιλέξτε τον κινητήρα (TSDB έναντι SQL/στήλη) και τη γλώσσα ερωτημάτων (PromQL/SQL).
- Σχεδιάστε κατακράτηση/κύλιση (ζεστό/ζεστό/κρύο) και ILM.
- Ρύθμιση κατάποσης: WAL/παρτίδες/διαλογή, παράθυρα εκτός λειτουργίας.
- Ενεργοποιήστε τη συμπίεση (delta-of-delta/XOR/RLE), βέλτιστα κομμάτια.
- Έλεγχος της πληθικότητας: ποσοστώσεις, προειδοποιήσεις, πολιτικές εξαίρεσης.
- Διαμόρφωση HA/ομοσπονδία και απομακρυσμένη γραφή/ανάγνωση.
- Ταμιευτήρες SLO και μετρήσεις αποθήκευσης (κατάποση/ερώτηση/αποθήκευση).
- Πολιτικές απομόνωσης ασφάλειας/ενοικιαστών και έλλειψη PII στα σήματα.
- Κανονική «ημέρα παιχνιδιού»: backfill, απώλεια κόμβου, αύξηση της κατανάλωσης.
16) ΣΥΧΝΈΣ ΕΡΩΤΉΣΕΙΣ
Ε: Τι να επιλέξετε για την παρακολούθηση των υποδομών: Προμηθέας ή ClickHouse/Χρονοδιάγραμμα
A: Για εγχώρια παρακολούθηση και PromQL - Προμηθέας + μακροχρόνια αποθήκευση (Victoria/M3). Για σενάρια BI/αποθήκης και SQL - Timescale/ClickHouse.
Ε: Πώς να αποθηκεύσετε ποσοτικά στοιχεία χωρίς βαριές περιλήψεις
A: Χρησιμοποιήστε το ιστόγραμμα με καθαρούς κουβάδες και υπολογίστε τους ποσοτικούς υπολογισμούς όταν τους ζητηθεί. ή t-digest/CKMS σε συγκεντρωτικά στοιχεία.
Ε: Πώς να αντιμετωπίσετε την εκτός τάξης κατάσταση
Α: Εισάγετε το παράθυρο ανοχής (5-15 λεπτά) και την καθορισμένη πολιτική αφαίρεσης. για την τηλεμετρία από κινητό/άκρο - το παράθυρο είναι ευρύτερο.
Ε: Πότε χρειάζεται μια ανατροπή
A: Πάντα> 30-90 ημέρες: τα συγκεντρωτικά στοιχεία μειώνουν το μέγεθος × 10-100 και επιταχύνουν την ανάλυση.
Ε: Είναι δυνατή η ανάμειξη κορμοτεμαχίων και μετρήσεων
A: Αποθηκεύεται χωριστά (οι μορφότυποι/ερωτήματα διαφέρουν). Για συσχέτιση, χρησιμοποιήστε Exemplar/TraceID και ταμπλό, αλλά μην προσθέσετε τα πάντα σε έναν πίνακα.
17) Σύνολα
Αποτελεσματική αποθήκευση χρονοσειρών είναι η σύμβαση μετρήσεων + πειθαρχία ετικετών, ικανή κατάποση (WAL/συμπίεση), συμπίεση και πολιτικές κατακράτησης/ανατροπής. Προσθέστε τον έλεγχο της πληθικότητας, τη NA/ομοσπονδία και την παρατηρησιμότητα του ίδιου του καταστήματος - και παίρνετε προβλέψιμο p95, λογικό κόστος για μήνες έως χρόνια και αυξημένη αντίσταση.