【问题标题】:Apache Cassandra delete from counterApache Cassandra 从计数器中删除
【发布时间】:2012-11-19 04:09:41
【问题描述】:

我正在开发一个用于研究 Apache Cassandra 和 Java EE 6 的小型 Web 应用程序。 Cassandra 版本是 1.1.6。

有一个问题让我发疯... 我创建了一个带有计数器的表(使用 cqlsh v. 3.0.0)

CREATE TABLE test (
  author varchar PRIMARY KEY,
  tot counter
)

并以这种方式放置一些值:

update test set tot = tot +1 where author = 'myAuthor';

列族完美更新

author   | tot
----------+-----
myAuthor |   1

但是,如果您尝试删除此行,然后再次更新(使用相同的键),则不会发生任何事情!该表不再更新,我不知道为什么:在我看来,一旦你使用了一个密钥,你就不能再使用它了。 我在 datasax 文档 (http://www.datastax.com/docs/1.1/references/cql/cql_lexicon) 中寻找线索,但没有找到解决方案。

有人可以帮助我吗? 提前致谢

【问题讨论】:

  • 如果我想改变计数器的值,我必须更新计数器 update table set counter = counter i> -1 但我的问题是:为什么我不能再使用删除键了?

标签: cassandra counter cql3


【解决方案1】:

Cassandra 对删除计数器有一些严格的限制。您不能真正删除计数器,然后在任何短时间内再次使用它。来自Cassandra wiki

计数器移除本质上是有限的。例如,如果您非常快速地发出“递增、删除、递增”序列,则删除可能会丢失(如果由于某种原因删除恰好是最后收到的消息)。因此,计数器的删除仅用于最终删除,即当删除的计数器随后不增加时。这也适用于行删除:如果您删除一行计数器,增加该行中的任何计数器(在删除之前存在)将导致未确定的行为。请注意,如果您需要重置计数器,一个选项(不幸的是不是并发安全的)可能是读取其值并添加 -value。

【讨论】:

  • 如果您在阅读本文之前删除了该行,您如何解决?
【解决方案2】:

重新添加已删除的计数器键的解决方案是从表中清除它的所有记录:

nodetool repair $table
cqlsh -c "ALTER TABLE $table WITH gc_grace_seconds=1;"
sleep 1
nodetool compact $table

正如您可以想象的那样,这在实际系统中是不切实际的,如果一个重要的计数器被意外删除,可能应该保留以备不时之需。

最好确保永远不会发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-15
    • 2021-08-15
    • 2017-05-18
    • 2011-07-30
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    相关资源
    最近更新 更多