Relational/time 系列数据库和非常大的 SELECT 查询

Relational/time series databases and very large SELECT queries

我需要在数据库中存储大量结构化记录(可能有数千亿条)。数据将由许多传感器连续写入,插入率很高(高达 100k rows/second)。

数据结构良好,似乎很适合 Postgres 等结构化数据库。但是,恐怕性能不足以满足需要摄取的数据量。

此外,我不需要关系数据库的所有功能(不需要完整的 SQL 支持)。数据将被写入一次,并使用基本查询以大块的形式读取几次,例如:

SELECT time, value FROM data WHERE time>1000 AND time<2500 AND sensor_location="home" ORDER BY time

也就是说,select 给定传感器(或一组传感器)的两个时间戳之间的所有记录。 我不需要任何进行复杂查询(如连接或更新)的能力。 ORDER BY 子句很重要,因为我需要能够按照它们编写的顺序处理这些消息(使用 Python 脚本)。这些查询通常 return 多行,而且通常太大而无法放入 RAM。此外,即使我拆分查询,return由于大多数 RDBMS 的基于文本的有线协议,所以很多行的速度非常慢。

这似乎是 InfluxDB 等时间序列数据库的一个很好的用例。然而,它的开源版本不容易分发(在我的案例中,这是弹性和可伸缩性的要求),而且我的测试表明,当涉及到大型查询时,它的性能不够好(特别是,它的有线协议是太慢了,无法有效地传输这么多行 - 有时甚至在查询 return 行太多时崩溃。

我最近了解了 Clickhouse,它具有水平可扩展性和高性能。它有一个 binary/compressed 线路协议,其中一个 Python 驱动程序 (clickhouse_driver) 有一个 execute_iter 功能,可以避免在进行这些大型查询时耗尽客户端的 RAM。但是,我非常担心它的弹性(在我的用例中数据损坏是不能容忍的),因为它是相当新的并且用户群有限。

我知道我的用例非常具体。还有其他 free/open 我应该注意的来源选项吗?

看起来你的案例是 ClickHouse 的典型案例 请使用 ReplicatedMergeTree table 引擎 https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/replication/

看看VictoriaMetrics time series database. It easily handles 100k rows/sec ingestion performance on a single node with a few CPU cores. It is optimized for storing and querying trillions (10^12) of rows - see case studies. It also scales to multiple nodes - see docs for cluster version

它还提供 MetricsQL 查询语言,针对生产中的典型时间序列查询进行了优化。例如,以下查询将 return 家中所有温度传感器的时间序列:temperature{sensor_location="home"}.

你应该知道Warp 10。它是可扩展的,看起来很适合您的用例。

由于您使用 Python 处理消息,因此与它良好集成的事实应该与您相关。它支持 Pickle 和 Arrow 将数据连接到 Python。您还可以使用它与 Spark 的集成来分发处理。