我们正在对我们的cassandra集群进行负载测试(3个节点,复制因子3),并开始在一个表上接收CAS插入操作的偶然 WriteTimeoutExceptions :
CREATE TABLE users.by_identity (
account ascii,
domain ascii,
identity text
PRIMARY KEY ((account, domain), identity)
);
我们正在使用 IF NOT EXISTS 子句对此表进行插入。当将负载增加到>对于一个分区,10个insert / s,客户端请求开始“超时”:
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 ,仅针对此表抛出异常。执行时间总是< 10毫秒。读/写超时配置为>群集上1000毫秒,只有此表遇到问题。
任何想法可能是我们遇到的问题,为什么我们会在延迟时间内获得请求超时?
我们使用的是Cassandra v3.0.8和Datastax Java驱动程序v3.1.0。
答案 0 :(得分:0)
很抱歉无法提供最新答案,但您可能遇到了以下错误:https://issues.apache.org/jira/browse/CASSANDRA-9328
您可以通过减少并发性来进行确认,因此一次仅存在1个请求(如果您的请求非常快,您可能仍然可以每秒仅执行10个快速请求,而另一个则没有任何并发请求),保留群集设置(3个节点,复制因子3)或将请求速率保持为10 / s,并将群集设置更改为单个节点。如果这样做,您可能不会看到任何<1000 ms的超时,然后再更改为复制因子为3的并发10和3节点,则很可能会再次产生对于超时设置而言太低的超时。
不幸的是,错误报告没有提供任何伪代码来解决该问题,但是确实说您应该自己检查状态以查看写入是否实际发生,然后根据该状态重试。如果您的写是幂等的,则可能只需要重试即可。
不幸的是,出于我的目的,我们的应用程序非常复杂,如果没有很多其他工作,我们将无法解决,因此我们仍然生活在这个错误中。如果这最终成为您遇到的问题,我很想在伪代码中看到一个示例,说明您如何解决该问题,因为它也可能为其他遇到此问题的人提供启发。