High-cardinality time series
A steady flood of timestamped points from many sources, each tagged with labels, that you query by time range and aggregate.
What it asks of a system
Metrics, sensor readings and market ticks arrive as timestamped values, mostly in time order, and are rarely changed afterwards. Each series is named by its labels (host, region, device, symbol), and every distinct combination of label values is a separate series. Cardinality is the number of those series. A label like a user ID or a container ID can turn thousands of series into millions, and many systems slow down or run out of memory long before they run out of disk.
A system built for this partitions data by time, compresses each series well (timestamps and values change slowly), drops or downsamples old data on a schedule, and can answer “average per minute over the last day, per host” without reading raw points one by one. To tell whether one handles your load, test with your real number of series rather than your number of points, and look at what happens to memory and query speed as series churn, for example when every deploy creates new pod names.
Good at it · 17
Compare side by sideTime-series databases
Amazon TimestreamAWSTimestream for InfluxDB runs managed InfluxDB, with line protocol and Telegraf, and InfluxDB 3 clusters keep data as Parquet in S3.AWS’s time-series databases: a serverless engine now closed to new customers, and managed InfluxDB 2 and 3.Apache IoTDBOpen sourceWrites go to a WAL-backed memtable and flush to TsFiles, while late readings go to separate files merged later by compaction.An Apache time-series database for industrial IoT that stores everything in its own open file format, TsFile, and lets you model devices as a tree of paths or as SQL tables.
TimechoDBCommercialThe IoTDB engine: writes go to a WAL-backed memtable and flush to TsFiles, and late readings go to separate files merged later.The commercial edition of Apache IoTDB from the company its creators founded: the same engine plus dual-active pairs, one-way data-diode sync, a Workbench console and vendor support, licensed per machine with activation codes.ArcOpen sourceTakes InfluxDB line protocol, buffers rows in memory and flushes them every few seconds as Parquet files partitioned by hour.A young single-binary time-series database in Go that writes incoming data as Parquet files and queries them with DuckDB SQL.
KairosDBOpen sourcePoints go into Cassandra rows per metric, tag set and three-week window, so ingest inherits Cassandra’s write throughput and scaling.A Java time-series server that stores metrics with tags in Apache Cassandra; it began in 2013 as a rewrite of OpenTSDB and is now kept going by a single maintainer.
QuestDBOpen sourceMany clients write through a WAL into time-partitioned column files, with out-of-order rows and deduplication handled on write.A columnar time-series database in Java, C++ and Rust that ingests millions of rows a second and answers time-series SQL, with old partitions kept as Parquet.
TDengineOpen sourceEach device gets its own table, kept whole in one vnode, so a write is an append; supertables let one query cover every device.A clustered time-series database for IoT and industrial data that gives every device its own table, grouped under “supertables” with tags.TS.* commands of RedisTimeSeries plus Prometheus-style label queries, joins and anomaly detection.writeDataPoint() call to record events with unlimited cardinality, adaptive sampling to keep it cheap, and a SQL API to query them.Real-time analytics databases
Sources
- Prometheus docs: Metric and label naming (each label combination is a new time series)
- Prometheus docs: Storage
- Tiger Data docs: Understand hypertables (chunks by time range)
- Tiger Data docs: add_retention_policy()
Why each technology is listed comes from the sources on its own page.