我对cassandra还很陌生,我想弄清楚cassandra是如何在写操作失败的情况下提供一致性的。考虑以下场景,其中cl是仲裁,在这种情况下,三个副本中有两个必须响应。写入请求将照常转到所有3个副本,如果写入2个副本失败,并且在1个副本上成功,则cassandra将返回failed。由于cassandra不回滚,因此记录将继续存在于成功的复制副本上。现在,当读取带有cl=quorum时,读取请求将被转发到2个副本节点,如果其中一个副本节点是先前成功的,那么cassandra将返回新记录,因为它将具有最新的时间戳。但从客户机的Angular 来看,这个记录根本没有被写入,因为cassandra在写入过程中返回了失败。如果是这样的话,那么Cassandra将永远不会在这种情况下保持一致。如何处理这种情况请让我知道,如果这个理解是正确的。
1条答案
按热度按时间wdebmtf21#
你的理解是正确的。在这种情况下,客户应该收到
UnavailableException
,但应该理解,写入最终将传播到其他副本(如果节点处于活动状态或变为活动状态),并且这不是失败的写入。有关更多详细信息,请参阅以下文章:
https://www.datastax.com/blog/2014/10/cassandra-error-handling-done-right
http://mighty-titan.blogspot.com/2012/06/understanding-cassandras-consistency.html