首页 > 解决方案 > 为什么即使满足一致性级别,cassandra 写入也会失败?

问题描述

我有以下配置的 cassandra 集群设置:-

我创建了一个示例 spring boot api,它递归地插入到 keyspace(test) 的 table(testing1) 中。

在执行写入操作之前,我使用 tc 命令在其中一个节点中引入了延迟(2100ms)作为响应,因此当执行写入操作时,我们会得到 writetimeoutexception,因为在 cassandra.yaml 中将 write_request_timeout 设置为 2000ms。Cassandra 仍应成功执行写入操作,因为需要确认满足一致性级别 (2) 的节点正在正常工作,但我收到以下异常:-

com.datastax.driver.core.exceptions.WriteTimeoutException:在一致性 LOCAL_QUORUM 写入查询期间 Cassandra 超时(需要 2 个副本,但只有 1 个确认写入)。

为什么即使 ack(2) 所需的节点已启动并正在运行,写入也会失败?

标签: spring-bootcassandradatastaxspring-data-cassandra

解决方案


写入必须在超时内完成才能不出现超时异常。无论节点是否已启动。

Cassandra 仍应成功执行写入操作,因为需要节点确认满足一致性级别 (2)

不,它不应该也不会。如果超时已超过节点可能会丢弃突变并依靠提示、读取修复和反熵修复来解决它。突变的状态是未知的并作为错误返回,因此可以重试或至少不假定在仲裁中应用它,这样它就不会破坏一致性合同。


推荐阅读