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

dat*_*eek 5 time-series cassandra

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

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

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

我有两个问题:

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

le-*_*ude 4

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

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

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

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

  • [ROW_BASE_NAME] + [DAY] + someHashFunction(时间戳) % 10
  • [ROW_BASE_NAME] + [DAY] + random.nextInt(10)
  • [ROW_BASE_NAME] + [DAY] + nextbucket <--- 也就是说,如果您有安全的方式自己旋转存储桶

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

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

  • 列族只是一个额外的关键级别。如果我的数据具有相同的性质,并且需要在缓存、比较(列名)等方面进行相同的设置,那么我将它们放在同一个列族中。另外,列族不太容易通过编程进行管理。而只需写入一个新密钥就会创建它。并且您无法在一个查询中读取单独的 CF。 (2认同)