我目前有一个应用程序将事件驱动的实时流数据保存到列族中,该列族建模如下:
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实际读取覆盖相同密钥的所有行,然后通过其写时间戳选择最后一行(如果我错了,请纠正我)。
感谢。
答案 0 :(得分:1)
首先,我建议您查看有关read path.
的官方文档数据按时间排序
仅在第二种情况下才会出现这种情况,当Cassandra读取单个 SSTable 和 MemTable 时(请查看流程图)。
Cassandra实际上读取了覆盖相同密钥的所有行 然后通过其写时间戳
选择最后一个
这发生在文档中的按时间戳合并单元格步骤(再次检查流程图)。请注意,在每个SSTable中,第一种情况下的行数将为1。
在两种情况下,主要驱动因素是您在阅读期间需要检查多少SSTable。它与SSTable包含的记录数量有些独立。
但是在第二种情况下,你有更大的SSTabes导致更长的SSTable压缩。 TTL到期也执行额外写入。所以第一种情况有点可取。