Logo GH

אחסון סדרת זמן

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: חיץ עבור התפרצויות בלע, הילוך חוזר עבור הילוך אחורי; צרכנים כותבים באצ 'מי.

דוגמה ל ־ Kafka # ClickHouse (פסאודו):
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 צפוי, עלות סבירה במשך חודשים עד שנים והתנגדות נחשול.

Contact

צרו קשר

פנו אלינו בכל שאלה או צורך בתמיכה.אנחנו תמיד כאן כדי לעזור.

התחלת אינטגרציה

Email הוא חובה. Telegram או WhatsApp — אופציונליים.

השם שלכם לא חובה
Email לא חובה
נושא לא חובה
הודעה לא חובה
Telegram לא חובה
@
אם תציינו Telegram — נענה גם שם, בנוסף ל-Email.
WhatsApp לא חובה
פורמט: קידומת מדינה ומספר (לדוגמה, +972XXXXXXXXX).

בלחיצה על הכפתור אתם מסכימים לעיבוד הנתונים שלכם.