Adr*_*ian 16 distributed cassandra apache-storm
我有一个卡桑德拉问题.你知道Cassandra如何更新/增加计数器吗?
我想使用风暴螺栓(来自github上的storm-contrib repo的CassandraCounterBatchingBolt)写入cassandra.但是,我不知道怎么样了一些incrementCounterColumn的实现()方法的工作..而且还有与卡桑德拉计数器限制(来源:中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开始 - 仍然需要传播到node1和node3节点
1:0,节点2 :5,节点3 :0与此同时,在
传播前一个增量之前,另一个增量到达:3 - > Node1:0,node2:5,node3:0假设3个在不同于5个
起始点的节点上启动,我们有:Node1:3,node2:5,node3:0
现在,如果3传播到其他节点AS AN INCREMENT而不是作为新值传播(并且5相同),那么最终节点将全部等于8,这就是我想要的.
如果3覆盖5(因为它有一个更晚的时间戳)这是有问题的 - 不是我想要的.
你知道Cassandra如何处理这些更新/增量吗?
注意,写入之前的读取仍然容易受到同一问题的影响,这取决于读取执行的副本节点(如果传播距离不远,仲裁仍然会失败)
我也在想,也许放一个缓存b/w我的风暴螺栓和Cassandra可以解决这个问题,但这是另一个故事.
The*_*heo 18
C*中的计数器具有复杂的内部表示,可以避免在无引线分布式系统中计算事物的大多数(但不是全部)问题.我喜欢将它们视为分片计数器.计数器由许多由主机ID和版本号标识的子计数器组成.接收计数器操作的主机仅增加其自己的子计数器,并且还增加版本.然后它将其整个计数器状态复制到其他副本,并将其与其状态合并.当读取计数器时,处理读取操作的节点通过总计来自每个主机的计数总数来确定计数器值.
在每个节点上,计数器增量就像Cassandra中的其他所有内容一样,只是一个写入.增量被写入memtable,并且通过合并memtable和所有SSTable中的所有增量在读取时确定本地值.
我希望当我说你不必担心增加计数器的速度比Cassandra能够处理的时候,这个解释会让你相信我.由于每个节点都保留自己的计数器,并且永远不会复制增量操作,因此不会出现因读取 - 修改 - 写入方案引入的竞争条件而导致计数丢失的可能性.如果Cassandra接受了写作,你几乎可以保证它会被计算在内.
但是,你不能保证,除非是计数在任何时候都是正确的.如果一个增量被写入一个节点,但是刚刚从另一个节点读取的计数器值,则无法保证增量已被复制,您还必须考虑网络分区期间会发生什么.这与Cassandra中的任何写入大致相同,它最终是一致的,它取决于您用于操作的一致性级别.
也有可能失去确认.如果你做了一个增量并且松散了与Cassandra的连接,然后你才能得到回复,你就无法知道你的写作是否得到了.当你得到连接时,你也无法分辨,因为在增加之前你不知道计数是多少.对于选择可用性而不是一致性的系统而言,这是一个固有的问题,以及您为许多其他好处付出的代价.
最后,快速删除,增量,删除的问题是真实的,你应该避免的.问题是增量操作基本上会恢复列,如果这些操作彼此足够接近,它们可能会得到相同的时间戳.Cassandra是严格的最后写入胜利,并根据操作的时间戳确定最后一次.如果两个操作具有相同的时间戳,则"更大"的操作将获胜,这意味着以严格的字节顺序对其进行排序.这是真的,但我不会太担心它,除非你正在快速写入和删除相同的值(这可能是你的数据模型中的错误).
这是Cassandra计数器内部的一个很好的指南:http://www.datastax.com/wp-content/uploads/2011/07/cassandra_sf_counters.pdf
| 归档时间: |
|
| 查看次数: |
6364 次 |
| 最近记录: |