【问题标题】:Designing timeseries database in Cassandra在 Cassandra 中设计时间序列数据库
【发布时间】:2013-04-16 12:36:39
【问题描述】:

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

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

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

我有两个问题:

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

【问题讨论】:

标签: cassandra time-series


【解决方案1】:

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

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

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

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

  • [ROW_BASE_NAME] + [DAY] + someHashFunction(timestamp) % 10
  • [ROW_BASE_NAME] + [DAY] + random.nextInt(10)
  • [ROW_BASE_NAME] + [DAY] + nextbucket

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

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

【讨论】:

  • 所以你认为将表/列族分片成单独的列族没有意义,而是按行来做?一个列族中有太多行有什么缺点吗?
  • 列族只是一个额外的关键级别。如果我的数据性质相同,在缓存、比较(列名)等方式上需要相同的设置,那么我将它们放在同一个列族中。 Plus 列族并不容易以编程方式管理。只需写入新密钥即可创建它。并且您不能在一个查询中读取单独的 CF。
猜你喜欢
  • 2019-11-13
  • 2019-10-01
  • 2016-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 2013-06-09
相关资源
最近更新 更多