אחסון סדרת זמן
1) מדוע ארכיטקטורה נפרדת לסדרת זמן
סדרות זמן הן רצפים של זוגות (זמן, ערך) עם תגיות (תוויות), אשר מאופיינים על ידי:- מהירות הקלטה גבוהה (בלע) ותדר.
- קריאה לפי טווחי זמן (סריקה + אגרגטים/פונקציות חלון).
- קרדינליות נפיצה עקב צירופי תגים.
- הצורך בשמירה (הגבלות על חיי מדף) ובירידה (דחיסת זמן).
- לכן - מודל אחסון מיוחד, תבניות דחיסה ופרוטוקולי בקשה.
2) מודל נתונים ומדדי חוזה
2. 1 שמות ותגים
metric_name: פועל יחיד/שם עצם (”http _ coses _ total”, ”cpu _ usage _ seconds _ total”).
תוויות: מפתחות מאפיינים (”עבודה”, ”דוגמה”, ”וושינגטון”, ”פוד”, ”סטטוס”, ”שיטה”).
אינווריאנטים: לא לשנות את הסמנטיקה של השם, להוסיף גרסאות (”metric _ v2”) עם שינויים לא מתאימים.
2. 2 סוגי שורות
מד, נגד, היסטוגרמה/תקציר, אירוע/ספאן.
עבור כספים/צפיפות - תיקון יחידות וצבירה (מסוכמים/ממוצעים).
2. 3 מדיניות השמירה וההפעלה
פירוט חם (שניות/10 דקות) * יחידות חמות (5 m/1h) * קרות (1d/1w).
לקצב נגד חנות/deriv aggregates.
3) הקלטת נתיב: קליטה, חציצה, קומפקטית
3. 1 אינבלייט צינור
Scrape (משיכה, פרומתאוס) או Push (OTLP/StaffiD/Graphite), לרוב באמצעות שער/סוכן.
Buffering in WAL (רישום מראש), ולאחר מכן דחיסה למקטעים/בלוקים (ארכיטקטורה דמוית LSM).
חבטות ומיון זמן להגביר דחיסה ומהירות.
3. 2 טיפול לא תקין ולוקח
חלון סובלנות (חלון איחור, לדוגמה 5-15 דקות) + מדיניות: ”טיפה | upsert | לשמור-אחרון”.
שכפול על ידי '(series_id, חותמת זמן)' עם versioning או ”שיא אחרון מנצח”.
3. 3 דחיסה
דלתא-of-delta עבור טיים-סטמפס, גורילה/XOR עבור ריצוף, RLE, ורינט עבור מספרים שלמים, מילון עבור תגיות.
גודל הבלוק האופטימלי (”נתח”) של 1-8K נקודות הוא פשרה בין IOPS ל-CPU.
4) תוכניות אחסון: TSDB נגד SQL/Torns
4. 1 TSDB ייעודי
פרומתאוס (מקומית, שימור קצר, PromQL, remote_write).
VictoriaMetrics/M3/InfluxDB-אופקי, שימור ארוך, קריאה מרחוק.
פורמטי בלוקים מיוטבים עבור סריקת טווח + tending aggregations.
4. 2 מנועי יחס/עמודה
TimescalbDB (PostgreSQL): יתר טבלאות, נתחים על ידי זמן/מרחב, אגרגטים רציפים.
ClickHouse: MergEtree/TTL/Mushed Views, דחיסה מצוינת וצבירת זמן.
מערכת אקולוגית (SQL נגד PromQL), הצטרפות/BI ומיומנויות תפעוליות קבוצתיות.
5) ערכאה ודוגמאות
5. 1 timescils 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 פרומתאוס/ remote_write Metrics:
yaml global:
scrape_interval: 15s remote_write:
- url: http://vminsert:8480/insert/0/prometheus/api/v1/write
6) חשמלית: איך לא ”לפוצץ” את האחסון
6. 1 כללים
הגבלת הקרדינליות (מספר ערכים ייחודיים). אל תכלול את "user _ id'," request _ id', "trace _ id'.
נרמול תגיות ”רב-ערכיות” (קטגוריות = קודים).
השתמש בסוגי LowCardinality (ב-CH), מילונים/תוויות עצים (ב-TSDB).
6. 2 בקרות והתראות
Metrics: "series _ count'," label _ values _ label ", top-N" יקר "שורות.
כתוב מדיניות כישלון כאשר מגבלת הקרדינליות עולה על כל דייר/עבודה.
6. 3 היסטוריות/היסטוגרמות
עבור קרדיטליות גבוהה, עדיף לאחסן דליים (היסטוגרמה) ופרה-רולופ; כמויות לחשב באינטרנט על אגרגטים.
7) שימור, הידרדרות ואחסון
7. 1 מדיניות
3-30 ימים של פרט שני/דקה.
חם: 90-365 ימים של אגרגטים 5m/1h.
קור: שנים של אגרגטים, ארכיון לאחסון אובייקטים (S3/Glacier) עם פרקט.
7. 2 טכנאים
אגרגטים רציפים (Timescale), תצוגות ממשיות (CH), משימות שימור + rollup (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 לפי סטטיסטיקת חלונות, פירוק STL של עונתיות; לאחסן את התוצאות בשורה נפרדת אנומליה = 1/0 '.
9) אינטגרציות ופרוטוקולים
OTLP (OpenTelemetry): metrics/trails/logs, יצואנים על סוכנים (otel-collector) @ TSDB/clickhouse/object.
StashMD/Graphite: ספונטרים/טיימרים פשוטים; פרוקסי לקצה, ואז המרה לפורמט יחיד.
קפקא/NATS: חיץ עבור התפרצויות בלע, הילוך חוזר עבור הילוך אחורי; צרכנים כותבים באצ 'מי.
text kafka(topic=metrics) -> stream processor (normalize/tags) -> CH INSERT INTO metrics_cpu FORMAT RowBinary
10) נגישות, HA ופדרציה
זוגות העתק/TSDB HA או Federation Prometheus (אזור = רמה גלובלית).
קריאה/כתיבה מרחוק עבור אחסון ארוך טווח ולוחות מחוונים מרכזיים.
רסיס על ידי תווית/זמן: הפצה אחידה של בלע, מקומי על ידי 'DC/דייר'.
11) יכולת תצפית של האחסון עצמו
11. 1 מדדים
בלע: "דוגמיות/שניות", "append _ latency", "wal _ fsync _ ms'.
"blocks _ count'," compaction _ תור _ len "," chunk _ compression _ ratio ".
"query _ qps'," scan _ bytes "," p95/p99 _ latency "," alloc _ bytes ".
קרדינליות: "series _ count', תוויות עליונות.
11. 2 SLO
”P99 latency for 1h range master 200ms in QPS 500”.
"בלע-טיפה על 0. 01% התפוצץ לפני דגימות X/שנייה"
”Compaction backlog <10 min”.
11. 3 התראות
גדילה ”סדרה _ ספירה”> Y %/שעה.
תור דחיסה/סומק> סף.
N%, dedup/late-dips.
12) בטיחות וריבוי דירות
בידוד על ידי 'דייר' (תווית במפתחות, טבלאות/מסדי נתונים בודדים, מכסות).
חיטוי תוויות (PII), שליטה בגודל/ערך.
הצפנה ”במנוחה” ובהובלה, ביקורת גישה למדדים ”רגישים”.
13) שיטות הפעלה
התחלה חמה וקרה: סיכה של בלוקים ”חמים” במטמון, משחה מוקדמת של ה-N השעות האחרונות.
גיבוי: צינורות בודדים עם עדיפות נמוכה, לא לערבב עם באינטרנט.
סכימה: נדידה עם כתיבה מקבילה (דו-כתיבה) ומתג לאחר מכן.
תקציב אחסון: בקרה על 'cost _ per _ TB _ Monther' + תחזית לגידול בקרדינליות.
14) אנטי דפוסים
תגיות עם קרדינליות גבוהה (user_id, uid) = פיצוץ שורות.
שורות ”נצחיות” ללא שמירה.
הקלטה ללא חבטות/מיון = = דחיסה לקויה וסופת IOPS.
מערבבים אולטרה-פי וסריקות ארוכות על אותה בריכת דיסק.
חוסר במדיניות לא מסודרת.
היסטוגרמות עם מאות דליים * עלות x 10 ללא תועלת.
15) רשימת מימושים
[ ] מגדירים מדדים, סוגים ויחידות; לתקן את חוזה השם/התווית.
[ ] בחר מנוע (TSDB vs SQL/Tore) ושפת שאילתות (PromQL/SQL).
[ עיצוב ] שימור/רולופ (חם/חם/קר) ו ־ ILM.
[ ] הגדרות בלע: WAL/חבורות/מיון, חלונות מחוץ לסדר.
[ ] הפעלת דחיסה (דלתא-של-דלתא/XOR/RLE), נתחים אופטימליים.
[ בקרת ]: מכסות, התראות, מדיניות opt-out.
[ ] הגדרות HA/פדרציה וכתיבה/קריאה מרחוק.
[ ] לוחות מחוונים ומחסנים (בלע/שאילתה/אחסון).
[ ] מדיניות ביטחון/בידוד דייר והיעדר מח "ש בתוויות.
[ ] רגיל ”יום המשחק”: הילוך אחורי, אובדן צומת, גל בלע.
16) FAQ
Q: מה לבחור עבור ניטור תשתיות: Prometheus או ClickHouse/Timescale?
א. לניטור ילידים ו ־ PromQL - Prometheus + אחסון ארוך טווח (ויקטוריה/M3). לתרחישי BI/מחסן ו SQL - Timescale/ClickHouse.
קיו: כיצד לאחסן כמויות ללא סיכומים כבדים?
א ': השתמש בהיסטוגרמה עם דליים מסודרים וחישב כמויות בעת הצורך; או t-מעכל/CKMS באגרגטים.
קיו: איך להתמודד עם חוסר סדר?
א ': הזן את חלון הסובלנות (5-15 דקות) ומדיניות דטרמיניסטית; לטלמטריה מנייד/קצה - החלון רחב יותר.
קיו: מתי נדרשת תגבורת?
א: תמיד> 30-90 ימים: אגרגטים מפחיתים את הגודל x10-100 ומאיצים אנליטיקה.
ש: האם אפשר לערבב בולי עץ ומדדים?
A: לאחסן בנפרד (הפורמטים/השאילתות שונים). עבור קורלציה, השתמש ב ־ Exemplar/TRACEC ובלוחות מחוונים, אך אל תוסיף הכל לשולחן אחד.
17) סיכומים
אחסון סדרות זמן יעיל הוא metrics contrace + tag discipline, inslegent כשיר (WAL/compaction), דחיסה, ו-reservation/rollup policy. הוספת בקרת קרדינליות, NA/פדרציה ויכולת תצפית של החנות עצמה - ואתה מקבל p95 צפוי, עלות סבירה במשך חודשים עד שנים והתנגדות נחשול.