哪一个在Cassandra中使用TTL或删除更好?

时间:2018-06-04 08:09:09

标签: cassandra datastax-enterprise cassandra-3.0

我想在特定时间后从Cassandra集群中删除记录。 那么我应该使用TTL或手动删除什么?

3 个答案:

答案 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墓碑有足够的时间在整个集群中传播。
  • 7天后行数为TTL(如上所述)。之后,它们再次成为墓碑10天。
  • 我按照DESCending顺序按transaction_time进行聚类。这会将我关心的行(没有TTL的行)放在我的分区的“顶部”(顺序)。
  • 通过查询前7天的transaction_time,我忽略了比这更早的事情。由于我的TTL墓碑将在10天后存在,它们将位于我的分区的“底部”。

通过这种方式,将我的查询限制为过去7天可确保 Cassandra 从不必须处理逻辑删除,因为我的查询永远不会找到它们 的。所以在这种情况下,我已经构建了一个数据模型,其中TTL比随机删除“更好”。