【问题标题】:Keep only newest N rows in Cassandra在 Cassandra 中只保留最新的 N 行
【发布时间】:2019-11-06 00:17:09
【问题描述】:

我反复执行一项操作,每次迭代都会在我的 Cassandra 表中创建一条记录。但是,出于我的目的,我只需要存储有限数量的最新结果。陈旧的行并不有趣,而且数据库的大小也会迅速膨胀,因为该操作需要在很多天内每秒运行多次。

我本质上是使用 Cassandra 表作为缓冲区。这是设计使然。

有没有办法将 Cassandra 设置为限制表可以拥有的行数,并在推送新行时自动删除旧行以最小化性能影响?

我的代码库是 Python,所以我更喜欢 Python 解决方案。

【问题讨论】:

    标签: python cassandra


    【解决方案1】:

    不,没有内置的这种方法。

    Cassandra 中删除旧信息的传统方法不是按计数,而是按日期:当您插入一行(甚至修改单个单元格)时,您可以设置一个过期时间 (又名 TTL)在此数据上。例如,您写了一行设置为在某一天过期。然后,Cassandra 将负责从磁盘中删除过期数据 - 自动且高效(实际上删除数据发生在压缩期间)。

    这当然与说您总是希望准确地保留最新的 1000 行不同,但如果您的主要目的是防止数据库大小爆炸,而不是真的保留特定数量的行。

    【讨论】:

      【解决方案2】:

      使用 Cassandra 作为缓冲区或消息队列是一种反模式(官方文档here)。如果你有很多删除,你最终会得到可能的墓碑记录,并且系统的性能将在墓碑的垃圾收集中受到影响。

      此外,墓碑会在一段时间内继续占据空间。

      我建议按照here 的说明使用 Kafka 或 MySQL 或 RDS

      否则,如果您希望继续仅使用 Cassandra,则可以将记录创建的时间戳作为集群键,并且您必须扫描完整的表,然后过滤前 N 条记录

      【讨论】:

      • 请注意,如果时间是 clustering 键,而不是分区键(这仅在您出于其他原因有很多分区时才有意义 - 例如,很多单独的输入流),那么您不需要 ALLOW FILTERING 来查找前 N - 记录已经按聚类键排序,而找到前 N 所需要做的就是在读取时设置一个 LIMIT 到N(当然,您希望集群键按 DESCending 顺序排序)。
      【解决方案3】:

      使用可以使用TTL。它会按照 TTL 中提到的时间自动删除行

      【讨论】:

        猜你喜欢
        • 2016-04-06
        • 2019-06-21
        • 1970-01-01
        • 1970-01-01
        • 2020-09-01
        • 2020-12-12
        • 1970-01-01
        • 1970-01-01
        • 2013-02-22
        相关资源
        最近更新 更多