在Cassandra中设计时间序列数据库

时间:2013-04-16 12:36:39

标签: cassandra time-series

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

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

这种设计非常完美。基本上我可以将每日时间戳作为列,如果需要,可以通过将日期附加到行来对列进行分片。

我有两个问题:

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

1 个答案:

答案 0 :(得分:4)

如果您要管理大量的写入操作,那么您的方法就会出现问题。

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

我的建议是将一天分成多行同时使用。时间段可能是危险的,因为在一个桶中的突然激增可能会导致一切下降。

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

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

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

我的回答仅对Write heavy应用程序/功能有效,因为您必须使用multi_get(多行全行读取)来读取所有数据并重新构建当天的整个时间线。