使用Cassandra存储不可变数据?

Joh*_*han 5 immutability cassandra

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

要求:

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

以任何其他方式查询数据不是主要问题,因为Cassandra是模式数据库,我不认为当事件有多种不同的形式时它是可能的吗?Cassandra会适合这个吗?如果有,那么应该注意什么?

Ale*_*vic 4

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

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

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

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

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

首先在虚拟示例上试验您的查询。您不能在查询中任意使用<,>或。SQL中有特定的过滤规则,或者使用WHERE子句。=

总而言之,这些事情可能看起来很重要,但当您稍微了解 Cassandra 时,它们实际上并不算太麻烦。我在它们下面划线只是为了提醒您。如果一开始有些事情不合逻辑,只需回过头去理解为什么会这样,以及关于数据分布和环形拓扑的整个理论。

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

不要误以为批量语句更快(这是一个经典:))