13

我正在开发一个用于研究 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)中寻找线索,但没有找到解决方案。

有人能帮我吗?预先感谢

4

2 回答 2

18

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

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

于 2012-12-04T01:32:35.673 回答
2

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

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

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

最好确保永远不会发生。

于 2017-01-12T10:22:50.833 回答