-
Notifications
You must be signed in to change notification settings - Fork 1
DATA_RETENTION_DOWNSAMPLING
Dieses Dokument beschreibt, wie TaskScheduler fΓΌr automatische Datenaufbewahrung (Retention) und Downsampling von Zeitreihendaten verwendet wird. Das System ersetzt hochauflΓΆsende Datenpunkte automatisch durch niedrigauflΓΆsende Aggregate nach konfigurierbaren ZeitrΓ€umen.
- Speicherexplosion: 1-Sekunden-Datenpunkte verbrauchen enorm viel Speicher
- Lange Aufbewahrungszeiten: Historische Daten werden fΓΌr Analysen benΓΆtigt
- UnnΓΆtige GranularitΓ€t: Nach einem Jahr ist 1s-AuflΓΆsung meist nicht mehr nΓΆtig
Automatisches Ersetzen von hochauflΓΆsenden Daten durch Aggregate:
- 1s-Daten nach 1 Jahr β 1h-Aggregate (Mittelwert, Standardabweichung, Min, Max)
- AuswertungsfΓ€higkeit erhalten: Statistische Eigenschaften bleiben erhalten
- Speicherreduktion: ~99% Einsparung (3600:1 Ratio fΓΌr 1sβ1h)
Szenario: IoT-Sensoren senden 1s-Daten. Nach 1 Jahr wird die hohe AuflΓΆsung nicht mehr benΓΆtigt.
Implementierung:
ScheduledTask downsample_task;
downsample_task.type = ScheduledTask::TaskType::AQL_QUERY;
downsample_task.aql_query = R"(
FOR d IN timeseries
FILTER d.resolution == '1s'
AND d.timestamp < DATE_SUB(NOW(), 1, 'year')
COLLECT
metric = d.metric,
entity = d.entity,
hour = DATE_TRUNC(d.timestamp, 'hour')
AGGREGATE
avg_value = AVG(d.value),
stddev_value = STDDEV(d.value),
min_value = MIN(d.value),
max_value = MAX(d.value),
count = COUNT(d)
INSERT {
metric: metric,
entity: entity,
timestamp: hour,
resolution: '1h',
value: avg_value,
statistics: {
avg: avg_value,
stddev: stddev_value,
min: min_value,
max: max_value,
count: count
}
} INTO timeseries_aggregates
RETURN {metric: metric, points_aggregated: count}
)";
downsample_task.interval = std::chrono::hours(24); // TΓ€glich ausfΓΌhren
scheduler.registerTask(downsample_task);Speichereinsparung:
- Vorher: 31.536.000 Datenpunkte/Jahr (1 pro Sekunde)
- Nachher: 8.760 Datenpunkte/Jahr (1 pro Stunde)
- Einsparung: 99,97%
Szenario: Gestaffelte Aufbewahrung mit verschiedenen AuflΓΆsungen.
Policy:
- 0-7 Tage: 1s-AuflΓΆsung (Echtzeit-Analysen)
- 7 Tage - 3 Monate: 1m-AuflΓΆsung (detaillierte Historie)
- 3 Monate - 1 Jahr: 1h-AuflΓΆsung (Trendanalysen)
- > 1 Jahr: 1d-AuflΓΆsung (Langzeit-Archiv)
Speichereinsparung:
Tier 1 (0-7d): 1s β 100% der Daten
Tier 2 (7d-3m): 1m β ~1,67% (60:1)
Tier 3 (3m-1y): 1h β ~0,03% (3600:1)
Tier 4 (>1y): 1d β ~0,001% (86400:1)
Durchschnittliche Speichereinsparung ΓΌber 5 Jahre: ~95%
Szenario: Verschiedene Metriken haben unterschiedliche Anforderungen.
Beispiel:
- Temperatur: 1s β 1h nach 1 Jahr (niedrige Varianz)
- Druck: 1s β 15m nach 90 Tagen (hΓΆhere Varianz)
- Vibration: 1s β 5m nach 30 Tagen (sehr hohe Varianz)
- Status: Keine Aggregation (diskrete Werte)
Konfiguration:
// Temperatur-Policy
ScheduledTask temp_policy;
temp_policy.parameters = {
{"metric", "temperature"},
{"source_resolution", "1s"},
{"target_resolution", "1h"},
{"retention_days", 365}
};
// Druck-Policy
ScheduledTask pressure_policy;
pressure_policy.parameters = {
{"metric", "pressure"},
{"source_resolution", "1s"},
{"target_resolution", "15m"},
{"retention_days", 90}
};Bei Aggregation werden folgende Statistiken berechnet und gespeichert:
{
"timestamp": "2024-01-01T12:00:00Z",
"resolution": "1h",
"value": 23.5, // Durchschnittswert
"statistics": {
"avg": 23.5,
"stddev": 1.2, // Standardabweichung
"min": 21.0, // Minimum
"max": 25.8, // Maximum
"count": 3600, // Anzahl Originaldatenpunkte
"sum": 84600.0 // Summe (fΓΌr weitere Aggregation)
}
}Mit Aggregaten mΓΆglich: β Trendanalysen (Moving Averages) β Anomalie-Detektion (Outliers via Stddev) β Min/Max-Analysen β Volumenanalysen (Count, Sum) β Histogramme (mit Stddev-SchΓ€tzung) β Korrelationsanalysen
EingeschrΓ€nkt:
| Aggregation | Datenverlust | AnalysefΓ€higkeit |
|---|---|---|
| 1s β 1m | Minimal | 99% erhalten |
| 1s β 1h | Gering | 95% erhalten |
| 1s β 1d | Moderat | 85% erhalten |
Empfehlung: FΓΌr langfristige Archive ist 1h-AuflΓΆsung ein guter Kompromiss zwischen Speicher und AnalysefΓ€higkeit.
# config.yaml
retention_policies:
# Globale Einstellungen
enabled: true
check_interval_hours: 24
# Policy-Definitionen
policies:
- name: "temperature_yearly"
metric_pattern: "temperature_*"
source_resolution: "1s"
target_resolution: "1h"
retention_days: 365
statistics: ["avg", "stddev", "min", "max"]
- name: "pressure_quarterly"
metric_pattern: "pressure_*"
source_resolution: "1s"
target_resolution: "15m"
retention_days: 90
statistics: ["avg", "stddev", "min", "max"]
- name: "vibration_monthly"
metric_pattern: "vibration_*"
source_resolution: "1s"
target_resolution: "5m"
retention_days: 30
statistics: ["avg", "stddev", "min", "max", "p95"]
# Multi-Tier Policy
multi_tier:
enabled: true
tiers:
- resolution: "1s"
retention_days: 7
- resolution: "1m"
retention_days: 90
- resolution: "1h"
retention_days: 365
- resolution: "1d"
retention_days: -1 # Forever// Retention-Policy aus Config laden
struct RetentionConfig {
std::string name;
std::string metric_pattern;
std::string source_resolution;
std::string target_resolution;
int retention_days;
std::vector<std::string> statistics;
};
void configureRetentionPolicies(
TaskScheduler& scheduler,
const std::vector<RetentionConfig>& policies
) {
for (const auto& policy : policies) {
ScheduledTask task;
task.name = policy.name;
task.type = ScheduledTask::TaskType::FUNCTION;
task.function_name = "apply_retention_policy";
task.parameters = {
{"metric", policy.metric_pattern},
{"source_resolution", policy.source_resolution},
{"target_resolution", policy.target_resolution},
{"retention_days", policy.retention_days},
{"statistics", policy.statistics}
};
task.interval = std::chrono::hours(24);
scheduler.registerTask(task);
}
}Metriken:
-
retention_raw_records_total- Anzahl Rohdatenpunkte -
retention_aggregated_records_total- Anzahl Aggregate -
retention_storage_savings_bytes- Eingesparter Speicher -
retention_compression_ratio- KompressionsverhΓ€ltnis -
retention_policy_executions_total- Policy-AusfΓΌhrungen -
retention_policy_execution_duration_seconds- AusfΓΌhrungszeit
Grafana Dashboard:
{
"panels": [
{
"title": "Storage Savings Over Time",
"targets": [
{
"expr": "retention_storage_savings_bytes / 1024 / 1024 / 1024"
}
]
},
{
"title": "Compression Ratio by Resolution",
"targets": [
{
"expr": "retention_compression_ratio"
}
]
}
]
}=== Storage Savings Report ===
Period: Last 365 days
Raw Data (1s):
- Records: 31,536,000
- Storage: 3,000 MB
Aggregated Data (1h):
- Records: 8,760
- Storage: 1.3 MB
Savings:
- Compression Ratio: 3600:1
- Storage Saved: 2,998.7 MB (99.96%)
- Cost Saved: ~$30/month (cloud storage)
// Immer erst aggregieren, dann lΓΆschen
ScheduledTask aggregate_task;
aggregate_task.id = "aggregate_old_data";
// ... Aggregation logic ...
ScheduledTask cleanup_task;
cleanup_task.id = "cleanup_aggregated_data";
cleanup_task.aql_query = R"(
// Nur lΓΆschen wenn Aggregate existieren
FOR d IN timeseries
FILTER d.resolution == '1s'
LET aggregate_exists = (
FOR a IN timeseries_aggregates
FILTER a.timestamp == DATE_TRUNC(d.timestamp, 'hour')
LIMIT 1
RETURN 1
)
FILTER LENGTH(aggregate_exists) > 0
REMOVE d IN timeseries
)";// Besser: Stufenweise aggregieren (1s β 1m β 1h)
// Schlechteres: Direkt (1s β 1h)
// Vorteil: Bessere Zwischenstufen fΓΌr Analysen// Grace Period: 1 Tag extra behalten fΓΌr Sicherheit
FILTER d.timestamp < DATE_SUB(NOW(), 366, 'days') // 1 Jahr + 1 Tag// Nur einen Tag pro Run verarbeiten (fΓΌr Performance)
FILTER d.timestamp BETWEEN
DATE_SUB(NOW(), 366, 'days') AND
DATE_SUB(NOW(), 365, 'days')// Option 1: Zeitbasierte Batches (empfohlen)
FOR d IN timeseries
FILTER d.timestamp BETWEEN '2023-01-01' AND '2023-01-02'
// Verarbeite 1 Tag pro Task
// Option 2: Count-basierte Batches
FOR d IN timeseries
LIMIT 100000
// Verarbeite max 100k Datenpunkte pro Task-- Erstelle Indices fΓΌr effiziente Queries
CREATE INDEX idx_ts_resolution ON timeseries(resolution, timestamp);
CREATE INDEX idx_ts_metric ON timeseries(metric, timestamp);TaskScheduler::Config config;
config.max_concurrent_tasks = 8; // Mehrere Policies parallelAnnahmen:
- 100 Sensoren
- 1 Datenpunkt/Sekunde/Sensor
- 100 Bytes/Datenpunkt
- 5 Jahre Aufbewahrung
Ohne Retention:
100 Sensoren Γ 31.536.000 Punkte/Jahr Γ 5 Jahre Γ 100 Bytes
= 1.576.800.000.000 Bytes = 1.468 TB
Cloud-Kosten: ~$30.000/Jahr
Mit Multi-Tier Retention:
Tier 1 (0-7d): 100 Γ 604.800 Γ 100 Bytes = 5,8 GB
Tier 2 (7d-3m): 100 Γ 119.520 Γ 100 Bytes = 1,1 GB
Tier 3 (3m-1y): 100 Γ 7.884 Γ 100 Bytes = 75 MB
Tier 4 (>1y): 100 Γ 1.460 Γ 100 Bytes Γ 4 = 58 MB
Total: ~7 GB
Cloud-Kosten: ~$150/Jahr
Einsparung: 99,5% ($29.850/Jahr)
- Massive Speichereinsparung: 95-99% fΓΌr langfristige Daten
- AuswertungsfΓ€higkeit erhalten: Statistische Eigenschaften bleiben
- Automatisiert: Keine manuelle Intervention nΓΆtig
- Konfigurierbar: Flexible Policies pro Metrik
- Skalierbar: Multi-Tier-Ansatz fΓΌr groΓe Datenmengen
- Start konservativ: 1s β 1h nach 1 Jahr fΓΌr alle Metriken
- Monitoring aufsetzen: Storage Savings Dashboard
- Schrittweise optimieren: Metrik-spezifische Policies hinzufΓΌgen
- Backups: Immer vor Deletion testen
- Grace Period: 1 Tag extra Puffer
- Retention-Policies in
config.yamldefinieren - TaskScheduler mit Policies starten
- Monitoring-Dashboard einrichten
- Nach 1 Monat: Savings analysieren und optimieren
- Nach 3 Monaten: Multi-Tier-Policy evaluieren
- Beispiel-Code:
examples/data_retention_downsampling_example.cpp - TaskScheduler-Doku:
docs/de/scheduler/TASK_SCHEDULER.md - Konfiguration:
config.yaml(retention_policies Sektion)
ThemisDB 1.9.0-beta Β· Home Β· Wiki-Index Β· Module-Index Β· FAQ Β· Quick-Reference Β· GitHub Β· Issues Β· Discussions Β· License
- Batch Operations
- Best Practices
- CRUD Tutorial
- Custom Document Ingestion
- Getting Started Tutorial
- Interactive Examples
- Schema Design
- Video Tutorials
- AQL Reference
- AQL Examples
- AQL Overview
- AQL Feature Roadmap
- AQL Geospatial Guide
- AQL LLM Migration Guide
- AQL API
- AQL Grammar (EBNF)
- AQL Root Overview
- AQL Examples (root)
- API Reference
- API Module README
- OpenAPI Overview
- Client SDK Overview
- SDK Overview
- Operations
- Operations Overview
- Operations Runbook
- Operations Handbook
- ThemisCtl Admin Guide
- Pipeline E2E SOPs
- Deploy Overview
- Docker Overview
- Docker Hub README
- Helm Overview
- Packaging Overview
- Operator Overview
- Security Policy
- Production Hardening Checklist
- Security Hardening Guide
- Encryption Key Management
- Access Control Framework
- Zero Trust Policy
- API Authentication & Authorization
- HSM Production Setup
- PKCS11 Integration
- DSGVO / SOC2 Checklist
- Access Model Runbooks
- Access Model Dashboard
- Maturity Automation Runbook
- Access Review Automation
- Access Model Dashboard
- Access Model Runbooks
- Rights Revocation
- Dr Checklists
- Dr Testing
- Incident Response Playbook
- Incident Response Testing
- GPU Oom Recovery
- Grammar Debugging
- Metrics Scrape Troubleshooting
- Model Swap Procedure
- Quota Tuning
- Subagent Deployment
- Logging Configuration
- Content Model
- Crypto & Keys
- Feature Flags Reference
- Modular Architecture Roadmap
- Modularization Guide
- Module Architecture Index
- PostgreSQL Wire Protocol
- Query Scheduling
- Raft Consensus Design
- Resource Pooling
- Source Directory Guide
- Unified Access Model
- E1 001 Layered Retrieval Design
- E1 002 Ann Abstraction Strategy
- E1 003 Tensor Summary Types
- E1 004 Lora Package Distinction
- E1 005 Model Switch Compatibility
- E1 006 Federated Tensor Summaries
- E2 001 Evaluation Framework Design
- E2 002 Hardware Profile Strategy
- E2 003 Query Planner Routing Model
- E2 004 Approximation Governance Rules
- E2 005 Cross Layer Fallback Confidence Policy
- E3 001 Distributed Tensor Design
- E3 002 Manifest Coordination Strategy
- E3 003 Recovery And Erasure Choice
- E3 004 Tensor Fabric Infrastructure
- Contributing
- Contributing (root)
- Code of Conduct
- Support
- Maintainers
- CTest Guide
- Build Quick Reference
- Developer Wiki Index
- Build / Test / CI
- Module Index
- Branching Strategy
- Disabled Stub Policy
- Docs PR Policy
- GA Promotion Sign Off
- Github Milestones Setup
- Maturity Claim Verification Checklist
- Maturity Evidence Registry
- Merge Gate Bot Config
- Merge Gate Status Live
- Phase 1 Closure Report
- Phase Closure Policy
- Phase Dependency Graph
- Phase3 Enforcement Runbook
- Plugin Submodule Rollback
- PR Version Targeting
- PR Version Targeting Backfill
- Production Ready 2026 Delivery Plan
- Query Module Status
- Readme
- Release Promotion Gate Policy
- Release Validation Checklist
- Security Module 5671 Evidence Summary
- Sharding P6 Residual Risk Acceptance
- Sourcecode Compliance Governance
- Updates Development Status Sign Off
- Wave C Implementation Complete
- Blob Storage
- Cuda
- Ethics Ai
- Exporters
- Huggingface
- Image Analysis
- Importers
- RPC
- Scraper
- Themisdb Ai Watermark Detector
- User Storage Encrypted
- Chimera Architecture
- Chimera Future
- Chimera Readme
- Chimera Roadmap
- Covina Fastapi Ingestion Architecture
- Covina Fastapi Ingestion Future
- Covina Fastapi Ingestion Roadmap
- Vcc Base Architecture
- Vcc Base Future
- Vcc Base Roadmap
- Vcc Clara Ingestion Architecture
- Vcc Clara Ingestion Future
- Vcc Clara Ingestion Roadmap
- Vcc Veritas Architecture
- Vcc Veritas Future
- Vcc Veritas Roadmap
- 01 Hello World
- 02 Todo App
- 03 Contact Manager
- 04 Inventory System
- 05 Time Series Monitor
- 06 Graph Social Network
- 07 Vector Search Documents
- 08 Dms Erp System
- 09 Iot Sensor Network
- 10 Drone Image Analysis
- 11 Blog Wiki
- 12 Expense Tracker
- 13 Recipe Manager
- 14 Ecommerce Catalog
- 15 Event Management
- 16 Kanban Board
- 17 Crm
- 18 Realtime Chat
- 19 Recommendation Engine
- 20 Smart Home
- 21 Coding Platform
- 22 AQL Diagram Tool
- 23 Traveling Salesman
- 24 Moral Philosophy Debates
- API Versioning
- Distributed Sharding
- Feedback Plugins
- Geo
- Gnn
- Image Analysis
- Legal Lora Training
- LLM
- Lora Sync
- Migration
- Nlp
- Performance
- Railway
- Replication
- Rope Visualization
- Sample Product Config
- Security
- Client SDK Overview
- Quickstart
- Sdk Enhancements
- Sdk Implementation Summary
- Test Suite Readme
- Go
- Java
- Javascript
- Php
- Python
- Ruby
- Rust
- Typescript
- 01 Grundlegende Operationen
- 02 AQL Queries
- 03 Graph Daten
- 04 Multimodell Anwendung
- 01 Quickstart Guide
- 02 AQL Referenz Kurzuebersicht
- 03 Datenmodellierung Guide
- 04 Uebungsaufgaben
- 05 Best Practices Guide
- Training Documents
- Training Overview
- 01 Einfuehrung Und Uebersicht
- 02 Datenmodelle Und Architektur
- 03 AQL Abfragesprache
- 04 Installation Und Setup
- 05 Anwendungsbeispiele
- Training Presentations
- Dependencies Readme
- Processmonitor Readme
- Themis.admintools.shared Readme
- Themis.aqlquerybuilder Readme
- Themis.aqlquerybuilder Roadmap
- Themis.auditlogviewer Readme
- Themis.auditlogviewer Roadmap
- Themis.classificationdashboard Readme
- Themis.classificationdashboard Roadmap
- Themis.compliancereports Readme
- Themis.compliancereports Roadmap
- Themis.gisviewer.controlpanel Readme
- Themis.gisviewer.controlpanel Roadmap
- Themis.impactanalysisviewer Readme
- Themis.impactanalysisviewer Roadmap
- Themis.ingestiontool Readme
- Themis.ingestiontool Roadmap
- Themis.keyrotationdashboard Readme
- Themis.keyrotationdashboard Roadmap
- Themis.piimanager Readme
- Themis.piimanager Roadmap
- Themis.retentionmanager Readme
- Themis.retentionmanager Roadmap
- Themis.sagaverifier Readme
- Themis.sagaverifier Roadmap
- Themis.usbadmintool Readme
- Themis.usbadmintool Roadmap
- CI Readme
- CI Roadmap
- Compiler Diagnostics Readme
- Compiler Diagnostics Roadmap
- Completion Readme
- Copilot Ollama Router Readme
- Copilot Ollama Router Roadmap
- Gnn Readme
- Gnn Roadmap
- Rope Visualizer Readme
- Rope Visualizer Roadmap
- Tco Calculator Readme
- Tco Calculator Roadmap
- Tests Readme
- Tests Roadmap
- Themis Config Wx Readme
- Themis Docs Builder Readme
- Wikipedia Ingestion Readme