每年约 2.7B 行/每五分钟 26.000 个数据点的数据库设计

der*_*erp 5 mysql database-design aws-aurora

目前的情况

我们目前正在研究一种新产品,它将设备数据发送回给我们进行解释。

这些是我们正在查看的数字:

  • 设备很可能每 5 分钟发送一次数据
  • 到明年年底将有 26.000 台设备
    • 每 5 分钟 26.000 次插入。我们很可能几乎无法控制间隔,因此这 26.000 个 INSERTS 很可能不会均匀分布在这 5 分钟内。
    • ~ 每年 2.733.120.000 条数据条目
  • 每个数据包都将采用 JSON 格式,大小在 300 - 500 字节之间。
  • 我们预计每年会有大约 8.000 台新设备。

我们目前为我们的内部系统管理多个数据库,但对此类卷几乎没有经验。我们现在使用 AWS Aurora,理论上应该支持 100.000 个插入 p/s。

这些数据将如何使用?

这些数据将主要用于在我们的客户门户中创建报告:

  • 设备指标的实时报告
  • 历史报告,IE:
    • 2019 年 2 月 2 日的设备统计数据如何?
    • 第 12 周是什么样的?
    • 给我一个 1 月份指标的摘要
    • 显示特定列总和的图表,按月分组

问题

老实说,考虑到我对这样的数据量没有任何实际操作经验,我发现很难做出可靠的选择。

我们目前的堆栈

我们结合使用 AWS EC2 机器和 AWS Aurora 集群来管理我们的数据。理想的解决方案是面向 AWS 的。

我正在考虑的基础设施:

选项 #1:为了简单起见,将所有内容直接存储到 Aurora 可能是一个不错的解决方案。

我们的理论基础架构图

选项#2:但是,为了分离我们的“实时”数据和解释数据,也许这样的事情会更好。

我们的理论基础结构的替代图

实际问题

  • 一个兼容 MySQL 的数据库管理系统,比如 Aurora,适合这样的事情吗?
  • 传入的数据将用于生成“实时”的每日、每周、每月和每年报告,按设备汇总。是否建议为这些不同的“视角”创建单独的表以使查询数据更容易,或者我是否过于复杂,是否应该将测量值存储到一个表中?
  • 我们应该研究表分区吗?
  • 还有什么我没有提到的,但我们应该研究一下吗?

如果所有这些都太模糊,请告诉我,以便我澄清问题。

很想听听你的想法。

小智 1

我在一家 IoT 公司工作,最近使用 Kinesis 流、Spot 实例和 DynamoDB 实现了类似的功能(设备传感器数据读取)。

Spot 实例是取代 Lambda 的一个节省成本的步骤,Lambda 负责处理流数据并批量插入到 DynamoDB,但它们的成本过高。我们将 Lambda 更改为 EC2,然后更改为 Spot 以节省现金。

我建议尝试使用 Lambda 从 SQS 获取数据并将其放入数据库中,但为了规模和便宜,请考虑使用 DynamoDB 进行存储。DynamoDB 的缺点是您必须在构建表之前知道查询路径,但当您使用 API 时,您可能会知道这些路径是什么。