我是cassandra的新手,并试图弄清楚cassandra如何在写入失败的情况下提供一致性。考虑以下CL为QUORUM的情况,在这种情况下,必须有3个副本中的2个响应。写入请求将照常发送到所有3个副本,如果写入2个副本失败,并且对1个副本成功,则cassandra将返回Failed。由于cassandra不回滚,因此该记录将继续存在于成功的副本中。现在,当带有CL = QUORUM的读取时,读取请求将转发到2个副本节点,并且如果其中一个副本节点是先前成功的副本节点,则cassandra将返回新记录,因为它将具有最新时间戳。但是从客户端的角度来看,该记录根本没有写入,因为cassandra在写入过程中返回了失败。如果是这种情况,那么在这种情况下,cassandra将永远不会保持一致。如何处理这种情况如果这种理解正确,请告诉我。
您的理解是正确的。在这种情况下,客户端应接收UnavailableException
,但应了解该写操作最终将传播到其他副本(如果节点处于活动状态或变为活动状态),并且这不是一次失败的写操作。
有关更多详细信息,请参见以下文章: