2013-04-16 51 views
5

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

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

这样的设计是非常完善的。所以基本上我可以将每日时间戳记作为列,并且如果必要的话,通过将该日添加到行来分割​​列。

两个问题,我有:

  • 我在看存储多达20,000时间戳(每日)列。是否有必要通过例如分割行。一年的这个数量的列?分割行以减少每年365列的数量是否有优势/劣势。
  • 我的另一个想法是,而不是逐行分栏是每年创建列家族。通过这种方式访问​​多年的数据时,我不得不查询多个列族而不是一个列族,并在客户端加入结果。这种方法会加快速度或者放慢速度吗?

回答

4

如果您要管理大量的写入操作,那么您的方法有一个问题。

总是写入1个键意味着该键的所有写入操作都将转到一个节点。基本上你每天会在你的集群中使用一个节点,所以你可能有一个巨大的Cassandra实例,而不是麻烦建立一个集群。 如果您的写入频率变得非常高,您可能会降低负责该日期/密钥的节点。

我的建议是在同一时间使用多行存储一天。由于在一个桶内突然激增可能会导致所有事情都下降,因此时间分配可能很危险。

,你可以这样创建你的水桶(行密钥):

  • [ROW_BASE_NAME] + [DAY] + someHashFunction(时间戳)%10
  • [ROW_BASE_NAME] + [DAY] + random.nextInt (10)
  • [ROW_BASE_NAME] + [DAY] + nextbucket < ---那就是如果你有旋转桶以安全的方式自己

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

我的答案只适用于编写繁重的应用程序/功能,因为您将不得不使用multi_get(多键全行读取)读取所有数据并重新构建当天的整个时间线。

+0

所以你认为在将表/列分割成单独的列族中没有任何要点,而是按行来完成它?单列系列中有太多行是否有缺点? – datageek

+2

列家族只是一个额外的关键级别。如果我的数据具有相同的性质,并且需要缓存,比较(列名称)等相同的设置,那么我将它们放在同一个列族中。 Plus柱系列在编程上不易管理。只需写入新密钥即可创建密钥。并且您无法在一个查询中从单独的CF读取。 –