【问题标题】:Cassandra and cleaning old data with counter typeCassandra 和使用计数器类型清理旧数据
【发布时间】:2017-12-07 23:03:24
【问题描述】:

所以我知道由于设计原因 TTL 不适用于计数器,我已经阅读了 https://issues.apache.org/jira/browse/CASSANDRA-2103 以及其他一些关于此的 SO 问题,但似乎没有明确的答案(除非我遗漏了一些完全合理):

我们如何优雅地处理 Cassandra 中的计数器过期?

示例用例:特定日期的页面浏览量。

为此,我们可能有一个表格,例如

CREATE TABLE 页面浏览量(页面 varchar、日期 varchar、查看次数计数器、PRIMARY KEY(page, date));

一年后,我们在某一天获得了多少观看次数的信息并不是很相关(相反,我们可能已将其汇总到一个观看/月表或类似的表格中),我们不希望在其中保留不必要的数据我们的数据库无缘无故。通常我们会为此设置一个 TTL 并让 Cassandra 为我们处理 - 优雅!但是由于我们不允许对计数器表使用 TTL,所以这不是一个选项..

您也不能只运行 delete from pageviews where date > 'xxxx' 因为这两个键都必须在 where 子句中定义。 您首先需要先查询所有页面,然后发出单独的删除,这是不可扩展的。 有什么合适的方法可以实现吗?

【问题讨论】:

    标签: select cassandra counter ttl


    【解决方案1】:

    明显慢,但如果您不想自己管理到期,这有点贵 - 您可以使用 LWT 并实际插入 TTL 列而不是更新一个柜台。即:

    CREATE TABLE pageviews (
      page varchar,
      date timestamp,
      views int,
      PRIMARY KEY(page, date))
    WITH compaction = {'class': 'LeveledCompactionStrategy'};
    

    要更新页面视图:

    UPDATE pageviews USING TTL 604800
       SET views = *12*
       WHERE page = '/home' AND date = YYYY-MM-DD
       IF views = *11*
    

    如果失败,请重新阅读并重试。如果竞争激烈,这可能会很慢,但在这种情况下,您可以对每个应用程序进行一些批处理,比如每 10 秒刷新一次更新或某事,并且一次增加超过 1

    查看日期范围内的总数:

    SELECT sum(views) FROM pageviews WHERE page='/home' and date >= '2017-01-01 00:00:00+0200' AND date <= '2017-01-13 23:59:00+0200'
    

    最快的方法是使用计数器,然后在不太忙的时间做一份工作,删除超过 X 天的内容。

    另一个想法,如果您对某些 % 错误感到满意,您可以在每页使用一个计数器并使用 forward decay 来“过期”(使微不足道的)旧视图增量,但仍需要定期调整地标。不过,这对于查看范围没有那么有用,只会为您提供“到目前为止的总数”的估计值。

    【讨论】:

    • 感谢您的回答。好吧,正如我提到的,工作清理的问题是你必须知道页面 id,这意味着你必须记住它们。就我而言,这可能是巨大的。您不能只从日期 >= 'xxx' 的综合浏览量中删除。我觉得这是对 cassandra 的严格限制,并且有合法的用例,您希望使用 ttl 和 counter 行。跑了一些测试,select distinct on primary key其实挺快的,只是一段时间内要发出的delete语句量会成倍增长。
    【解决方案2】:

    如果不需要日期范围查询,可以使用page % X, date的分区键和page的集群键。

    然后对于您希望丢弃的每个日期,您可以使用 X 删除语句删除分区 0 到 X - 1。

    【讨论】:

      猜你喜欢
      • 2012-11-16
      • 1970-01-01
      • 2012-02-07
      • 2017-10-22
      • 2011-04-08
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 2018-05-07
      相关资源
      最近更新 更多