【问题标题】:Hector to get the resulting counter value after doing incrementCounterHector 在执行 incrementCounter 后获取结果计数器值
【发布时间】:2012-02-20 18:01:51
【问题描述】:

我们正在执行以下操作来更新计数器的值,现在我们想知道是否有一种直接的方法可以立即取回更新的计数器值。

mutator.incrementCounter(rowid1, "cf1", "counter1", value);

【问题讨论】:

    标签: cassandra counter hector


    【解决方案1】:

    Cassandra thrift API 中没有单一的“incrementAndGet”操作。

    Cassandra 中的计数器最终是一致的且非原子的。 Fragile ConsistencyLevel.ALL 操作需要获得“保证更新”计数器值,即执行一致读取。 ConsistencyLevel.QUORUM 不够(如计数器设计文档中所述:https://issues.apache.org/jira/secure/attachment/12459754/Partitionedcountersdesigndoc.pdf)。

    要实现 看起来 一致的 incrementAndGet 方法,您可能需要首先 读取 计数器值,然后发出 increment 突变,然后返回(读取价值 + 公司)。

    例如,如果之前的计数器值是 10 到 20(在不同的副本上),并且一个添加 50,那么 read-before-increment 将返回 60 或 70。而 read-after-increment 可能仍会返回 10 或20.

    【讨论】:

    • 这将如何解决计数器不是原子的问题。例如,如果我再做一次(递增和读取)操作,那么我可能仍然会得到旧值:调用 1:计数器 val:1 读取(获取 1),递增 1(发出调用),返回 2调用 2:(最后一个增量调用尚未通过所有节点传播)读取(获取 1),递增 1(发出调用),返回 2
    • @AlastorMoody:正如我所说,这种方法允许实现看起来一致的计数器。由于 cassandra 计数器本质上最终是一致的,因此只有以显着影响性能为代价(即使用分布式锁)才能使计数器成为原子计数器。如果你真的需要原子计数器——除了 Cassandra 之外还有很多工具(比如 Redis)
    • @Wildfire 我的意思是,这种方法通常可能会导致计数器看起来一致,但并非在所有情况下都有效。例如,如果连续两次对您的方法进行后续调用,则该方法可能不会返回预期值。你能指导我在这个推理中我哪里出错了吗?
    • @AlastorMoody:您是绝对正确的:计数器最终不一致。所以,当然,有些情况是显而易见的。 :)
    • 我想使它们保持一致的唯一方法是将一致性级别设置为 ALL。
    【解决方案2】:

    唯一的方法是查询它。 Cassandra 中不提供先增量后读取功能。

    【讨论】:

      猜你喜欢
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多