Time-Series Datenbanken | Enjyn Gruppe
Hallo Welt
Hallo Welt
Original Lingva Deutsch
Übersetzung wird vorbereitet...
Dieser Vorgang kann bis zu 60 Sekunden dauern.
Diese Seite wird erstmalig übersetzt und dann für alle Besucher gespeichert.
0%
DE Zurück zu Deutsch
Übersetzung durch Lingva Translate

235 Dokumentationen verfügbar

Wissensdatenbank

Time Series Datenbanken

Zuletzt aktualisiert: 20.01.2026 um 11:26 Uhr

Time-Series Datenbanken

Time-Series Datenbanken sind optimiert für zeitgestempelte Daten. Lernen Sie InfluxDB, TimescaleDB und Prometheus für Metriken, IoT und Monitoring einzusetzen.

Was sind Time-Series Daten?

┌─────────────────────────────────────────────────────────────┐
│                  TIME-SERIES DATA                           │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   Daten mit Zeitstempel, die sich kontinuierlich anhäufen  │
│                                                             │
│   ┌─────────────────────────────────────────────────────┐  │
│   │ timestamp           │ metric    │ value  │ tags    │  │
│   │─────────────────────┼───────────┼────────┼─────────│  │
│   │ 2024-01-15 10:00:00 │ cpu_usage │ 45.2   │ host=a  │  │
│   │ 2024-01-15 10:00:01 │ cpu_usage │ 47.8   │ host=a  │  │
│   │ 2024-01-15 10:00:02 │ cpu_usage │ 43.1   │ host=a  │  │
│   │ 2024-01-15 10:00:00 │ cpu_usage │ 32.5   │ host=b  │  │
│   │ ...                 │ ...       │ ...    │ ...     │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   CHARAKTERISTIKEN:                                         │
│   • Zeitstempel ist Primary Key                            │
│   • Daten werden selten aktualisiert (append-only)         │
│   • Hohe Schreibrate                                       │
│   • Zeitbasierte Abfragen (letzte Stunde, Tag, etc.)      │
│   • Aggregationen (AVG, MAX, MIN pro Zeitfenster)         │
│                                                             │
│   USE CASES:                                                │
│   • Server/Application Monitoring                          │
│   • IoT Sensordaten                                        │
│   • Finanzielle Zeitreihen (Aktienkurse)                  │
│   • User Analytics / Events                                │
│   • Log-Aggregation                                        │
│                                                             │
└─────────────────────────────────────────────────────────────┘

InfluxDB

# Docker
docker run -d -p 8086:8086 \
  -v influxdb-data:/var/lib/influxdb2 \
  influxdb:2.7

# InfluxDB CLI
influx setup \
  --username admin \
  --password password123 \
  --org myorg \
  --bucket metrics \
  --force

# Daten schreiben (Line Protocol)
# measurement,tag1=value1,tag2=value2 field1=value1,field2=value2 timestamp

influx write \
  --bucket metrics \
  --org myorg \
  'cpu,host=server01,region=eu usage=45.2,system=12.3 1705312800000000000'
// Flux Query Language

// Daten der letzten Stunde
from(bucket: "metrics")
  |> range(start: -1h)
  |> filter(fn: (r) => r._measurement == "cpu")
  |> filter(fn: (r) => r.host == "server01")

// Durchschnitt pro 5 Minuten
from(bucket: "metrics")
  |> range(start: -24h)
  |> filter(fn: (r) => r._measurement == "cpu")
  |> filter(fn: (r) => r._field == "usage")
  |> aggregateWindow(every: 5m, fn: mean)

// Gruppiert nach Host
from(bucket: "metrics")
  |> range(start: -1h)
  |> filter(fn: (r) => r._measurement == "cpu")
  |> group(columns: ["host"])
  |> mean()

// Downsampling für langfristige Speicherung
from(bucket: "metrics")
  |> range(start: -30d)
  |> filter(fn: (r) => r._measurement == "cpu")
  |> aggregateWindow(every: 1h, fn: mean)
  |> to(bucket: "metrics_monthly", org: "myorg")
// Node.js Client
const { InfluxDB, Point } = require('@influxdata/influxdb-client');

const client = new InfluxDB({
    url: 'http://localhost:8086',
    token: 'your-token'
});

// Schreiben
const writeApi = client.getWriteApi('myorg', 'metrics');

const point = new Point('cpu')
    .tag('host', 'server01')
    .tag('region', 'eu')
    .floatField('usage', 45.2)
    .floatField('system', 12.3);

writeApi.writePoint(point);
await writeApi.close();

// Lesen
const queryApi = client.getQueryApi('myorg');
const query = `
    from(bucket: "metrics")
    |> range(start: -1h)
    |> filter(fn: (r) => r._measurement == "cpu")
`;

for await (const { values, tableMeta } of queryApi.iterateRows(query)) {
    const row = tableMeta.toObject(values);
    console.log(row);
}

TimescaleDB (PostgreSQL Extension)

-- Docker
-- docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=password timescale/timescaledb:latest-pg15

-- Extension aktivieren
CREATE EXTENSION IF NOT EXISTS timescaledb;

-- Normale Tabelle erstellen
CREATE TABLE metrics (
    time        TIMESTAMPTZ NOT NULL,
    host        TEXT NOT NULL,
    cpu_usage   DOUBLE PRECISION,
    memory_usage DOUBLE PRECISION
);

-- In Hypertable konvertieren (automatische Partitionierung)
SELECT create_hypertable('metrics', 'time');

-- Optional: Chunk-Intervall setzen (Default: 7 Tage)
SELECT set_chunk_time_interval('metrics', INTERVAL '1 day');

-- Index für häufige Queries
CREATE INDEX ON metrics (host, time DESC);
-- Daten einfügen (wie normales SQL)
INSERT INTO metrics (time, host, cpu_usage, memory_usage)
VALUES
    (NOW(), 'server01', 45.2, 62.1),
    (NOW(), 'server02', 32.8, 55.3);

-- Standard SQL Queries funktionieren
SELECT * FROM metrics
WHERE host = 'server01'
  AND time > NOW() - INTERVAL '1 hour'
ORDER BY time DESC
LIMIT 100;

-- Time Bucket Aggregation (TimescaleDB Funktion)
SELECT
    time_bucket('5 minutes', time) AS bucket,
    host,
    AVG(cpu_usage) as avg_cpu,
    MAX(cpu_usage) as max_cpu
FROM metrics
WHERE time > NOW() - INTERVAL '24 hours'
GROUP BY bucket, host
ORDER BY bucket DESC;

-- Continuous Aggregates (Materialized Views für Time-Series)
CREATE MATERIALIZED VIEW metrics_hourly
WITH (timescaledb.continuous) AS
SELECT
    time_bucket('1 hour', time) AS bucket,
    host,
    AVG(cpu_usage) as avg_cpu,
    AVG(memory_usage) as avg_memory
FROM metrics
GROUP BY bucket, host
WITH NO DATA;

-- Refresh Policy
SELECT add_continuous_aggregate_policy('metrics_hourly',
    start_offset => INTERVAL '3 hours',
    end_offset => INTERVAL '1 hour',
    schedule_interval => INTERVAL '1 hour');

-- Automatische Datenlöschung (Retention)
SELECT add_retention_policy('metrics', INTERVAL '30 days');

Prometheus

# prometheus.yml
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node'
    static_configs:
      - targets: ['node-exporter:9100']

  - job_name: 'myapp'
    static_configs:
      - targets: ['myapp:8080']
    metrics_path: '/metrics'
// PromQL Queries

// Aktuelle CPU Auslastung
node_cpu_seconds_total{mode="idle"}

// Rate (Änderung pro Sekunde)
rate(http_requests_total[5m])

// Durchschnitt über Zeit
avg_over_time(node_memory_Active_bytes[1h])

// Aggregation über Labels
sum by (instance) (rate(http_requests_total[5m]))

// Percentiles (Histogramme)
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))

// Alerting Rules (prometheus/rules.yml)
groups:
  - name: example
    rules:
      - alert: HighCPU
        expr: 100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High CPU usage on {{ $labels.instance }}"
// Node.js: Metriken exponieren

const client = require('prom-client');

// Default Metriken (CPU, Memory, etc.)
client.collectDefaultMetrics();

// Custom Counter
const httpRequestCounter = new client.Counter({
    name: 'http_requests_total',
    help: 'Total HTTP requests',
    labelNames: ['method', 'path', 'status']
});

// Custom Histogram
const httpRequestDuration = new client.Histogram({
    name: 'http_request_duration_seconds',
    help: 'HTTP request duration',
    labelNames: ['method', 'path'],
    buckets: [0.01, 0.05, 0.1, 0.5, 1, 5]
});

// Middleware
app.use((req, res, next) => {
    const end = httpRequestDuration.startTimer({ method: req.method, path: req.path });
    res.on('finish', () => {
        end();
        httpRequestCounter.inc({ method: req.method, path: req.path, status: res.statusCode });
    });
    next();
});

// Metrics Endpoint
app.get('/metrics', async (req, res) => {
    res.set('Content-Type', client.register.contentType);
    res.end(await client.register.metrics());
});

Vergleich

Datenbank Stärken Use Case
InfluxDB Einfach, schnell, gute Kompression IoT, allgemeine Metriken
TimescaleDB SQL, PostgreSQL Ökosystem, JOINs Wenn SQL benötigt, Hybrid-Daten
Prometheus Pull-basiert, Alerting, Kubernetes Infrastructure Monitoring
ClickHouse Sehr schnell, Analytics Große Datenmengen, Analytics

Retention und Downsampling

DATEN-LEBENSZYKLUS

┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   RAW DATA (15s Intervall)                                 │
│   ├── Letzte 7 Tage: Volle Auflösung                      │
│   │                                                         │
│   ▼                                                         │
│   AGGREGATED (5 Minuten)                                   │
│   ├── 7-30 Tage: 5-Minuten Durchschnitte                  │
│   │                                                         │
│   ▼                                                         │
│   AGGREGATED (1 Stunde)                                    │
│   ├── 30-365 Tage: Stündliche Durchschnitte               │
│   │                                                         │
│   ▼                                                         │
│   DELETED                                                   │
│   └── Älter als 365 Tage: Gelöscht                        │
│                                                             │
└─────────────────────────────────────────────────────────────┘

VORTEILE:
• Speicherplatz sparen
• Queries auf alte Daten schneller
• Detaillierte aktuelle Daten behalten
-- TimescaleDB: Continuous Aggregates + Retention

-- Stündliche Aggregation
CREATE MATERIALIZED VIEW metrics_hourly
WITH (timescaledb.continuous) AS
SELECT
    time_bucket('1 hour', time) AS bucket,
    host,
    AVG(value) as avg_value,
    MAX(value) as max_value,
    MIN(value) as min_value
FROM metrics
GROUP BY bucket, host;

-- Raw Data: 7 Tage behalten
SELECT add_retention_policy('metrics', INTERVAL '7 days');

-- Aggregierte Daten: 1 Jahr behalten
SELECT add_retention_policy('metrics_hourly', INTERVAL '365 days');
💡 Empfehlungen: 1. Monitoring: Prometheus + Grafana
2. IoT/Sensoren: InfluxDB oder TimescaleDB
3. SQL benötigt: TimescaleDB
4. Retention Policies von Anfang an planen
5. Downsampling für langfristige Speicherung

Weitere Informationen

Enjix Beta

Enjyn AI Agent

Hallo 👋 Ich bin Enjix — wie kann ich dir helfen?
120