cassandra计数器writetimeoutexception

xhv8bpkk  于 2021-06-14  发布在  Cassandra
关注(0)|答案(1)|浏览(324)

我们的系统有3-4个表,其中保存了从应用程序触发的事件的计数器(数据类型)。我们使用kafka进行排队,应用程序是使用dropwizard设计的。
系统的相关部分如下所示:

[Ingestion Module] -> Kafka -> [Analytics Module] -> Cassandra

数据量很大。当我们在“分析模块”中增加工人/消费者的数量时,我们开始得到以下例外情况:

! com.datastax.driver.core.exceptions.WriteTimeoutException: Cassandra timeout during COUNTER write query at consistency LOCAL_ONE (1 replica were required but only 0 acknowledged the write)
! at com.datastax.driver.core.Responses$Error$1.decode(Responses.java:88)
! at com.datastax.driver.core.Responses$Error$1.decode(Responses.java:66)
! at com.datastax.driver.core.Message$ProtocolDecoder.decode(Message.java:297)
! at com.datastax.driver.core.Message$ProtocolDecoder.decode(Message.java:268)
! at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:88)
! ... 25 common frames omitted

cassandra设置:
节点:5
复制因子:2
版本:3.4
查询1
有人能帮我们找出这个问题的可能原因/解决方法吗?或者请给我们指出正确的方向。
查询2
我还有一个关于“counter”数据类型的查询。计数器数据类型的更新是线程安全的吗?如果我们尝试从多个worker更新同一个计数器,会导致不一致吗?

epfja78i

epfja78i1#

计数器类型不是“可靠的”计数器-由于它的性质,您不知道是否发生了写入。您可以重试该操作,但这可能会导致双写。如果不重试,则可能会丢失数据。
但是,如果需要可靠的计数,可以使用另一种方法—在某个分区内将每个计数事件作为单独的行写入(我将其标记为幂等,因此将重试,并覆盖相同的数据),然后使用一个单独的作业来遍历所有行并对所有单独的计数求和。

相关问题