【问题标题】:TTL vs default_time_to_live which one is better and why?TTL 与 default_time_to_live 哪个更好,为什么?
【发布时间】:2018-10-07 21:36:02
【问题描述】:

要求很简单:我们必须创建一个只有 24 小时数据的表。 我们有两个选择

  1. 每次插入都会破坏 TTL
  2. 使表属性 default_time_to_live 24 小时。

我对这两件事都有大致的了解,但在内部,哪一个对处理墓碑有帮助?还是两者都会产生相同数量的墓碑?哪一个会更好,为什么任何参考链接都会受到赞赏。

【问题讨论】:

  • 谢谢大家!!!从 Mikea 那里得到了所需的答案...

标签: cassandra datastax-enterprise ttl


【解决方案1】:

如果你使用 Cassandra 3.0 还可以定义物化视图,详见:https://docs.datastax.com/en/cql/3.3/cql/cql_using/useCreateMV.html

使用 TTL 不是那么有效,因为您会生成大量墓碑,这取决于数据量可能会影响您的读取性能。

我认为您关于 TTL 的问题也在这里得到解答:

cassandra TTL for table behaviour

【讨论】:

  • 请注意,物化视图存在很多错误,它被视为实验性功能
【解决方案2】:

如果一个表上有default_time_to_live,那么超过这个时间限制的行会被立即删除,而不会写入墓碑。这不会影响已设置显式 TTL 的行/列。这些将被立碑。

如果您沿着 TTL 路线走,那么您应该考虑将表上的 gc_grace_seconds 属性设置为小于默认值(10 天)的值。特别是如果您正在查看 24 小时 TTL。

参考资料:

How data is deleted

CREATE TABLE properties

About Deletes and Tombstones in Cassandra

【讨论】:

【解决方案3】:

如果你使用 Go,那么 GocqlX 使用基于表模型的 RewriteRows 函数解决了这个问题。

https://github.com/scylladb/gocqlx/commit/13ef8ceaf1c1661ec51459347e6b2aea6e59037c

例子:

    if err := session.ExecStmt("ALTER TABLE XXXXX WITH default_time_to_live = 0"); err != nil {
        return err
    }
    if err := table.RewriteRows(session, myGocqlXTableModelForXXXXX); err != nil {
        return err
    }

对于大表,您应该使用 efficient full table scan 加上这种技术。

【讨论】:

    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多