Cassandra在丢失突变后会返回给客户什么?

Cassandra在丢失突变后会返回给客户什么?,cassandra,Cassandra,当Cassandra端有“丢失的突变”时,它是否会向调用客户端返回相应的失败?或者它总是成功响应调用事务的客户机,即使相应的突变在服务器端被丢弃并导致数据丢失 在一个特定的例子中,我们观察到当TPS约为80K/秒,延迟增加4000+毫秒时,大量缺失突变(约6k缺失突变/秒)。该集群为6节点集群。现在不要和我一起使用node/cassandrayaml配置。一般来说,如何排除这种“缺失突变”。 奇怪的是,即使在稍后的时间,我们也无法复制这种行为。在写入时,如果在写入请求\u超时\u毫秒内有足够的副

当Cassandra端有“丢失的突变”时,它是否会向调用客户端返回相应的失败?或者它总是成功响应调用事务的客户机,即使相应的突变在服务器端被丢弃并导致数据丢失

在一个特定的例子中,我们观察到当TPS约为80K/秒,延迟增加4000+毫秒时,大量缺失突变(约6k缺失突变/秒)。该集群为6节点集群。现在不要和我一起使用node/cassandrayaml配置。一般来说,如何排除这种“缺失突变”。
奇怪的是,即使在稍后的时间,我们也无法复制这种行为。

在写入时,如果在
写入请求\u超时\u毫秒内有足够的副本响应(默认情况下为2秒),您将在客户端看到成功的响应

请考虑使用一致性<代码> Quracu<代码>的情况,其中复制因子为3。当从客户端向协调器发送写操作时,协调器会同时向所有三个副本发送写请求。如果两个副本能够在

写入请求\u超时\u in \u ms
内响应,则协调器将向客户端发送成功响应。同时,如果第三个副本无法在
write\u request\u timeout\u in\u ms
内开始处理写入变异,它将删除该变异

在这个场景中,突变被删除的事实对于客户端来说是不可见的,但是从客户端的角度来看,这是可以的!您所要求的只是一个确认写入的节点仲裁

然而,从操作角度来看,这是一个值得关注的问题。你的复制品在超时之前甚至无法开始处理变异,这可不好

造成这种情况的可能原因有很多,如垃圾收集混乱、硬件问题,或者您的集群资源调配不足。监测缺失突变以确定这些情况是了解发生了什么的一个好步骤

如果您担心副本之间的一致性问题,cassandra会使用多种反熵机制来进入一致状态。如果在读取数据时发现不一致,读修复将通过应用具有最高时间戳的单元,使这些节点上的副本处于一致状态。即使所需副本之间的数据不匹配,仍可能根据表配置的读取修复机会触发读取修复,以确保所有副本之间的数据一致。您还应该按计划运行


最后一个注意事项是,如果没有足够的副本响应以满足您的一致性级别,您将看到客户端出现
WriteTimeoutException
s。这可能意味着你的复制品正在丢失突变,但事实并非如此。他们可能已经开始处理突变,但没有在超时时间内完成处理。在这种情况下,写入将应用于这些副本。

非常感谢Andy。这真的很有帮助。目前,数据是由Google Dataflow作业编写的。需要检查设置的一致性级别。Andy,在最后一点上,这是否意味着即使客户端收到WriteTimeoutException,写入请求也必须成功,只是它没有在超时时间内完成,因此出现了错误。在这种情况下,有没有一种方法可以在不检查数据的情况下知道写操作是否发生?是的,写操作并不能保证发生。有些事情总是会出错,例如删除突变、提示窗口过期等,但在一般情况下会发生写操作。如果它是幂等写操作(即不是类似于计数器增量的操作),那么最好的办法就是再次尝试写操作,直到成功为止。这比读取来查看数据是否写入要好,但如果操作是非幂等的,则读取来检查值就可以了。