【问题标题】:Cassandra Counters Double CountingCassandra 计数器重复计数
【发布时间】:2015-04-10 02:58:39
【问题描述】:

我是 Cassandra 的新手,有时会遇到计数器重复计数的问题。我正在尝试跟踪某些事件的每日事件计数。这是我的表结构:

create table pipes.pipe_event_counts (
    count counter,
    pipe_id text,
    event_type text,
    date text,
    PRIMARY KEY ((pipe_id, event_type, date))
);

我正在使用的驱动程序是 Datastax Java 驱动程序,我正在编译并将参数绑定到以下准备好的语句:

incrementPipeEventCountStatement =  CassandraClient.getInstance().getSession().prepare(
    QueryBuilder.update("pipes", PIPE_EVENT_COUNT_TABLE_NAME).with(incr("count")).
    where(eq("pipe_id", "?")).and(eq("date", "?")).and(eq("event_type", "?")).
    getQueryString()
);

incrementPipeEventCountStatement.bind(
    event.getAttrubution(Meta.PIPE_ID), dateString, event.getType().toString()
)

这个问题很奇怪。有时,当我处理单个事件时,计数器会正确递增 1。但是,大多数情况下,它会加倍。我已经查看我的代码一段时间了,找不到任何会导致第二次增量的问题。

我在 Cassandra 中的计数器实现是否适合我的用例?我想是的,但我可能会失去理智。我希望有人能帮我确认一下,这样我就可以专注于正确的领域来找到我的问题。

重要编辑:这是我正在运行的查询,以检查事件后的计数:

select count from pipes.pipe_event_counts where pipe_id = 'homepage' and event_type = 'click' and date = '2015-04-07';

【问题讨论】:

  • 什么版本的 cassandra? datastax.com/dev/blog/…
  • 我使用的是 2.1。感谢您的链接 - 我会检查一下。
  • 我还没有弄清楚是什么原因造成的,但这只是我的开发环境中的一个问题。我正在使用 Play Framework 来托管应用程序,并且它在本地处于开发模式(如预期的那样)。大概与此有关。无论哪种情况,都不是生产问题,所以我暂时忽略它。

标签: cassandra datastax


【解决方案1】:

计数器的问题在于它们不是幂等操作,因此当您重试时(并且不知道您的原始写入是否成功),您最终可能会过度计数。

您也永远不能重试和少计。

正如 Chris 所言,计数器实现 pre-2.1 存在一些问题,这使得多算问题更加严重。还存在与计数器相关的性能问题,因此您需要确保在将计数器部署投入生产之前仔细研究这些问题。

以下是相关的 Jiras,可帮助您做出明智的决定:

Counters ++(重大改进 - 已修复 2.1)--https://issues.apache.org/jira/browse/CASSANDRA-6504

来自大型计数器工作负载的内存 / GC 问题,Counter Column(重大改进 - 已修复 2.1)--https://issues.apache.org/jira/browse/CASSANDRA-6405

计数器进入单独的单元格(最终解决方案 - eta 3.1)- https://issues.apache.org/jira/browse/CASSANDRA-6506

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 2012-06-15
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2015-01-01
    相关资源
    最近更新 更多