事务之间节点死亡/脱机时的Cassandra一致性问题

事务之间节点死亡/脱机时的Cassandra一致性问题,cassandra,Cassandra,我有一个设想 假设集群中有6个节点,复制因子为3。 现在我们正在使用quorum进行编写,因此假设协调器看到3个节点在需要传输数据的位置,但当它将数据发送到3个节点n1、n2、n3时。n1和n2停止工作,因此写入操作将失败,因为未满足仲裁,但n3将具有此失败的upsert的数据,因为cassandra没有回滚 之后会出现n1和n2,但数据较旧 现在,如果读取完成,在读取修复中,n3上存在的最新数据(失败的upsert)将复制到n1和n2。我的理解是否正确?是的,您是正确的 如果对该记录执行读取修

我有一个设想

假设集群中有6个节点,复制因子为3。 现在我们正在使用quorum进行编写,因此假设协调器看到3个节点在需要传输数据的位置,但当它将数据发送到3个节点n1、n2、n3时。n1和n2停止工作,因此写入操作将失败,因为未满足仲裁,但n3将具有此失败的upsert的数据,因为cassandra没有回滚

之后会出现n1和n2,但数据较旧

现在,如果读取完成,在读取修复中,n3上存在的最新数据(失败的upsert)将复制到n1和n2。我的理解是否正确?

是的,您是正确的

如果对该记录执行读取修复,则将从n3复制数据。这将取决于您的
read\u repair\u chance
配置以及查询记录的频率

如果没有经常查询记录,则不太可能运行读取修复,您将不得不等待修复运行

如果您没有定期运行
nodetool repair
,您应该开始这样做

请注意,如果您在修复之前使用“QOURUM一致性”阅读,您仍然会得到旧值。

是,您是正确的

如果对该记录执行读取修复,则将从n3复制数据。这将取决于您的
read\u repair\u chance
配置以及查询记录的频率

如果没有经常查询记录,则不太可能运行读取修复,您将不得不等待修复运行

如果您没有定期运行
nodetool repair
,您应该开始这样做


请注意,如果在进行修复之前使用
QOURUM
一致性进行读取,您仍将获得旧值。

存在两种不同类型的错误。如果n1和n2关闭,写操作甚至不会转到n3,您将得到一个不可用的异常,没有问题

如果n1和n2在写入开始后下降或发生灾难性丢失,则数据仍将存在于n3上,并且您将获得WriteTimeoutException,因为n3协调器将坐在那里等待其他2个副本响应。在写超时时,您需要以不同的方式处理错误,通常是通过串行读取(如果使用LWT)或其他类型的读取进行检查。通常写操作是幂等的,您可以再试一次


在QUORUM和rf=3的情况下,您只能真正安全地处理一个发生故障的节点。一旦你得到了2个副本,你将有很多潜在的问题,甚至数据丢失。这就是为什么许多人使用多个DC和更高的复制系数(如果数据非常重要),这样丢失DC甚至不会影响事情。

有两种不同类型的错误。如果n1和n2关闭,写操作甚至不会转到n3,您将得到一个不可用的异常,没有问题

如果n1和n2在写入开始后下降或发生灾难性丢失,则数据仍将存在于n3上,并且您将获得WriteTimeoutException,因为n3协调器将坐在那里等待其他2个副本响应。在写超时时,您需要以不同的方式处理错误,通常是通过串行读取(如果使用LWT)或其他类型的读取进行检查。通常写操作是幂等的,您可以再试一次


在QUORUM和rf=3的情况下,您只能真正安全地处理一个发生故障的节点。一旦你得到了2个副本,你将有很多潜在的问题,甚至数据丢失。这就是为什么许多人使用多个DC和更高的复制系数(如果数据非常重要),这样丢失DC甚至不会影响事情。

因此,在这种情况下,即使最终的一致性也无法满足,因为写入失败的数据将在群集中复制?只要它到达至少1个节点,它将“最终”复制到其他位置。我相信您可以检查Cassandra的错误,查看写入应用于多少个节点,因此基于此,您可以选择重新写入或等待一致性。找到了一个很好的答案,详细解释了:。因此,在这种情况下,即使是最终一致性也无法满足,因为写入失败的数据正在群集中复制?只要它到达至少1个节点,它将“最终”复制到其他位置。我相信您可以检查Cassandra的错误,查看写入应用于多少个节点,因此基于此,您可以选择重新写入或等待一致性。找到了一个很好的答案,可以更详细地解释:。提示切换最有可能涵盖此故障场景提示切换最有可能涵盖此故障场景