我目前有一个应用程序,该应用程序将事件驱动的实时流数据保存到列族中,该列族是这样建模的:
CREATE TABLE current_data (
account_id text,
value text,
PRIMARY KEY (account_id)
)每accountId每X秒发送一次数据,所以每次接收事件时我们都会覆盖现有的行。这些数据包含当前的实时信息,我们只关心最近的事件(对旧的数据没有任何用处,这就是为什么我们在一个已经存在的键上插入)。从应用程序用户端-我们查询一个select by account_id语句。
我想知道是否有更好的方法来模拟这种行为,我正在研究Cassandra的最佳实践和类似的问题(如何为时间序列、服务器度量建模Cassandra DB)。
想到这样的事情:
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 )。
的问题是,如果说是第二个数据模型,它比第一个模型更好。据我所知,主要的优势在于读取--因为数据是按时间排序的,我所需要做的只是简单的。
SELECT * FROM metrics WHERE account_id = <id> LIMIT 1在第一个数据模型中,Cassandra实际上读取覆盖相同键的所有行,然后按其写时间戳选择最后一行(如果我错了,请纠正我)。
谢谢。
发布于 2017-10-24 21:55:15
首先,我鼓励您查看有关阅读路径。的正式文档
数据是按时间排序的
这仅在第二个例子中是正确的,当Cassandra读取单个SSTable和MemTable时(查看流程图)。
Cassandra实际上读取覆盖相同键的所有行,然后用其写时间戳选择最后一行。
这发生在合并单元格上,在文档中的时间戳步骤中(再次检查流程图)。注意,在每个SSTable中,第一个例子中的行数是一个。
在这两种情况下,主要的驱动因素是在阅读期间需要检查多少SSTables。它在某种程度上独立于每个SSTable包含多少个记录。
但是在第二种情况下,SSTabes要大得多,这会导致更长的SSTable压缩时间。另外,TTL过期执行额外的写入。所以第一种情况比较好。
https://stackoverflow.com/questions/46788521
复制相似问题