【问题标题】:Performance - TTL vs Deleting a row in Cassandra性能 - TTL 与在 Cassandra 中删除一行
【发布时间】:2023-03-21 17:59:01
【问题描述】:

我们有大量数据写入 cassandra 中的数百万行。我们还有一个调度程序,需要处理这些记录,并在处理成功后将其删除。

想知道是在处理后删除行还是用 TTL 标记行(本质上是延迟删除)。

删除与 TTL w.r.t Cassandra 性能有什么优点/缺点吗?

非常感谢 _DD

【问题讨论】:

  • 嗯,我的意见只是基于对我们系统的观察,但在我看来,TTL 应该更好地提高性能。我们经常使用 TTL,没有性能问题。但是,有时我们会运行手动清理作业,这会导致系统负载过重。

标签: cassandra


【解决方案1】:

根据我阅读的内容,TTL 可能会与您最快的删除过程一样快。这样做的原因是 TTL 不必为了用墓碑标记数据而寻找数据。 TTL 存在于记录中,当读取记录并且 TTL 已过期时,它会被标记为墓碑。

http://docs.datastax.com/en/cql/3.1/cql/cql_using/use_expire_c.html

【讨论】:

    【解决方案2】:

    从您在这里提供的少量信息中,我觉得您正在使用 Cassandra 作为队列,这是一种众所周知的反模式。您可以在此处阅读更多相关信息:

    http://www.datastax.com/dev/blog/cassandra-anti-patterns-queues-and-queue-like-datasets

    但是,要回答您的基本问题,使用 TTL 和删除之间的性能差别不大。 C* 中的 TTL 被处理为与删除相同的墓碑。主要区别在于,在再次读取该记录之前,不会将墓碑写入 TTL 已过期的记录。当调用删除时,会立即创建一个墓碑。墓碑通常会在 C* 中导致严重的性能问题,虽然有一些方法可以缓解它们所产生的问题,但大量墓碑通常指向糟糕的数据模型或 C* 的糟糕用例。如果您真的在考虑使用 C* 作为队列,为什么不考虑使用更适合该目的的东西,例如 Redis?

    【讨论】:

    • 感谢 bechbd 的说明 - 是的,我知道这种反模式。不幸的是,由于资源限制,我们不想依赖另一个数据源。回到您的观点-“主要区别在于,在再次读取该记录之前,不会将墓碑写入 TTL 已过期的记录”-这是否意味着如果我们不访问该记录-它会保留在数据库中? .请详细说明
    • 不,它仍将作为压缩过程的一部分被删除。我的意思是,除非读取 TTL 记录,否则不会写入额外的墓碑记录。
    【解决方案3】:

    使用 TTL 时,记录不会立即从存储中删除,它会被标记为墓碑。只有在压缩发生时它才会被物理移除。到那时,数据会影响节点处理,因为它会消耗资源,直到发生压缩。当您执行范围查询事件时,Cassandra 会扫描已删除(标记为墓碑)的记录。因此使用 TTL 删除过多的条目被认为是反模式。建议使用临时表,这样就不需要删除单个行。只需删除整个表格。

    【讨论】:

    • 如果我使用范围查询只查询范围不包括墓碑怎么办?难道也扫描墓碑记录?虽然键有二级索引?
    猜你喜欢
    • 2017-03-10
    • 2019-12-20
    • 2018-12-11
    • 2015-01-04
    • 2013-10-04
    • 1970-01-01
    • 2011-11-09
    • 2021-07-28
    • 2017-05-23
    相关资源
    最近更新 更多