Cassandra 写入查询在 2 秒后超时

7

我有一个Cassandra单体应用程序,在那里我想以高速率从队列中读取一些有效载荷。Cassandra集群有3个节点。当我开始并行处理大量消息(通过生成线程)时,我会遇到下面的异常

java.util.concurrent.ExecutionException: com.datastax.oss.driver.api.core.DriverTimeoutException: Query timed out after PT2S

我正在创建CQLsession作为bean。
return CqlSession.builder().addContactPoints(contactPoints)
            /*.addContactPoint(new InetSocketAddress("localhost", 9042))*/
            .withConfigLoader(new DefaultDriverConfigLoader()).withLocalDatacenter("datacenter1")
            .addTypeCodecs(new CustomDateCodec())
            .withKeyspace("dev").build();

我将这个CqlSession注入到我的映射器和其他类中来运行查询。

在我的DataStax驱动程序中,我将3个节点的IP地址作为联系点给出。是否需要在创建CQL会话/或我的Cassandra节点中进行任何调整,以便它们可以在高并发时进行写入?还可以同时进行多少次写入?

所有更新语句都没有任何条件,只针对主键进行操作。


源数据来自 Kafka,经过处理后写入多个表中。其中一些是批量写入,我知道分区键相同,而另一些则是异步普通写入。 - user1228785
我正在使用Cassandra 4 beta版本.. 这可能是问题吗? - user1228785
不应该将其链接到Cassandra 4 - 它是支持的版本。 - Alex Ott
我建议尝试使用DataStax的Kafka连接器(https://docs.datastax.com/en/kafka/doc/index.html),而不是手动编写代码。 - Alex Ott
我有自定义代码,需要在写入磁盘之前对消息进行处理。我正在使用磁盘存储,这可能会成为问题吗? - user1228785
显示剩余4条评论
1个回答

8

你看到的超时是因为你的应用程序过载了集群,相当于进行了DDoS攻击。

PT2S是2秒写入超时时间。当提交日志磁盘承受不了太多的写入IO时,会出现一个点。如果在日志或nodetool tpstats中看到了丢失的变异,这就确认了提交日志无法跟上写入速度。

如果你的集群可以支持10K次写入/秒,但你的应用程序却进行了20K次写入,那么你需要将集群的大小加倍(添加更多节点)以支持吞吐量要求。干杯!


是的,我曾经使用磁盘来检查是否可以节省成本。一旦我转移到SSD,问题就解决了。 - user1228785
我在读取压力测试期间遇到了这个问题。写入大小分布指标显示60B(字节)大小。Cassandra在只读压力测试期间尝试写入什么? - Capacytron
1
@Capacytron,如在其他频道中所讨论的,即使是纯读取工作负载,C*也会存储一些指标,因此会发生少量写入。由于Astra上的速率限制,您遇到了“DriverTimeoutException”。它是可配置的,并且可以根据请求进行增加。干杯! - Erick Ramirez
@ErickRamirez PT这个缩写代表什么? - undefined
@BradSchoening,PT代表的是Period and Time,它是ISO 8601标准的一部分:https://en.wikipedia.org/wiki/ISO_8601#Durations - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接