Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Transactions 如果Cassandra报告失败但进行了部分写入,该怎么办?_Transactions_Cassandra_Acid - Fatal编程技术网

Transactions 如果Cassandra报告失败但进行了部分写入,该怎么办?

Transactions 如果Cassandra报告失败但进行了部分写入,该怎么办?,transactions,cassandra,acid,Transactions,Cassandra,Acid,Cassandra不保证原子行为,因此一个复制副本失败的可能性很小,但另一个复制副本确实保留了更改 是否有任何信息可以用来防御这种情况,以及如果发生这种情况,如何治疗?卡桑德拉在这方面能自愈吗 [更新] 我特别关注这样一种情况,即向所有副本发送写入请求,但只有一个副本由于写入错误而失败。写入失败的节点仍处于活动状态且可运行。根据Cassandra文档,即使其他两个(如果复制系数为3)成功,写入请求也将返回失败 根据本例中的文档,两个副本已更改,一个保留原始副本。有人说,在这种情况下,它是一个不一

Cassandra不保证原子行为,因此一个复制副本失败的可能性很小,但另一个复制副本确实保留了更改

是否有任何信息可以用来防御这种情况,以及如果发生这种情况,如何治疗?卡桑德拉在这方面能自愈吗

[更新]

我特别关注这样一种情况,即向所有副本发送写入请求,但只有一个副本由于写入错误而失败。写入失败的节点仍处于活动状态且可运行。根据Cassandra文档,即使其他两个(如果复制系数为3)成功,写入请求也将返回失败

根据本例中的文档,两个副本已更改,一个保留原始副本。有人说,在这种情况下,它是一个不一致的状态,因为其他两个将无法回滚任何已写入的更改


因此,问题是,人们如何才能防范这种情况

在cassandra中,这样的超时不被视为失败。请参见描述Cassandra在写入时如何处理不同的条件:

请记住,对于写入,超时不是失败

既然我们不知道复制失败之前发生了什么,我们怎么能这么说呢?协调器可以强制结果进入更新前或更新后状态。这就是卡桑德拉所做的暗示交接

…协调器将更新存储在本地,并在恢复时将其重新发送到失败的复制副本,从而强制其进入客户端最初希望的更新后状态

所以,为了回答您的问题,是的,cassandra将使用暗示切换进行自我修复,当该过程失败时(即在副本联机之前超过最大提示窗口),修复应使事情进入一致状态。这就是建议定期进行维修的原因之一


更详细地解释暗示的交接。

谢谢您提供的正确信息。但我特别针对写入错误,而副本保持完整。因此,两个节点已更改,但其中一个仍处于旧状态。那么这是如何解决的呢?暗示的移交、修复和读取修复将解决这个问题。Cassandra在写入时使用时间戳,并使用一个称为“上次写入获胜”的概念,因此,具有最新时间戳的写入将被视为正确的写入。解释cassandra如何通过在列上使用时间戳来处理此问题的博客文章:如果您以较低的读写一致性级别进行查询,则可能会得到不一致的数据,这就是为什么在读和写时使用相同的一致性级别很重要,除非您不介意暂时不一致的数据。或者我同意在写时使用ALL-on-write,在读时使用one-on-read,但如果在写和读时使用quorum,我也可以保存,对吗?