在 cassandra 中存储 TB 的统一时间序列

Posted

技术标签:

【中文标题】在 cassandra 中存储 TB 的统一时间序列【英文标题】:Storing terabyte of uniform time series in cassandra 【发布时间】:2015-06-22 06:03:16 【问题描述】:

我想尽可能高效地存储大量时间序列。速度很重要,但不如存储重要。

我的数据由股票名称和 15 年的 1 分钟数据组成。 数据从 2000 年 1 月 1 日开始精确,每天的分钟数正好是 390 分钟。

所以我不需要存储每个系列的时间戳,因为我可以自动计算。 所以不要这样:

Apple [timeStamp:value][timeStamp:value]

我想要这个:

Apple [value][value]

有没有办法在 Cassandra 中加载这种数据,所以它只存储顺序值,而不是每个值的时间戳。

据推测,通过为每个系列使用时间戳会使所需的存储空间增加一倍:如果每个时间戳和值都是 8 字节,那么如果只存储值,它将占用 50 TB 而不是 25 TB。

【问题讨论】:

【参考方案1】:

Cassandra 具有列表类型,最多可存储 64K 元素。由于 15 年的分钟数超过 64K,因此您需要一些辅助键将其分解为 64K 或更小的组。

假设您决定按天(每天 1440 分钟)存储它,那么您可以这样定义表格:

CREATE TABLE stock_values_by_day (
  stock_name text,
  year int,
  day_number_within_year int,
  values list<int>,
  PRIMARY KEY (stock_name, year, day_number_within_year) );

因此,股票名称将是分区键,而年份和日期将是集群列。

然后,您将每天在列表字段中存储 1440 个数据点。因此,您不会为时间键使用太多空间,并且您可以每天查询每只股票的数据,还可以在一年内进行多天的范围查询。

如何分解取决于访问数据时所需的粒度级别(例如每天、每月等)。

另一种方法是将数据存储在 blob 字段中。在您的应用程序中,您会将数据(例如一年的值)编码为二进制 blob 并以这种方式保存。当您读出它时,您必须将二进制 blob 扩展回原始值数组。

【讨论】:

以上是关于在 cassandra 中存储 TB 的统一时间序列的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra 按计数排序结果

cassandra 调试问题

Cassandra 列族大于节点驱动空间

将数据从单节点 cassandra 集群迁移到另一个单节点 cassandra 集群

在 Cassandra 2.1.7 中检测到错误泄漏

华为云AOM基于cassandra的亿级数据监控实践系列