5

我正在考虑创建一个 Cassandra 时间序列数据库,用于存储数百万个日常数据系列,这些数据可能总共有多达 100B 个数据点。

我看了这篇文章: http ://rubyscale.com/blog/2011/03/06/basic-time-series-with-cassandra/

这个设计非常合理。因此,基本上我可以将每日时间戳作为列,并在必要时通过将日期附加到行来对列进行分片。

我有两个问题:

  • 我正在考虑存储多达 20,000 个带时间戳的(每日)列。甚至有必要通过例如对行进行分片。有这么多列的年份?对行进行分片以将列数减少到每年 365 是否有任何优点/缺点。
  • 我的另一个想法是每年创建列族,而不是逐行分片。这样,当访问多年的数据时,我将不得不查询多个列族而不是一个列族,并在客户端加入结果。这种方法会加快速度还是减慢一切?
4

1 回答 1

4

如果您要管理大量写入,则您的方法存在一个问题。

始终写入 1 个键意味着对该键的所有写入都将转到一个节点。基本上,您每天将使用集群外的一个节点,因此您不妨拥有一个巨大的 Cassandra 实例,而不必费心设置集群。如果您的写入频率变得非常高,您可能会关闭负责当天/密钥的节点。

我的建议是将一天存储在同时使用的多行中。时间桶可能很危险,因为一个桶中的突然激增可能会使所有东西都下降。

您可以像这样创建您的存储桶(行键):

  • [ROW_BASE_NAME] + [DAY] + someHashFunction(timestamp) % 10
  • [ROW_BASE_NAME] + [DAY] + random.nextInt(10)
  • [ROW_BASE_NAME] + [DAY] + nextbucket <--- 如果你有一个安全的方法来自己旋转存储桶

有很多方法可以做到这一点。您还可以使用要保存的列的某些元素来执行此操作。但我认为这样做应该很重要,以便始终利用整个 cassandra 集群。

我的回答仅对写入繁重的应用程序/功能有效,因为您将不得不使用 multi_get(多键整行读取)来读取所有数据并重构当天的整个时间线。

于 2013-04-16T14:13:24.870 回答