我想在特定时间后从Cassandra集群中删除记录。 那么我应该使用TTL或手动删除什么?
答案 0 :(得分:2)
答案是"它取决于"。删除cassandra中的数据绝不是免费的。
如果你必须"删除"您需要始终发出这些查询,TTL从您编写数据的那一刻起就完成了。但是通过使用DELETE,您可以更好地控制数据删除。
在操作方面,你应该尝试将你的墓碑放在同一个sstable中,这样一旦gc_grace过期,就可以删除完整的sstable。因为在压缩sstables时实际上只删除了数据,即使gc_grace已经过去了,并且在sstable持有墓碑的情况下没有发生压缩,也不会从硬盘中删除墓碑。这也使您可以选择压缩策略。
如果您还使用了很多墓碑,则应始终启用:" unchecked_tombstone_compaction"在表级。您可以在此处详细了解:https://docs.datastax.com/en/cql/3.1/cql/cql_reference/compactSubprop.html
答案 1 :(得分:1)
让记录根据TTL过期更好。使用基于TTL的删除,您可以将gc_grace_seconds设置为更低的值(1天或2天),并且您不必担心墓碑会持续较长时间。
通过手动删除,您需要确保逻辑删除不会超出警告和错误阈值,因为它会影响查询。
答案 2 :(得分:0)
这取决于您的数据模型。幸运的答案是,由于其可预测的性质,您可以构建您的数据模型以适应TTL。
假设我构建了下表来跟踪用户对REST服务的请求,例如。假设我真的只关心上周的数据,所以我将TTL设置为604800秒(7天)。所以我需要支持的查询基本上就是这样(查询前7天用户'Bob'的事务):
SELECT * FROM rest_transactions_by_user
WHERE username='Bob' AND transaction_time > '2018-05-28 13:41';
为了支持该查询,我将构建此表:
CREATE TABLE rest_transactions_by_user (
username TEXT,
transaction_time TIMESTAMP,
service_name TEXT,
HTTP_result BIGINT,
PRIMARY KEY (username,transaction_time))
WITH CLUSTERING ORDER BY (transaction_time DESC)
AND gc_grace_seconds = 864000
AND default_time_to_live = 604800;
有几点需要注意:
gc_grace_seconds
,默认为864000(十天)。这将确保TTL墓碑有足够的时间在整个集群中传播。transaction_time
进行聚类。这会将我关心的行(没有TTL的行)放在我的分区的“顶部”(顺序)。transaction_time
,我忽略了比这更早的事情。由于我的TTL墓碑将在10天后存在,它们将位于我的分区的“底部”。通过这种方式,将我的查询限制为过去7天可确保 Cassandra 从不必须处理逻辑删除,因为我的查询永远不会找到它们 的。所以在这种情况下,我已经构建了一个数据模型,其中TTL比随机删除“更好”。