使用 Cassandra 存储不可变数据?

Using Cassandra to store immutable data?

我们正在研究存储和读取大量 immutable 数据(事件)的选项,我想要一些关于 Cassandra 是否适合的反馈。

要求:

  1. 我们需要每秒存储大约 10 个事件(但速率会增加)。每个事件很小,大约 1 Kb。
  2. 一个非常重要的要求是我们需要能够按顺序重放所有事件。对我们来说,按插入顺序读取所有数据会很好(如 table 扫描),因此可能不需要显式排序。

以任何其他方式查询数据都不是主要问题,并且由于 Cassandra 是模式数据库,我认为当事件以多种不同形式出现时不可能吗? Cassandra 适合这个吗?如果是,有什么需要注意的吗?

根据您表达的要求,Cassandra 可能是一个不错的选择,因为它是一个 write-optimized 数据存储。时间序列是一种非常常见的模式,您可以定义聚类顺序,例如,在事件的时间戳上,以便按时间顺序检索所有事件。我发现 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 可能很适合您,但在使用它之前需要花一些时间来了解它的内部结构,因为如果您使用不当,它可能会成为一头野兽。

一年前,我对 "project"(更确切地说是一种工具)有完全相同的要求,我使用了 Cassandra,我并不后悔。总的来说,它非常适合。您可以在 Cassandra 集群中容纳大量数据并且性能令人印象深刻(尽管您可能需要调整)并且自然排序是一件好事。

我不会表达使用它的好处,而是专注于您在开始之前可能没有考虑到的可能的陷阱。

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

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

Rowlength 限制为 20 亿个元素,虽然这看起来很多,但对于时间序列数据来说确实并非遥不可及。特别是因为您不想接近那 20 亿,所以将其保持在最多数亿的较低水平。如果你放置了一些你将拆分行的参数(一些增加的索引或舍入day/month/year)你也必须在你的查询逻辑中实现它。

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

总而言之,这些事情可能看起来很重要,但当你稍微了解 Cassandra 时,它们真的不是太麻烦。我强调他们只是为了提醒你。如果一开始有些不合逻辑,那就回过头来理解为什么会这样,以及关于数据分布和环形拓扑的整个理论。

不要对列中的集合抱有太大期望,它们的长度限制在 ~65000 个元素。

不要误以为批处理语句更快(这个是经典的:))