首页 > 解决方案 > CAS写入查询期间的Cassandra WriteTimeoutException

问题描述

我们有两个 CAS 查询。每个区域 2 个容器运行良好。我们将容器从 2 个增加到 3 个,然后我们开始看到 WriteTimeoutException。与正常营业时间相比,流量相同甚至更少。Cassandra 位于 3 个区域,每个集群有 3 台主机。

不确定这些错误的原因是什么,但应用程序容器中的变化增加了一个。感谢此处是否有任何帮助以进一步调试。

UPDATE order_sequences USING TTL 10 set instance_name = ?  where id_name = ? IF instance_name = null", ConsistencyLevel.QUORUM)
UPDATE order_sequences SET next_id= ? where id_name= ? IF next_id= ? AND instance_name = ?", ConsistencyLevel.QUORUM),

错误堆栈:

com.datastax.driver.core.exceptions.WriteTimeoutException: Cassandra timeout during CAS write query at consistency SERIAL (7 replica were required but only 0 acknowledged the write) at
com.datastax.driver.core.exceptions.WriteTimeoutException.copy(WriteTimeoutException.java:85) at 
com.datastax.driver.core.exceptions.WriteTimeoutException.copy(WriteTimeoutException.java:23) at 
com.datastax.driver.core.DriverThrowables.propagateCause(DriverThrowables.java:35) at 
com.datastax.driver.core.ChainedResultSetFuture.getUninterruptibly(ChainedResultSetFuture.java:59) at 
com.datastax.driver.core.NewRelicChainedResultSetFuture.getUninterruptibly(NewRelicChainedResultSetFuture.java:11) at com.datastax.driver.core.AbstractSession.execute(AbstractSession.java:58) at 

标签: cassandradatastaxdse

解决方案


CAS 写入是一个专门的指标,在​​进行比较和设置时触发。LWT 事务称为比较和设置 (CAS);比较副本数据,发现任何过期的数据都设置为最一致的值。

在 Cassandra 中,该过程将 Paxos 协议与正常的读写操作相结合来完成比较和设置操作。

Paxos 协议实现为一系列阶段:

• 准备/承诺 • 阅读/结果 • 提议/接受 • 提交/确认

这四个阶段需要在提出轻量级事务的节点和事务中涉及的任何集群副本之间进行四次往返。性能会受到影响。因此,为必须考虑并发的情况保留轻量级事务。

例如,以下一系列操作可能会失败:

删除 ... 插入 .... 如果不存在 选择 ....

以下一系列操作将起作用:

删除......如果存在插入......如果不存在选择......

强烈建议您检查“nodetool proxyhistograms”命令中的“CAS 写入延迟”统计信息,它在命令执行时提供网络统计信息的直方图。

如果您仍然遇到此错误,请告诉我吗?


推荐阅读