【发布时间】:2020-11-01 08:38:20
【问题描述】:
我需要在数据库中存储大量结构化记录(可能有数千亿)。数据将由许多传感器连续写入,插入率很高(高达 100k 行/秒)。
数据结构良好,似乎很适合 Postgres 等结构化数据库。但是,对于需要摄取的数据量,恐怕性能还不够。
此外,我不需要关系数据库的所有功能(不需要完整的 SQL 支持)。数据将被写入一次,并使用基本查询读取几次大块,例如:
SELECT time, value FROM data WHERE time>1000 AND time<2500 AND sensor_location="home" ORDER BY time
也就是说,选择给定传感器(或一组传感器)的两个时间戳之间的所有记录。 我不需要任何进行复杂查询(例如连接或更新)的能力。 ORDER BY 子句很重要,因为我需要能够按照它们编写的顺序处理这些消息(使用 Python 脚本)。这些查询通常返回许多行,并且通常太大而无法放入 RAM。此外,由于大多数 RDBMS 是基于文本的有线协议,即使我拆分查询,返回这么多行也非常慢。
对于诸如 InfluxDB 之类的时间序列数据库来说,这似乎是一个很好的用例。但是,它的开源版本不容易分发(在我的情况下,这是一个要求,无论是弹性还是可扩展性),而且我的测试表明它在处理大型查询时性能不够(特别是它的有线协议是传输这么多行的速度太慢 - 有时甚至会在查询返回太多行时崩溃)。
我最近了解了 Clickhouse,它具有水平可扩展性和高性能。它有一个二进制/压缩的有线协议,其中一个 Python 驱动程序 (clickhouse_driver) 有一个 execute_iter 函数,可避免在进行这些大型查询时炸毁客户端的 RAM。但是,我非常担心它的弹性(在我的用例中不能容忍数据损坏),因为它是相当新的并且用户群有限。
我知道我的用例非常具体。还有其他我应该注意的免费/开源选项吗?
【问题讨论】:
-
您是否考虑过 MongoDB:mongodb.com/try/download/community? Nosql 数据库可能是您所需要的,因为您不需要建立任何复杂的关系。
-
您可以使用 PostgreSQL 的 Timescale 扩展 timescale.com
-
我也正要推荐Timescale,如果你有时间,Redis也值得一看。
-
Redis 不是为大型时间序列存储而设计的。在维基百科中查找流行的时间序列数据库列表
-
CH 具有复制功能并存储 4 种不同的校验和(如果数据损坏或完全丢失,将从副本中获取)。我用 PB 级的数据管理 CH 集群已有 3 年了。到目前为止没有数据丢失。您可以将 CH 复制与多个副本 3 或 4(复制因子)一起使用。还要检查github.com/VictoriaMetrics/VictoriaMetrics
标签: python database postgresql influxdb clickhouse