समय श्रृंखला का भंडारण
1) समय श्रृंखला के लिए एक अलग वास्तुकला क्यों
समय श्रृंखला टैग (लेबल) के साथ जोड़े (टाइमस्टैम्प, मान) के अनुक्रम हैं, जिनकी विशेषता है:- उच्च रिकॉर्डिंग गति (निगरानी) और आवृत्ति।
- समय सीमा के अनुसार पढ़ ता है (स्कैन + समुच्चय/विंडो फ़ंक्शन)।
- टैग संयोजनों के कारण विस्फोटक कार्डिनैलिटी।
- प्रतिधारण (शेल्फ जीवन प्रतिबंध) और डाउनसैम्पलिंग (समय संपीड़न) की आवश्यकता।
- इसलिए - एक विशेष भंडारण मॉडल, संपीड़न प्रारूप और अनुरोध प्रोटोकॉल।
2) डेटा मॉडल और अनुबंध मैट्रिक्स
2. 1 नामकरण और टैग
metric_name: एकवचन क्रिया/संज्ञा ('http _ requests _ total', 'cpu _ usage _ second _ total')।
लेबल: विशेषता कुंजी ('नौकरी', 'उदाहरण', 'डीसी', 'पॉड', 'स्थिति', 'विधि')।
Invariants: नाम के शब्दार्थ को न बदलें, असंगत परिवर्तनों के साथ संस्करण ('metric _ v2') जोड़ें।
2. 2 प्रकार की पंक्तियाँ
गेज, काउंटर, हिस्टोग्राम/सारांश, इवेंट/स्पैन।
वित्तीय/घनत्व के लिए - फिक्स यूनिट और एग्रीगेबिलिटी (अनुमानित/औसत)।
2. 3 प्रतिधारण और रोलअप नीति
गर्म विवरण (सेकंड/1-10 मिनट) → गर्म इकाइयाँ (5m/1h) → ठंड (1d/1w)।
काउंटर - स्टोर दर/डेरिव समुच्चय के लिए।
3) रिकॉर्डिंग पथ: रिसेप्शन, बफरिंग, कॉम्पैक्ट
3. 1 इनगेस्ट-पाइपलाइन
स्क्रेप (पुल, प्रोमेथियस) या पुश (ओटीएलपी/स्टैट्सडी/ग्रेफाइट), अक्सर गेटवे/एजेंट के माध्यम से।
WAL (राइट-फॉरवर्ड लॉग) में बफरिंग, फिर खंडों/ब्लॉकों (LSM जैसी वास्तुकला) में संपीड़ित।
बैचिंग और समय छांटने से संपीड़न और गति बढ़ जाती है।
3. 2 आउट-ऑफ-ऑर्डर हैंडलिंग और लेता है
सहिष्णुता खिड़की (विलंबता खिड़की, उदाहरण के लिए 5-15 मिनट) + नीति: 'ड्रॉप | upsert | कीप-लास्ट'।
वर्शनिंग या "आखिरी रिकॉर्ड जीत" के साथ '(series_id, टाइमस्टैम्प) द्वारा डीडुप्लिकेशन।
3. 3 संपीड़न
टाइमस्टैम्प के लिए डेल्टा-ऑफ-डेल्टा, फ्लोट के लिए गोरिल्ला/XOR, पूर्णांक के लिए RLE और टैग के लिए शब्दकोश।
1-8K बिंदुओं का इष्टतम ब्लॉक आकार ("चंक") IOPS और CPU के बीच एक समझौता है।
4) भंडारण योजनाएं: TSDB बनाम SQL/कॉलम
4. 1 समर्पित टीएसडीबी
Prometheus (स्थानीय, लघु प्रतिधारण, PromQL, remote_write)।
VictoriaMetrics/M3/InfluxDB - क्षैतिज स्केलिंग, लंबा प्रतिधारण, रिमोट पढ़ा।
ब्लॉक प्रारूपों को रेंज स्कैन + टेंडरिंग एकत्रीकरण के लिए अनुकूलित किया जाता है।
4. 2 रिलेशनल/कॉलम इंजन
TimescaleDB (PostgreSQL): हाइपरटेबल्स, समय/स्थान द्वारा चंक, निरंतर समुच्चय।
क्लिकहाउस: मर्गेट्री/टीटीएल/भौतिक दृश्य, उत्कृष्ट संपीड़न और समय एकत्रीकरण।
चयन - क्वेरी इकोसिस्टम (SQL बनाम PromQL) द्वारा, शामिल/BI आवश्यकताओं और टीम परिचालन कौशल।
5) योजना और उदाहरण
5. 1 TimescaleDB: हाइपरटेबल + निरंतर कुल
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 क्लिकहाउस: एग्रीगेटिंग स्टोरेज
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
yaml global:
scrape_interval: 15s remote_write:
- url: http://vminsert:8480/insert/0/prometheus/api/v1/write
6) कार्डिनैलिटी: भंडारण को "उड़ा" कैसे न दें
6. 1 नियम
लेबल कार्डिनैलिटी (अद्वितीय मानों की संख्या) को सीमित करें। 'user _ id', 'requess _ id', 'trace _ id' शामिल नहीं करें.
"बहु-मूल्यवान" टैग (श्रेणियां → कोड) सामान्य करें।
LowCardinality प्रकार (CH में), शब्दकोश/लेबल पेड़ (TSDB में) का उपयोग करें।
6. 2 नियंत्रण और अलर्ट
मेट्रिक्स: 'श्रृंखला _ काउंट', 'लेबल _ मान {लेबल}', टॉप-एन "महंगी" पंक्तियाँ।
जब कार्डिनैलिटी सीमा प्रति किरायेदार/कार्य से अधिक हो तो विफलता नीतियां लिखें।
6. 3 इतिहास/हिस्टोग्राम
हाई-कार्डिनैलिटी के लिए, एग्रीगेट्स (हिस्टोग्राम बाल्टी) और प्री-रोलअप को स्टोर करना बेहतर है; समुच्चय पर ऑनलाइन गणना करने के लिए मात्रा।
7) प्रतिधारण, डाउनसैम्पलिंग और टियर-स्टोरेज
7. 1 नीतियां
गर्म: 3-30 दिन का दूसरा/मिनट विस्तार।
गर्म: 5m/1h समुच्चय के 90-365 दिन।
ठंड: दिन के वर्षों के समुच्चय, Parquet के साथ ऑब्जेक्ट स्टोरेज (S3/Glacier) में संग्रह।
7. 2 तकनीशियन
निरंतर समुच्चय (टाइमस्केल), भौतिक दृश्य (सीएच), प्रतिधारण + रोलअप कार्य (विक्टोरिया/एम 3/प्रभाव)।
Tiered भंडारण: स्थानीय रूप से "हॉट ब्लॉक", स्थानीय कैश के साथ वस्तु में "ठंडा"।
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 विसंगतियाँ (स्केच)
खिड़की के आंकड़ों द्वारा जेड-स्कोर/ईएसडी, मौसमी के एसटीएल अपघटन; परिणामों को एक अलग पंक्ति 'anomaly = 1/0' में संग्रहीत करें।
9) एकीकरण और प्रोटोकॉल
OTLP (OpenTelemetry): मेट्रिक्स/ट्रेल्स/लॉग्स, एजेंटों पर निर्यातक (ओटेल-कलेक्टर) → TSDB/क्लिकहाउस/ऑब्जेक्ट।
StatsD/ग्रेफाइट: सरल काउंटर/टाइमर; किनारे करने के लिए प्रॉक्सी, फिर एक एकल प्रारूप में रूपांतरण।
काफ्का/एनएटीएस: निगला फटने के लिए बफर, बैकफिल के लिए रिप्लेयर; उपभोक्ता बैचमी लिखते हैं।
काफ्का → क्लिकहाउस (छद्म) का उदाहरण:text kafka(topic=metrics) -> stream processor (normalize/tags) -> CH INSERT INTO metrics_cpu FORMAT RowBinary
10) एक्सेसिबिलिटी, एचए और फेडरेशन
प्रतिकृति/टीएसडीबी एचए जोड़े या प्रोमेथियस महासंघ (क्षेत्र → वैश्विक स्तर)।
दीर्घकालिक भंडारण और केंद्रीकृत डैशबोर्ड के लिए रिमोट पढ़ें/लिखें।
शार्ड-बाय-लेबल/समय: 'डीसी/किरायेदार' द्वारा निगलना, इलाके का समान वितरण।
11) भंडारण की अवलोकन क्षमता
11. 1 मेट्रिक्स
इनगेस्ट: 'सैंपल/सेकंड', 'एपेंड _ लेटेंसी', 'wal _ fsync _ ms'।
Хранение: 'ब्लॉक _ काउंट', 'कॉम्पैक्ट _ क्यू _ लेन', 'चंक _ कम्प्रेशन _ रेशियो'।
Запросы: 'query _ qps', 'स्कैन _ बाइट्स', 'p95/p99 _ latency', 'alloc _ bytes'।
कार्डिनैलिटी: 'सीरीज़ _ काउंट', टॉप-लेबल।
11. 2 एसएलओ
"1h रेंज के लिए p99 लेटेंसी 200 ms at पर।"
"इनगेस्ट-ड्रॉप ≤ 0। एक्स नमूने/सेकंड से पहले फटने पर 01%।"
"संपीड़न बैकलॉग <10 मिनट"।
11. 3 अलर्ट
वृद्धि 'श्रृंखला _ count'> Y %/घंटा।
संपीड़न कतार/फ्लश> सीमा।
Доля आउट-ऑफ-ऑर्डर> एन%, डेडअप/लेट-ड्रॉप्स।
12) सुरक्षा और बहु-किरायेदारी
'किरायेदार' द्वारा अलगाव (कुंजियों में लेबल, व्यक्तिगत टेबल/डेटाबेस, कोटा)।
लेबल का स्वच्छता (पीआईआई निषेध), आकार/मूल्य नियंत्रण।
एन्क्रिप्शन "आराम पर" और परिवहन पर, "संवेदनशील" मैट्रिक्स तक पहुंच का ऑडिटिंग।
13) परिचालन अभ्यास
वार्म अप और कोल्ड स्टार्ट: कैश में "हॉट" ब्लॉक का पिन, पिछले एन घंटों का प्रीफेच।
बैकफिल: कम प्राथमिकता वाली व्यक्तिगत पाइपलाइनें, ऑनलाइन के साथ मिश्रण न करें
स्कीमा वर्शनिंग: समानांतर लेखन (दोहरे-लेखन) और बाद के स्विच के साथ पलायन।
भंडारण बजट: कार्डिनैलिटी वृद्धि का 'cost _ per _ TB _ Mather' + पूर्वानुमान का नियंत्रण।
14) एंटी-पैटर्न
उच्च कार्डिनैलिटी (user_id, uuid) के साथ टैग → पंक्तियों का विस्फोट।
प्रतिधारण के बिना "अनन्त" पंक्तियाँ - अनियंत्रित विकास।
नॉन-कसाई/सॉर्टिंग रिकॉर्डिंग → खराब संपीड़न और आईओपीएस तूफान।
एक ही डिस्क पूल पर OLTP और लंबे स्कैन मिलाएं।
आउट-ऑफ-ऑर्डर पॉलिसी की कमी - डुप्लिकेट्स और ब्लोट्स।
सैकड़ों बाल्टियों के साथ हिस्टोग्राम - लाभ के बिना × 10 की लागत।
15) कार्यान्वयन चेकलिस्ट
- मैट्रिक्स, उनके प्रकार और इकाइयों को परिभाषित करें; नाम/लेबल संविदा ठीक करें।
- इंजन (TSDB बनाम SQL/स्तंभ) और क्वेरी भाषा (PromQL/SQL) का चयन करें।
- एक अवधारण/रोलअप (गर्म/गर्म/ठंडा) और ILM डिजाइन करें।
- कॉन्फ़िगर इनगेस्ट: WAL/बैच/सॉर्टिंग, आउट-ऑफ-ऑर्डर विंडो।
- संपीड़न (डेल्टा-ऑफ-डेल्टा/XOR/RLE), इष्टतम चंक चालू करें।
- नियंत्रण कार्डिनैलिटी: कोटा, अलर्ट, ऑप्ट-आउट नीतियां।
- एचए/फेडरेशन और रिमोट-राइट/रीड कॉन्फ़िगर करें।
- एसएलओ डैशबोर्ड और स्टोरेज मेट्रिक्स (इनगेस्ट/क्वेरी/स्टोरेज)।
- सुरक्षा/किरायेदार अलगाव नीतियां और लेबल में पीआईआई की कमी।
- नियमित "गेम डे": बैकफिल, नोड लॉस, निगेटिव सर्ज।
16) एफएक्यू
प्रश्न: बुनियादी ढांचे की निगरानी के लिए क्या चुनना है: प्रोमेथियस या क्लिकहाउस/टाइमस्केल?
A: देशी निगरानी और PromQL के लिए - प्रोमेथियस + दीर्घकालिक भंडारण (विक्टोरिया/M3)। BI/गोदाम परिदृश्यों और SQL - Timescale/ClickHouse के लिए।
प्रश्न: भारी सारांश के बिना मात्रा कैसे संग्रहीत करें?
A: साफ बाल्टी के साथ हिस्टोग्राम का उपयोग करें और अनुरोध करने पर मात्रा की गणना करें; या समुच्चय में टी-डाइजेस्ट/सीकेएमएस।
प्रश्न: आउट-ऑफ-ऑर्डर से कैसे निपटें?
A: सहिष्णुता खिड़की (5-15 मिनट) और नियतात्मक डीडअप नीति दर्ज करें; मोबाइल/एज से टेलीमेट्री के लिए - विंडो व्यापक है।
प्रश्न: रोलअप की आवश्यकता कब है?
A: हमेशा> 30-90 दिन: समुच्चय आकार × 10-100 को कम करते हैं और एनालिटिक्स में तेजी लाते हैं।
प्रश्न: क्या लॉग और मैट्रिक्स को मिलाना संभव है?
A: अलग से स्टोर करें (प्रारूप/प्रश्न अलग हैं)। सहसंबंध के लिए, Exemplar/TraceID और डैशबोर्ड का उपयोग करें, लेकिन सब कुछ एक तालिका में न जोड़ें।
17) कुल
प्रभावी समय श्रृंखला भंडारण मैट्रिक्स अनुबंध + टैग अनुशासन, सक्षम निगरानी (WAL/संपीड़न), संपीड़न और प्रतिधारण/रोलअप नीतियां हैं। कार्डिनैलिटी कंट्रोल, एनए/फेडरेशन और स्टोर की खुद की अवलोकन क्षमता जोड़ें - और आपको महीनों से वर्षों तक उचित लागत और उछाल प्रतिरोध मिलता है।