【问题标题】:Relational/time series databases and very large SELECT queries关系/时间序列数据库和非常大的 SELECT 查询
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    查看VictoriaMetrics 时间序列数据库。它可以在具有几个 CPU 内核的单个节点上轻松处理 100k 行/秒的摄取性能。它针对存储和查询数万亿 (10^12) 行进行了优化 - 请参阅 case studies。它还可以扩展到多个节点 - 请参阅 docs for cluster version

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

    【讨论】:

      【解决方案3】:

      您应该知道Warp 10。它具有可扩展性,看起来非常适合您的用例。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-12
        • 2012-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-07
        • 2011-06-16
        • 2017-02-07
        相关资源
        最近更新 更多