我们正在对我们的Cassandra集群(3个节点,复制系数3)进行负载测试,并且开始偶尔收到WriteTimeoutExceptions,用于一个表上的CAS插入操作:
CREATE TABLE users.by_identity (
account ascii,
domain ascii,
identity text
PRIMARY KEY ((account, domain), identity)
);
我们正在使用IF NOT EXISTS子句插入此表。当一个分区的负载增加到大于10次插入/秒时,客户端请求开始"超时":
com.datastax.driver.core.exceptions.WriteTimeoutException: Cassandra timeout during write query at consistency SERIAL (2 replica were required but only 1 acknowledged the write)
超时的WriteType为CAS,仅此表引发异常。执行时间始终为<;10ms。群集上的读/写超时配置为>1000毫秒,只有此表遇到问题。
您知道我们遇到的问题可能是什么吗?为什么延迟为毫秒的请求会超时?
我们使用的是Cassandra v3.0.8和DataStAX Java驱动程序v3.1.0。
很抱歉回答晚了,但您可能遇到了此错误:https://issues.apache.org/jira/browse/CASSANDRA-9328
您可以通过减少并发性来进行确认,这样一次只有一个请求(如果您的请求非常快,您可能仍然可以每秒一个接一个地执行10个快速请求,只是没有任何并发),并保留您的集群设置(3个节点,复制系数3),或者将请求速率保持在10/s并将您的集群设置更改为单个节点。如果这样做,您可能看不到任何超时<;1000毫秒,然后更改回复制系数为3的并发10和3节点,并且您可能会再次复制超时设置太低的超时。 不幸的是,错误报告没有提供任何伪代码来解决这个问题,而是说您应该自己检查状态,以查看是否确实发生了写入,并基于此进行重试。如果您的写入是幂等的,那么您可能只需要简单地重试。 不幸的是,就我的目的而言,我们的应用程序相当复杂,如果没有很多其他工作,我们无法解决问题,因此我们仍然生活在这个错误中。如果这最终是您遇到的问题,我很有兴趣看到一个伪代码示例,说明您是如何解决这个问题的,因为它可能会为其他遇到这个问题的人提供灵感。