【问题标题】:DynamoDB Timeseries Table DesignDynamoDB 时序表设计
【发布时间】:2017-07-26 18:23:51
【问题描述】:

场景: 我有几个气象站正在收集数据。数据大约每 15 分钟左右出现一次。每个数据包都包含多个测量值,例如压力、温度、湿度等。

可以通过多种方式查询数据:

  1. 显示站点所有测量值的最新值
  2. 显示单次测量的历史图表(例如温度)
  3. 其他?

建议表:

STATIONS: hash-key: station-id

包含有关电台的元数据信息

STATION_X_MEASUREMENT_DATA:哈希键:测量类型,范围键:时间戳

其中 X 是电台 ID。每条记录都包含特定测量类型和时间的测量值。每个站点都有自己的数据表,因此当站点不再服务时,可以通过删除表来删除数据。

STATION_SUMMARY:哈希键:station_id

包含每个站点所有测量类型的最新/当前值

问题:

  1. 我应该有两个单独的表(汇总和单独的测量值),还是在我想显示汇总时只查询最新的测量值?

  2. 我应该将测量类型存储为单独的记录,还是合并为特定时间戳的单个记录?

  3. 如果我要将所有测量值存储在以时间戳作为范围键的组合记录中,是否值得使用分钟或秒作为分区键?恐怕这会使查询变得更加复杂。

  4. 还有什么我应该改变/改进的吗?有更好的选择吗?

【问题讨论】:

    标签: time-series amazon-dynamodb


    【解决方案1】:

    我是否应该有两个单独的表格(汇总和单独的测量) 或者我应该只在我想显示时查询最新的测量值 总结?

    我不明白你怎么能有一张桌子。在测量数据中,每次测量都有一个项目,而在汇总表中,每个项目都有关于站的静态信息。如果要将它们添加到单个表中,是否要复制摘要信息?

    还有两个单独的表允许您为表设置不同的 RCU/WCU。我猜站概要很少写,所以你可以设置一个低WCU,高一个RCU,而测量数据经常写,可能不经常读。同样,您的设置可以反映这一点。

    现在,您是否想要为站点和站点摘要提供单独的表格?这取决于您的数据和访问模式,但将大量详细信息拆分到单独的表中,并将紧凑表示(可能是字段的子集)拆分到不同的表中是一种常见的模式。如果您有 get-all-stations 之类的请求,它可以让您节省大量 RCU,因为它们可能不需要详细信息。

    我应该将测量类型存储为单独的记录还是组合 到特定时间戳的单个记录中?

    我看到的唯一区别是您可以将多个测量值压缩成一个二进制 blob 并将其存储到一个项目中。如果您的测量有一些重复(LZW 算法?),或者如果数据在测量之间没有变化(delta encoding?)。在后一种情况下,您可以写 22、1、-1 或类似的东西,而不是写 202、203、202。

    请记住,一个项目被限制为 400KB,因此您不能在一个项目中塞满大量数据。

    另外请记住,对于单个分区键,您不能拥有超过 10GB 的数据,因此您需要制定一个策略来处理它。请注意,这不取决于项目的数量或单个项目的大小。

    如果您没有大量数据,那么每次测量只需一个项目就可以了。如果您有大量数据并且需要降低 AWS 成本,那么使用压缩的测量数组可能会更好

    如果我将所有测量值存储在一个组合记录中 时间戳作为范围键,是否值得使用分钟或秒作为 分区键?恐怕这会使查询更多 复杂。

    很难说。你每秒有多少条记录?每分钟?也许每小时聚合以从压缩中获得更好的结果是有意义的?或者也许一天?这取决于您的数据。

    还有什么我应该改变/改进的吗?有更好的选择吗?

    您可以针对不同的时间间隔使用不同的表格。较新的数据可以具有较高的 WCU/RCU 配置,而较旧的数据将具有较低的 WCU(您可以写过去吗?)和较低的 RCU。旧数据可以传输到 S3。如果需要,您还可以使用 DynamoDB TTL 自动删除旧表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-07
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 1970-01-01
      • 2021-02-19
      相关资源
      最近更新 更多