2017-10-17 171 views
4

我现在有一个持续的事件驱动的实时流数据的列家族建模为这样的应用:实时数据Cassandra的数据建模

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

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

我想知道是否有更好的方法来模拟这种行为,并看着卡桑德拉的最佳实践和类似的问题(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的实际读取所有行时,其中覆盖相同的键,然后通过其写入时间戳选择最后一个(请纠正我,如果我错了)。

谢谢。

+0

如果您只需要最近的活动,那么第一个是最好的 –

+0

请问您可以更具体吗?是不是第二个更好的读取? – fncontroloptioncommand

回答

1

首先,我建议你检查的官方文档大约read path.

数据按时间排序

这仅仅是你的第二个情况便是如此,当卡桑德拉读取单个的SSTableMemTable(检查流程图)。

卡桑德拉实际读取那里覆盖相同的密钥 所有行,然后通过它的写时间戳

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

在这两种情况下,主要的驱动因素是在阅读过程中必须检查多少个SSTables。它与每个SSTable包含的记录数有些独立。

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