卡桑德拉计数器WriteTimeoutException

时间:2019-08-27 18:41:51

标签: cassandra

我们的系统有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

我又有一个关于“计数器”数据类型的查询。计数器数据类型线程上的更新是安全的,还是如果我们尝试从多个工作线程更新同一计数器,可能会导致不一致?

1 个答案:

答案 0 :(得分:0)

计数器类型不是“可靠的”计数器-由于其性质,您不知道写入是否发生。您可以重试该操作,但这可能导致重复写入。如果不重试,则可能会丢失数据。

但是,如果您需要可靠的计数,则可以使用另一种方法-将每个计数事件作为单独的行写入(我发送的标记为幂等,因此将重试它,并覆盖相同的数据)在某个分区中,然后有一个单独的作业,它将遍历所有行并汇总所有单独的计数。