by Todd Persen
got new storage engine in 2016
-
Columnar Storage, unlimited fields
-
Adaptive compression depending on data-types for both timestamps and values
-
Compactions in background, creating larger TSM files for optimal compressions
-
Built-in WAL, with query-able in-mem cache
-
Each series uniquely indexed
- accuracy
- throughput
- compression
- memory footprint
- failure testing
- scale testing
- relied on 3rd party storage engine
leveldb to hyperleveldb to rocksdb to lmdb; all written in C/C++
-
no secondary indexing capabilities
-
limited customizability
[writes points/sec] [reads points/sec] [int64 sotrage bytes/point] [arch]
LevelDB: 45,000 550,000 27 LSM
RocksDB: 75,000 600,000 32 LSM
LMDB : 25,000 300,000 76 B+
-
based on BoltDB, in Go
-
tags supported natively as indices
-
2 variants
b1: pure boltdb, timestamp as a key with single value bz1: boltdb with compressed blocks, first timestamp in block as key
-
demanding on IOPS
-
about 30bytes/point
-
didn't much exceed v0.8.x perf
- TSM Testing and Tooling
influx_stress; over VMs and physical machines- testing retention policies, queires, deletes during writes
- on SSD, a day and a half for 50Billion points (170Gigs on disk) through a single node (with no retention policy kicking in)
So,
- over 350K writes/sec with 2 bytes per point on disk
- reads 300K points/sec increasing to 2M/sec with new query engine
- crash stable; steady IOPS under full write load
- sample 100GB dataset starts in
<60seconds, indices fully-loaded
- write performance degrades with very high series cardinality (
>10Munique series)
- move indices for cold shards out of memory
- experiemtns with alternative index structure
-
still CPU bound
-
dictionay index for strings
-
better query engine integration in v0.11.0
- WAL does
fsyncafter every write