【问题标题】:How to efficiently store and query a billion rows of sensor data如何高效存储和查询十亿行传感器数据
【发布时间】:2016-04-15 00:51:21
【问题描述】:

情况: 我开始了一份新工作,并被分配了弄清楚如何处理他们的传感器数据表的任务。它有 13 亿行传感器数据。数据非常简单:基本上只是一个传感器 ID、一个日期和那个时间点的传感器值(双精度)。

目前,数据存储在 MSSQL Server 数据库的表中。

到今年年底,我预计行数将增加到 2-30 亿。

我正在寻找一种更好的方式来存储和查询这些数据(按日​​期),并且由于我们那里有很多“大数据”产品,而我没有管理此类大数据集的实际经验,我'我在这里询问任何指针。

这不是一家大公司,我们的资源也不是无限的;)

关于我们的用例的更多细节:

  • 数据以图表形式绘制,并显示传感器随时间变化的值。
  • 我们计划创建一个 API,让我们的客户可以获取他们感兴趣的任何时间段的传感器数据(... 2 年前的数据与上个月的数据一样重要)。

到目前为止,我的研究使我考虑了以下解决方案:

  1. 将数据保存在 SQL Server 中

    但是对表进行分区(它现在没有分区)。这需要企业版的 SQL Server,成本很高。

  2. 将数据移动到 Azure SQL Server。

    在那里,我们将以更少的钱获得分区功能,但是一旦我们的数据库增长到 250GB 以上,它的成本就会高得多(而且超过 500GB 的成本太高了)。

  3. 使用多个数据库

    我们可以为每位客户使用 1 个数据库。几个较小的 DB 会比 1 个大 DB 便宜,但我们有很多客户并计划更多,所以我不太喜欢考虑管理所有这些数据库。

  4. Azure 存储表

    这是迄今为止我最喜欢的选项。我们可以按公司/传感器/年/月对数据进行分区,使用日期作为行键并存储传感器值。

    我还没有时间测试查询性能,但从我阅读的内容来看应该不错。但是有一个主要的缺点,那就是每个 HTTP 请求返回 1000 个项目的限制。如果我们需要获取一周内的所有传感器数据,我们需要发出大量的 HTTP 请求。我现在不确定这对我们的用例来说有多大的问题。

  5. Azure HDInsight(Azure 中的 Hadoop)

    如前所述,我没有使用大数据的经验,目前我对 Hadoop 的了解还不够好,无法知道它是否适合我们的情况(通过 API 在给定的时间跨度内公开传感器数据)。我应该深入挖掘并学习,还是将时间花在寻找另一种选择上更好?

有没有人有类似案例的经验。什么对你有用?请记住,价格很重要,“简单”的解决方案可能比非常复杂的解决方案更受欢迎,即使复杂的解决方案性能要好几秒钟。

更新 1: 回答下面cmets中的一些问题。

  • 大约有 12,000 个传感器,它们可能每 15 秒报告一个值。这相当于每天约 7000 万。实际上,并非所有这些传感器都打开了“报告”功能,因此我们每天不会获得那么多数据,但是由于我们自然希望扩展更多的客户和传感器,我真的需要一个可以扩展到每天有数百万个传感器值。
  • 分区是一种解决方案,虽然我可以使用多个数据库和/或多个表,但如果/当我用尽其他解决方案时,我认为这是一种后备方案。
  • 我已经阅读了更多关于 HBase、http://opentsdb.net/ 和 google 的 https://cloud.google.com/bigtable/ 的内容,看起来 Hadoop 至少可以成为一个真正的替代品。

更新 2: 今天,我对 azure table storage 和 HDInsight (HDI) 都有了一些了解。我们对查询“灵活性”的要求并不高,因此我认为 Azure 表存储看起来很有前途。正如我提到的,由于每个请求的 1000 项限制,提取数据有点慢,但在我的测试中,我认为它对于我们的用例来说已经足够快了。

我还偶然发现了 OpenTSDB,这也是我最初尝试 HDI 的原因。按照 Azure (https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hbase-tutorial-get-started/) 上的教程,我能够非常快速地存储一百万条记录并测试一些查询。查询比 Azure 表存储快得多。我什至可以在一个 http 请求中拉下 300 000 条记录(不过需要 30 秒)。

但它的成本比 Azure 表存储高出不少,而且我认为我可以优化我的代码以提高 Azure 表存储的查询性能(更细粒度的分区键和并行运行请求)。因此,由于简单、价格和“足够好”的性能,我现在倾向于使用 Azure 表存储。

我很快将向外部顾问展示我的发现,因此我也很高兴了解他对事物的看法。

【问题讨论】:

  • 在我尝试任何事情之前,请阅读 SQL Server 中的 partitioned tables。或者,如果您打算跨多个服务器存储数据,请阅读 partitioned views(参见 Partitioned Views 部分)。
  • 您提到客户...如果您将传感器数据放在一个没有客户ID 的大表中,客户如何绑定到这个?是否有与传感器的映射?为什么我要问:我想,您的查询不会针对所有客户进行查询,而是始终针对一个特定客户的数据进行查询-对吗?如果是:每个客户有多少行?您可能会为每个客户考虑一张表,所有表都具有相同的结构、索引、约束……这需要一个带有动态 SQL 的 TVF,其余的可以保持不变……
  • 此外,如果您经常需要报告一组标准聚合,请研究索引视图,它将完全管理在单独的索引中缓存各种预定义聚合的过程。
  • 是否有任何类型的数据逻辑分组?传感器是分组的吗?时间段是分组的吗?您也许可以将所有这些存储在一个多维数据集中。在应用任何智能之前,您需要更彻底地了解数据的报告方式。
  • 如果他们不想要非常低级别的细节(即一天中的每一秒),那么多维数据集可能不是答案。如果它肯定是按客户划分的,那么这绝对是您可以通过对客户数据进行分区并可能在时间段上进行聚类来处理的事情。这是一种以关系数据库为中心的方法。

标签: sql-server hadoop azure-table-storage azure-hdinsight bigdata


【解决方案1】:

因此,到今年年底,您将拥有 30 亿条记录(这才刚刚开始)。每条记录是 4 字节 ID + 4 字节日期时间 + 8 字节双精度值,总计 3*10^9 * (4+4+8) == 48GB。

您可以在 Redis、CouchBase、Tarantool、Aerospike 等内存数据库中轻松存储和处理这 48GB。它们都是开源的,因此您无需支付许可费。

内存消耗可能会增加 10-30% 的额外开销,因此 48GB 可以增长到 64GB 或略多一些。您应该向这些数据库提供您的真实数据,以便为您的案例选择最经济的数据库。

只有一台物理机器就足以应付整个工作负载,因为内存数据库能够处理每个节点每秒 100K-1M 的查询/更新(实际数量取决于您的特定工作负载模式)。为了更好的可用性,我会设置两台服务器 - 主服务器和从服务器。

根据我的经验,板载 64GB 的物理服务器的价格是 2-3K 美元。请注意,您甚至不需要 SSD 磁盘。旋转的应该没问题,因为所有读取都命中 RAM,所有写入仅附加到事务日志。这就是内存数据库的工作方式。如果您有任何问题,我可以详细说明。

【讨论】:

  • 谢谢,我会进一步研究一下,因为我还没有考虑过内存数据库。虽然,将数据保存数年并能够查询历史数据是业务模型的一部分,因此数据将继续增长。
  • 不客气 :) 数据量将继续增长,但内存价格将继续以美元计价。
  • 不能把内存数据库放在标准数据库/表存储前面吗?
  • Aerospike 免费层现在限制为 40 亿的记录,我可能从 2 年前就忘记了? aerospike.com/products/product-matrix/…
【解决方案2】:

对于现代时间序列数据库(例如 VictoriaMetrics)来说,每年 30 亿个数据点是相当少的数字。它可以在具有 64 个 vCPU 的计算机上以每秒 1900 万个样本的摄取速度在不到 3 分钟的时间内持久保存这么多数据点。详情请见this article

有 VictoriaMetrics 生产设置,每个节点有多达 10 万亿个数据点。还有scales to multiple nodes

【讨论】:

    【解决方案3】:

    所以我以某种方式使用了您列出的所有技术。您需要执行什么样的查询?因为根据这一点,您可以统治一些解决方案。如果您不需要查询很多不同的方式,Table Storage 可以很好地为您工作。如果您关注guidelines,它的扩展性会非常好,而且很便宜。但是,如果您不能只对所需的数据进行点查询,那么它可能效果不佳,或者过于复杂而成为一个不错的选择。如果您想要一个时间序列数据库,Opentsdb 非常棒。这将限制您使用时间序列类型的查询。那里有a lot of time series dbs,还有很多基于它构建的应用程序,比如BosunGrafana,列出我使用的两个。最后一个选项 HDI,我将以 parquet 格式(或某些列格式)存储数据,在数据顶部创建一个配置单元表并使用 Spark SQL 进行查询。你真的不需要使用 Spark,你也可以使用 Hive。但是你应该远离传统的 Map Reduce,这种范式现在基本上已经死了,你不应该在其中编写新代码。最重要的是,如果你不知道它,它周围有陡峭的学习曲线。我我们所有的技术,我们将它们用于系统的不同部分,这实际上取决于应用程序的读写要求。如果我是你,我会考虑使用 spark 和 parquet,但它可能不需要很多新工具。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      • 1970-01-01
      • 2010-11-15
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      相关资源
      最近更新 更多