用于实时数据的Cassandra数据建模

时间:2017-10-17 10:59:04

标签: cassandra data-modeling query-performance

我目前有一个应用程序将事件驱动的实时流数据保存到列族中,该列族建模如下:

CREATE TABLE current_data (
    account_id text, 
    value text,
    PRIMARY KEY (account_id)
)

每个accountId每X秒发送一次数据,因此我们每次收到一个事件时都会覆盖现有行。这些数据包含当前的实时信息,我们只关心最近的事件(不使用旧数据,这就是我们插入现有密钥的原因)。 从应用程序用户端 - 我们通过account_id语句查询select。

我想知道是否有更好的方法来模拟这种行为,并且正在研究Cassandra的最佳实践和类似问题(How to model Cassandra DB for Time Series, server metrics)。

想到这样的事情:

CREATE TABLE current_data_2 (
        account_id text, 
        time timeuuid,      
        value text,
        PRIMARY KEY (account_id, time) WITH CLUSTERING ORDER BY (time DESC)
)

不会发生覆盖,每次插入也都会使用TTL(可以是几分钟的TTL)。

问题是,如果完全,那么第二个数据模型是第二个数据模型。据我所知,主要优势将在READS中 - 因为数据是按时间排序的,所以我需要做的只是一个简单的

SELECT * FROM metrics WHERE account_id = <id> LIMIT 1

在第一个数据模型中,Cassandra实际读取覆盖相同密钥的所有行,然后通过其写时间戳选择最后一行(如果我错了,请纠正我)。

感谢。

1 个答案:

答案 0 :(得分:1)

首先,我建议您查看有关read path.

的官方文档
  

数据按时间排序

仅在第二种情况下才会出现这种情况,当Cassandra读取单个 SSTable MemTable 时(请查看流程图)。

  

Cassandra实际上读取了覆盖相同密钥的所有行   然后通过其写时间戳

选择最后一个

这发生在文档中的按时间戳合并单元格步骤(再次检查流程图)。请注意,在每个SSTable中,第一种情况下的行数将为1。

在两种情况下,主要驱动因素是您在阅读期间需要检查多少SSTable。它与SSTable包含的记录数量有些独立。

但是在第二种情况下,你有更大的SSTabes导致更长的SSTable压缩。 TTL到期也执行额外写入。所以第一种情况有点可取。