【发布时间】:2016-08-01 10:01:07
【问题描述】:
我们有数以千计的传感器产生我们想要存储在 Cassandra 中的测量时间序列数据。 我们目前每天存储约 5 亿条记录,这个数量将在下一次增长 5-10 倍。
我们主要使用最新的测量数据。几乎没有读取旧的测量数据。
- 我们主要从最新的测量数据(即一周前)中读取数据,
- 较旧的测量值(即小于一个月的年龄)很少被读取(每周十次),
- 非常旧的测量值(即 1-6 个月大)很少被读取(每月一次),
- 超过 6 个月的测量被认为是冷的,即从未读取过。
作为压缩策略,我们使用 DTCS。 设置 ttl 不是一个选项,因为我们需要存储测量数据以进行存档。
我还不确定如何处理“旧数据几乎是冷的”这一事实。
更新: 我要避免的事情:在我的 Cassandra 集群中拥有 20 TB 的空间,其中 18 TB 被使用,假设每年只使用一次,如果有的话。我不想为不需要的 18 TB 付费。设置 ttl 不是一个选项,因为我们应该能够读取数据,例如,从 2013 年 3 月开始(此类请求的额外成本是可以的)。如果我们将 ttl 设置为例如 6 个月,那么我们将无法正确执行此操作。
我们目前正在评估两种设计方案,并寻找最具成本效益的方案:
- 一个键空间,带有分区键(sensor_id、measurement_date)
- 每个月一个键空间,具有相同的分区键(sensor_id、measurement_date)
(在这两种情况下,每行最多有 500K 列,大多少于 100K)
2.的缺点是我们将有
我的问题: 对于我们的用例来说,2. 是一个合理的选择,还是在 Cassandra 中这被视为反模式?
感谢您的帮助!
【问题讨论】:
-
> 每个传感器每天最多可以进行 500k 次测量。我想知道你使用什么样的压缩。总计 5 亿个/每个传感器 50 万个 = 1000 - 目前只有 1000 个传感器。让我们假设每个传感器有 10 个指标。因此,如果您可以压缩每个系列,您可能不需要一个大的键命名空间。这是数字数据(0/1)还是模拟数据,观察到什么样的差异。您需要保持精确的值(大十进制)吗?
标签: cassandra time-series