How Databases handle 10M devices in high-cardinality benchmarks
questdb.io
questdb.io
And to make things worse the most used timeseries database, Prometheus, is missing.
10M is not particularly high. If your company run prometheus/nodeexporter monitoring 1000 servers, you should be in that order of magnitude (expect 1000 to 10000 metrics per machine).
RedShift is column oriented, if there is some types for numbers/timeseries, that should be able to do the job. It might still be cost prohibitive though.
I personally find the 1M writes to be misleading. It's typically 1000 sensors generating 1000 metrics (a large key=value file). It should be ingested in batch. I guess it's not impressive enough if you call it 1000 requests per second.
> What bothered us most with this approach is that every subsequent read operation would face a performance penalty versus having data stored in arrays.
Unless I missed something non-obvious from the article, I'm not convinced B-tree storage inevitably faces a read performance penalty compared with storing data in arrays on storage - because B-trees can be made of arrays.
A B-tree can be thought of as a flat set of storage blocks, each of which contains the contents for a range of keys in a representation of your choice, and an index mapping key ranges to storage block locations. Usually the index is the same data structure but smaller, and through this recursive definition you get a tree. This is an unorthodox way of thinking about B-trees but it works and generalises well.
That storage block representation can be a sorted array of data if that's what you want.
Reading from a B=tree involves locating the storage block using the index, then reading the data you want from the block, in whatever representation is used. Presumably "data stored in arrays" also involves non-contiguous segments in storage at some size of segment, so small lookups involve finding the right segment, perhaps binary search to locate a first key, and then scanning it, and large range scans involve iterating over segments.
When the database revolves around fast SIMD array scanning operations, it can do that just as much inside a B-tree block that uses array representations for its contents as it can inside a segment of another array storage structure.
Maintaining this structure will slow writes with out of order values, but you have that problem with either data structure.
However, this is all based on "searching". If you just want to read the latest N values in a timeseries store, then yeah an array or some kind of BRIN index would be better for reads.
within prom:
cpu{hostname,metadata,cpu_socket} 5.0
cpu{hostname,metadata,cpu_socket} 6.0
cpu{hostname,metadata,cpu_socket} 5.0
cpu{hostname,metadata,cpu_socket} 4.0
version{hostname,version_number} 1.0
instead of baking version_number in everywhere. just as an example, then you can know "oh, hostname has version number" on a chart, or even do some inversions and say "count of version number" to find stragglers.It's not out of the ordinary if you have different industrial facilities to instrument.