【发布时间】:2014-01-24 02:01:35
【问题描述】:
我有一个 Cassandra 问题。你知道 Cassandra 是如何更新/增加计数器的吗?
我想使用一个写入 cassandra 的风暴螺栓(来自 github 上的storm-contrib repo 的 CassandraCounterBatchingBolt)。但是,我不确定 incrementCounterColumn() 方法的一些实现是如何工作的......而且 cassandra 计数器(来自:http://wiki.apache.org/cassandra/Counters)也存在限制,这使得它们对我的场景恕我直言无用:
如果写入意外失败(超时或失去与协调节点的连接),客户端将不知道操作是否已执行。重试可能会导致 CASSANDRA-2495 计数过多。
计数器移除本质上是有限的。例如,如果您非常快速地发出“递增、删除、递增”序列,则删除可能会丢失
无论如何,这是我的场景:
我更新同一个计数器的速度比更新传播到其他 Cassandra 节点的速度要快。
示例:
假设我有 3 个 cassandra 节点。每个节点上的计数器都是 0。
节点1:0,节点2:0,节点3:0一个增量来了:5 -> Node1:0, node2:0, node3:0
增量从节点 2 开始——仍然需要传播到节点 1 和节点 3
节点1:0,节点2:5,节点3:0与此同时,另一个增量在前一个增量之前到达
传播:3 -> Node1:0, node2:5, node3:0假设 3 从与 5 开始的节点不同的节点开始:
节点1:3,节点2:5,节点3:0
现在如果 3 作为增量而不是作为新值传播到其他节点 (对于 5 也是一样)然后最终节点都等于 8,这就是我想要的。
如果 3 覆盖 5(因为它具有较晚的时间戳),这是有问题的 - 这不是我想要的。
您知道 Cassandra 如何处理这些更新/增量吗?
请注意,写入之前的读取仍然容易受到相同问题的影响,具体取决于读取从哪个副本节点执行(如果传播距离不远,Quorum 仍然可能失败)
我也在想,也许在我的风暴螺栓和 Cassandra 中放置一个缓存可能会解决这个问题,但那是另一个故事了。
【问题讨论】:
标签: cassandra distributed apache-storm