时间序列的最佳 Cassandra 模式
Optimal Cassandra Schema for Time-Series
所以我将用户事件存储在 Cassandra 中,并正在寻找 table 的正确键控。
CREATE TABLE user_events (
user text,
timestamp timestamp,
ip text,
event text,
content text,
service text,
PRIMARY KEY (user, timestamp)
) WITH CLUSTERING ORDER BY (timestamp DESC)
AND compaction = { 'class' : 'DateTieredCompactionStrategy' };
我知道单个分区有限制(我认为是 ~1B )。我不打算随着数据变旧而删除数据。我还需要按月或其他方式输入吗?例如:
PRIMARY KEY((user, month) timestamp)
或者如果有更优化的方式或存储时间序列数据的事件。
不要使用 DateTiered,使用 TimeWindow。其次,您应该按照预期的方式编写(例如:列出您想要的所有 SELECT 查询,然后在其之后建模)。但要避免大分区。
如果您想根据时间查找用户事件,有几种方法可以避免大分区。
- 按照你说的按日期键入。
- 不同时间在不同 table 秒内的不同事件(例如:每月一个 table)
第二种方式的优点是可以隔离数据,让您可以move/store/change随时进行设置,而不是将来如果需要更改某些内容,就必须处理海量数据集。此外,如果您打算在将来删除(比方说,GDPR),您可以在删除完整的 table 时避免逻辑删除。
所以我将用户事件存储在 Cassandra 中,并正在寻找 table 的正确键控。
CREATE TABLE user_events (
user text,
timestamp timestamp,
ip text,
event text,
content text,
service text,
PRIMARY KEY (user, timestamp)
) WITH CLUSTERING ORDER BY (timestamp DESC)
AND compaction = { 'class' : 'DateTieredCompactionStrategy' };
我知道单个分区有限制(我认为是 ~1B )。我不打算随着数据变旧而删除数据。我还需要按月或其他方式输入吗?例如:
PRIMARY KEY((user, month) timestamp)
或者如果有更优化的方式或存储时间序列数据的事件。
不要使用 DateTiered,使用 TimeWindow。其次,您应该按照预期的方式编写(例如:列出您想要的所有 SELECT 查询,然后在其之后建模)。但要避免大分区。
如果您想根据时间查找用户事件,有几种方法可以避免大分区。
- 按照你说的按日期键入。
- 不同时间在不同 table 秒内的不同事件(例如:每月一个 table)
第二种方式的优点是可以隔离数据,让您可以move/store/change随时进行设置,而不是将来如果需要更改某些内容,就必须处理海量数据集。此外,如果您打算在将来删除(比方说,GDPR),您可以在删除完整的 table 时避免逻辑删除。