在 Cassandra 中使用 TTL 或 Delete 哪个更好?

Raj*_*gir 3 cassandra datastax-enterprise cassandra-3.0

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

小智 5

答案是“视情况而定”。删除 cassandra 中的数据从来都不是免费的。

如果您必须“删除”,您需要始终发出这些查询,使用 TTL 从您写入数据的那一刻起就完成了。但是通过使用 DELETE,您可以更好地控制数据删除。

在操作方面,您应该尝试将墓碑放在同一个 sstable 中,这样一旦 gc_grace 过期,就可以删除完整的 sstable。因为数据只有在sstables被compact时才真正被删除,即使gc_grace过去了,并且sstable持有tombstone时没有发生compaction,tombstone也不会从硬盘中删除。这也使您的表的压缩策略选择相关。

如果您还使用大量墓碑,则应始终启用:表级别的“unchecked_tombstone_compaction”。您可以在此处阅读更多相关信息:https : //docs.datastax.com/en/cql/3.1/cql/cql_reference/compactSubprop.html


Aar*_*ron 5

这取决于您的数据模型。幸运的是,由于它们的可预测性,您可以构建数据模型来适应 TTL。

例如,假设我构建下表来跟踪用户对 REST 服务的请求。假设我真的只关心上周的数据,所以我将 TTL 设置为 604800 秒(7 天)。所以我需要支持的查询基本上是这样的(查询用户“Bob”过去 7 天的交易):

SELECT * FROM rest_transactions_by_user 
  WHERE username='Bob' AND transaction_time > '2018-05-28 13:41';
Run Code Online (Sandbox Code Playgroud)

为了支持该查询,我将构建此表:

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;
Run Code Online (Sandbox Code Playgroud)

有几点需要注意:

  • gc_grace_seconds我以默认值 864000(十天)离开。这将确保 TTL 逻辑删除有足够的时间在整个集群中传播。
  • 行将在 7 天后 TTL(如上所述)。之后,它们会再成为墓碑 10 天。
  • 我按transaction_time降序排列。这会将我关心的行(尚未 TTL 的行)放在分区的“顶部”(按顺序)。
  • 通过查询transaction_time前 7 天中的某天,我会忽略比这更早的任何内容。由于我的 TTL 墓碑将在 10 天后存在,因此它们将位于我的分区的“底部”。

这样,将我的查询限制为最近 7 天可以确保Cassandra永远不必处理墓碑,因为我的查询永远不会找到它们。因此,在本例中,我构建一个数据模型,其中 TTL 比随机删除“更好”。