一些特殊场景下的Cassandra一致性级别
Cassandra Consistency Level In Some Special Scenario
考虑一个包含 4 个节点的集群。
复制因子已设置为 3。
我们给出了一个一致性级别设置为 ALL 的写入查询,但只有一个副本成功写入数据,另外两个从未响应。 (写入时崩溃)
在这种情况下,协调器以 TimeOutException
响应,因此我们认为我们的请求未能持续。
然后我们对相同的 row_key 进行了读取查询,一致性级别设置为 1,协调器将此请求发送到与前一个请求成功写入的同一节点。
我的问题是接下来会发生什么?这个读取查询returns是否有值?如果是这样,这种行为真的有意义吗,因为我们首先抛出了 UnavailableException?
澄清后修改答案
如果 Cassandra 有信息(基于 Gossip)表明由于没有足够的副本而无法实现给定的 CL,它可以用 UnavailableException
尽早回答。
协调器节点将尝试写入所有需要的副本,如果其中一些在操作过程中崩溃了,那么协调器可能会为它们写一个提示,将在节点返回后重播(默认为 3 小时) .协调器节点应该 return WriteTimeoutException
或 WriteFailureException
.
即使节点未返回,并且您正在使用 ONE
或 LOCAL_ONE
读取,您也可以取回数据。这就是所谓的最终一致性 - 数据最终将传播到所有副本 - 通过提示或修复。
中找到有关 Cassandra 如何以一致性级别写入和读取数据的更多信息
考虑一个包含 4 个节点的集群。
复制因子已设置为 3。
我们给出了一个一致性级别设置为 ALL 的写入查询,但只有一个副本成功写入数据,另外两个从未响应。 (写入时崩溃)
在这种情况下,协调器以 TimeOutException
响应,因此我们认为我们的请求未能持续。
然后我们对相同的 row_key 进行了读取查询,一致性级别设置为 1,协调器将此请求发送到与前一个请求成功写入的同一节点。
我的问题是接下来会发生什么?这个读取查询returns是否有值?如果是这样,这种行为真的有意义吗,因为我们首先抛出了 UnavailableException?
澄清后修改答案
如果 Cassandra 有信息(基于 Gossip)表明由于没有足够的副本而无法实现给定的 CL,它可以用 UnavailableException
尽早回答。
协调器节点将尝试写入所有需要的副本,如果其中一些在操作过程中崩溃了,那么协调器可能会为它们写一个提示,将在节点返回后重播(默认为 3 小时) .协调器节点应该 return WriteTimeoutException
或 WriteFailureException
.
即使节点未返回,并且您正在使用 ONE
或 LOCAL_ONE
读取,您也可以取回数据。这就是所谓的最终一致性 - 数据最终将传播到所有副本 - 通过提示或修复。