← Tilbage til databaser

InfluxDB

Tidsserie

En specialbygget tidsserie-database optimeret til højhastighedsskrivninger og effektive tidsbaserede forespørgsler.

Beskrivelse

InfluxDB er den mest populære open source tidsserie-database, specifikt designet til metrikker, hændelser og analysedata der har tidsstempler. I modsætning til generelle databaser er InfluxDB optimeret til arbejdsbyrder hvor data konstant kommer ind i høj hastighed og forespørgsler primært er tidsbaserede. Data organiseres i measurements (lignende tabeller), tags (indekserede metadata), fields (faktiske værdier) og tidsstempler. Tags er automatisk indekseret for hurtig forespørgsel, mens fields ikke er. InfluxDB's lagringsmotor bruger Time-Structured Merge Tree (TSM), som komprimerer data effektivt og gør interval-forespørgsler ekstremt hurtige. Databasen har indbyggede opbevaringspolitikker (automatisk sletning af gamle data), kontinuerlige forespørgsler (auto-aggregering) og downsampling. InfluxQL er forespørgselssproget, som ligner SQL men med tidsseriespecifik funktionalitet. InfluxDB 2.0 introducerede Flux, et mere kraftfuldt funktionelt forespørgselssprog. Den bruges massivt til overvågning, IoT-sensordata, applikationsmetrikker og DevOps-observerbarhed.

Features

  • Specialbygget til tidsseriedata
  • Høj skrivegennemstrømning
  • Automatiske dataopbevaringspolitikker
  • Kontinuerlige forespørgsler til downsampling
  • Indbygget HTTP API
  • InfluxQL og Flux forespørgselssprog
  • Effektiv komprimering (10-100x)
  • Kapacitor til alarmer

Query Eksempel

-- InfluxDB InfluxQL (SQL-like)

-- Indsæt data (line protocol via HTTP eller CLI)
INSERT cpu,host=server01,region=eu-west value=64.3 1609459200000000000
INSERT cpu,host=server01,region=eu-west value=72.1 1609459260000000000
INSERT memory,host=server01,region=eu-west used=8.2,total=16.0 1609459200000000000

-- SELECT basics
SELECT * FROM cpu WHERE time > now() - 1h

-- Aggregations
SELECT MEAN(value) FROM cpu 
WHERE time > now() - 1h 
GROUP BY time(5m), host

-- Multiple fields
SELECT used, total, (used/total)*100 AS usage_percent 
FROM memory 
WHERE time > now() - 24h

-- Window functions
SELECT DERIVATIVE(MEAN(value), 1s) 
FROM cpu 
WHERE time > now() - 1h 
GROUP BY time(1m)

-- SHOW kommandoer
SHOW MEASUREMENTS
SHOW TAG KEYS FROM cpu
SHOW TAG VALUES FROM cpu WITH KEY = "host"
SHOW FIELD KEYS FROM cpu

-- Retention policy
CREATE RETENTION POLICY "one_week" ON "mydb" 
DURATION 7d 
REPLICATION 1 
DEFAULT

-- Continuous query (auto-aggregation)
CREATE CONTINUOUS QUERY "cpu_mean_5m" ON "mydb"
BEGIN
  SELECT MEAN(value) AS mean_value 
  INTO "cpu_mean_5m"
  FROM "cpu"
  GROUP BY time(5m), *
END

-- Flux query language (InfluxDB 2.0+)
from(bucket: "metrics")
  |> range(start: -1h)
  |> filter(fn: (r) => r._measurement == "cpu")
  |> filter(fn: (r) => r.host == "server01")
  |> aggregateWindow(every: 5m, fn: mean)
  |> yield(name: "mean")

-- JavaScript client eksempel
const { InfluxDB, Point } = require('@influxdata/influxdb-client');

const client = new InfluxDB({ url: 'http://localhost:8086', token: 'mytoken' });
const writeApi = client.getWriteApi('myorg', 'mybucket');

// Write data
const point = new Point('cpu')
  .tag('host', 'server01')
  .tag('region', 'eu-west')
  .floatField('value', 64.3);

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

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

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

Anvendelsesområder

  • Server- og applikationsovervågning (metrikker)
  • IoT-sensordataindsamling
  • Realtidsanalyse-dashboards
  • DevOps-observerbarhed (Prometheus-alternativ)
  • Finansielle tick-data

Fordele

  • Ekstremt hurtig til tidsserie-skrivninger
  • Fremragende datakomprimering
  • Indbyggede opbevaringspolitikker
  • SQL-lignende forespørgselssprog (InfluxQL)
  • God integration med Grafana

Ulemper

  • Ikke optimal for ikke-tidsseriedata
  • Clustering kun i Enterprise-version
  • Begrænset UPDATE og DELETE support
  • Hukommelsesintensiv ved stor kardinalitet
  • Skemadesign kræver forståelse af tags vs fields

Bedst til

  • Overvågning og metrikindsamling (Prometheus-alternativ)
  • IoT-sensordata med høj frekvens
  • Application Performance Monitoring (APM)
  • Realtidsanalyser på streamingdata
  • DevOps-observerbarhedsstakke

Ikke anbefalet til

  • Transaktionelle arbejdsbyrder (OLTP)
  • Komplekse joins og relationelle forespørgsler
  • Hyppige opdateringer af historiske data
  • Dokumentlagring
  • Data uden tidsstempler

Relaterede databaser

TimescaleDBPrometheusGraphiteOpenTSDBDruid