【问题标题】:Cassandra Consistency Level In Some Special Scenario一些特殊场景下的 Cassandra 一致性级别
【发布时间】:2020-04-17 23:15:57
【问题描述】:

考虑一个有 4 个节点的集群。

复制因子已设置为 3。

我们提供了一个一致性级别设置为 ALL 的写入查询,但只有一个副本成功写入数据,另外两个从未响应。 (写入时崩溃)

在这种情况下,协调器以TimeOutException 响应,因此我们认为我们的请求未能持续。

然后我们对相同的 row_key 进行读取查询,一致性级别设置为 1,协调器将此请求发送到成功写入上一个请求的同一节点。

我的问题是接下来会发生什么?此读取查询是否返回值?如果是这样,这种行为是否真的有意义,因为我们首先抛出了 UnavailableException?

【问题讨论】:

  • 我的回答不正确...我刚刚检查了代码 - 在写入数据之前有一个检查(在 StorageProxy.java 中)以检查我们是否能够达到给定的 CL全部。所以在这种情况下,我们不应该向任何节点发送写请求。
  • 你说得对,Alex 但我对协调器认为所有节点都很好但其中一些节点在写入操作期间突然崩溃的情况更感兴趣。
  • 好的,那就另当别论了,让我取消删除我的答案并修改它。

标签: cassandra nosql cql eventual-consistency


【解决方案1】:

澄清后修改答案

如果 Cassandra 有信息(基于 Gossip)表明由于没有足够的副本而无法实现给定的 CL,Cassandra 可以通过 UnavailableException 尽早回答。

Coordinator 节点将尝试写入所有需要的副本,如果其中一些在操作过程中崩溃,那么协调器可能会为它们写一个提示,该提示将在节点返回后重播(默认为 3 小时)。协调节点应返回WriteTimeoutExceptionWriteFailureException

即使节点没有返回,并且您正在使用ONELOCAL_ONE 进行读取,那么您也可以取回数据。这就是所谓的最终一致性——数据最终会传播到所有副本——无论是通过提示还是通过修复。

您可以在DataStax Architecture Guide 中找到有关 Cassandra 如何写入和读取具有一致性级别的数据的更多信息。

【讨论】:

  • DataStax 文档说当协调器知道不发送任何写入消息就无法满足一致性级别时,会抛出 UnavailableException。
  • 但是如果协调器认为可以满足一致性级别,那么它会向指定的节点发送写入消息并等待,现在如果节点出现问题导致它们无法写入,那么协调器会返回超时异常这表明请求不成功,但有可能某些节点实际写入了数据,如果您执行一些读取命令,您可能会看到您的数据。我认为这没有任何意义,因为我们不希望看到结果。
猜你喜欢
  • 2016-07-05
  • 2018-06-13
  • 2017-01-09
  • 2021-05-07
  • 2018-07-26
  • 1970-01-01
  • 2017-05-06
  • 2014-09-16
  • 2014-09-19
相关资源
最近更新 更多