卡桑德拉,计数器和写冲突

时间:2018-05-09 17:17:15

标签: cassandra distributed-transactions consistency eventual-consistency

我们正在探索使用Cassandra作为存储时间序列类型数据的方法,因此这可能是一个noob问题。其中一个用例是从Kafka流中读取数据,查找匹配项,并递增计数器(例如,5个客户点击了页面上的链接alpha,增量(beta,alpha)为5)。但是,我们期望有很大程度的并行性来跟上负载,因此可能会有多个消费者同时从Kafka读取消息。

我的问题是:Cassandra如何解决从多个来源多次同时写入给定计数器的问题?

我的理解是,在收到的时间戳顺序中,对具有不同时间戳的计数器的多次写入将被添加到计数器中。但是,如果要使用 exact 相同的时间戳同时写入,那么Cassandra的LWW模型是否会抛出其中一个计数器增量?

如果我们要拥有一个大型集群(100多个节点),那么ALL或QUORUM写入可能不足以跟上消息流量。用THREE写入似乎可能导致进程#1写入节点A,B和C的情况,但进程#2可能写入X,Y和Z.LWT会在这里工作,还是不能打好反击活动?

1 个答案:

答案 0 :(得分:0)

我会尝试一个概念验证并对其进行基准测试,它很可能会正常工作。计数器在Cassandra中并不是超级高效的,特别是如果会有很多争用的话。

计数器与使用简单LWW的正常写入不同,它使用具有一些悲观锁定和专用缓存的paxos。分区锁争用会降低它的速度,而paxos是一个昂贵的多网络跳过程,在写入之前会有读取。

使用法定人数,不要尝试用CL与计数器做一些时髦的事情,特别是在基准测试之前知道你是否需要它。只要你不试图不断更新所有相同的分区,100节点集群应该能够处理很多。