使用Cassandra存储不可变数据?

时间:2016-01-16 19:43:46

标签: cassandra immutability

我们正在研究存储和阅读大量不可变数据(事件)的选项,我想对Cassandra是否适合做一些反馈。

要求:

  1. 我们需要每秒存储大约10个事件(但速率会增加)。每个活动都很小,约1 Kb。
  2. 一个非常重要的要求是我们需要能够按顺序重放所有事件。对我们来说,按插入顺序读取所有数据(如表扫描)会很好,因此可能不需要显式排序。
  3. 以任何其他方式查询数据不是主要问题,因为Cassandra是一个模式db我不认为当事件有多种不同的形式时它是可能的吗? Cassandra会适合这个吗?如果有,那么应该注意什么?

2 个答案:

答案 0 :(得分:4)

根据您所表达的要求,Cassandra可能非常适合,因为它是写入优化的数据存储。时间序列是一种非常常见的模式,您可以定义聚类顺序,例如,在事件的时间戳上定义,以便按时间顺序检索所有事件。我想在了解时间序列时发现this article on Datastax Academy非常有用。

变量数据结构不是问题:您可以将数据存储在BLOB中,然后从应用程序内部解析(即将其存储为JSON并在模型中读取),或者甚至可以将数据存储在map,尽管Cassandra的藏品有一些警告,但是要注意这一点。 Here you can find docs about collections in Cassandra 2.0/2.1

Cassandra与SQL数据库完全不同,虽然CQL有一些相似之处,但使用模式存在根本差异。了解Cassandra如何工作以及如何为数据建模以提高效率非常重要 - 来自Datastax的一篇精彩文章解释the basics of data modelling

简而言之:Cassandra可能适合你,但在使用它之前需要一些时间才能理解它的内部结构,因为如果你使用它很糟糕它可能是一个糟糕的野兽。

答案 1 :(得分:4)

我对"项目有完全相同的要求" (一个工具)一年前,我用Cassandra,我并不后悔。一般来说它非常适合。你可以在Cassandra集群中安装大量数据,性能令人印象深刻(虽然你可能需要调整),自然顺序是一件好事。

与其表达使用它的好处,我宁愿专注于你在开始之前可能不会考虑的可能陷阱。

您必须考虑您的架构。数据通过聚类键在一行内自然排序,在您的情况下,它将是时间戳。但是,您无法在不同行之间订购数据。它们可能在查询后被订购,但不保证任何方式,所以不要考虑它。有一种方法可以在2.1之前编写查询我相信(使用order by并禁用分页并允许过滤)但是这会导致性能不佳而我现在甚至认为它不可能。因此,您应该在查询端的行之间订购数据。

如果您有多个必须同时重播的变量类型(例如温度和压力),并且将它们放在不同的行中,则可能会出现问题。你必须获得具有不同变量类型的那些行,然后在查询方面进行操作。另一种方法是将所有变量类型放在一行中,但是只过滤一个子集是一个需要解决的问题。

行长限制为20亿个元素,虽然这看起来很多,但实际上并不是时间序列数据无法达到的。特别是因为你不想接近这两十亿美元,所以要保持最低数亿美元。如果您放置一些参数来分割行(一些增加索引或按天/月/年舍入),您还必须在查询逻辑中实现它。

首先在虚拟示例上试验您的查询。您无法在查询中随意使用<>=There are specific rules in SQL with filtering, or using the WHERE clause.

总而言之,这些事情看起来很重要,但当你逐渐了解卡桑德拉时,他们真的不会太麻烦。我强调它们只是为了给你一个抬头。如果事情起初不合逻辑,那就回过头来理解为什么它就像那样以及关于数据分布和环形拓扑的整个理论。

不要期望列中的集合太多,它们的长度限制为~65000个元素。

不要误解批量陈述更快(这个是经典的:))