Cassandra不保证原子行为,因此一个副本失败的可能性很小,但其他副本确实存在变化。
是否有任何信息可以防止这种情况以及为了治愈它而采取的措施?卡桑德拉在这方面是否自食其力?
[更新]
我特别关注您发送写入请求的情况,假设所有副本只有一个副本因写入错误而失败。写入失败的节点仍然存在且可操作。根据Cassandra文档,即使另外两个(如果复制因子为3)成功,写请求也会返回失败。
根据本案例中的文档,两个副本已更改,一个仍保留原始副本。有人说,在这种情况下,它是一个不一致的状态,因为其他两个将无法回滚所写的任何变更。
所以问题在于如何才能为此辩护。
答案 0 :(得分:2)
在cassandra中,诸如此类的超时不被视为失败。请参阅this blog post,描述Cassandra在写入时如何处理不同的条件:
请记住,对于写入,超时不是失败。
我们怎么能说因为我们不知道副本失败之前发生了什么?协调器可以强制结果进入更新前或更新后状态。这就是卡桑德拉所做的暗示交接。
...协调器在本地存储更新,并在恢复时将其重新发送到失败的副本,从而迫使它进入客户端最初想要的更新后状态。
所以为了回答你的问题,是的,cassandra将使用暗示切换来自我修复,并且当该过程失败时(即在副本变为在线之前超过max_hint_window_in_ms),修复应该使事情进入一致状态。这是建议定期进行维修的一个原因。
This article更详细地解释了暗示的切换。