VictoriaMetrics

VictoriaMetrics is time series database management system that is designed as a storage back-end for Prometheus.

The author thinks the mmap is hurtful, so the VictorialMetrics is mmap-free! It uses 10x less memory than InfluxDB but outperforms InfluxDB and TimescaleDB by up to 20x.

Indexes

Inverted Index (Full Text) Log-Structured Merge Tree

VictoriaMetrics stores the data in MergeTree, which is from ClickHouse and similar to LSM. The MergeTree has particular design decision compared to canonical LSM.

MergeTree is column-oriented. Each column is stored separately. And the data is sorted by the "primary key", and the "primary key" doesn't have to be unique. It speeds up the look-up through the "primary key", and gets the better compression ratio. The "parts" is similar to SSTable in LSM; it can be merged into bigger parts. But it doesn't have strict levels.

The Inverted Index is built on "mergeset" (A data structure built on top of MergeTree ideas). It's used for fast lookup by given the time-series selector.

Data Model

Column Family / Wide-Column

The time series is consist of metrics and the values for corresponding timestamps. It looks like:

{"metric":{"__name__":"up","job":"node_exporter","instance":"localhost:9100"},"values":[0,0,0],"timestamps":[1549891472010,1549891487724,1549891503438]}

{"metric":{"__name__":"up","job":"prometheus","instance":"localhost:9090"},"values":[1,1,1],"timestamps":[1549891461511,1549891476511,1549891491511]}

Checkpoints

Non-Blocking Consistent

VictoriaMetrics uses their modified version of LSM tree (Logging Structure Merge Tree). All the tables and indexes on the disk are immutable once created. When it's making the snapshot, they just create the hard link to the immutable files.

Logging

Not Supported

The author argued that the time series DBMSs don't need strict safety; People can endure losing some recently inserted data. And most of TSDB like InfluxDB allow flushing the data delayed, and people always want to do that.

VictoriaMetrics abandoned the WAL, and keep all the tables on the disk is consistent. So that the crash won't corrupt the data on the disk.