据我了解,Cassandra中重新出现的已删除数据的问题如下:
现在我的问题是:如果原始删除是使用consistency = ALL发出的,那么所有节点都将具有逻辑删除(在到期和压缩之前)或根本没有数据(在到期和压缩之后)。即使我们没有在墓碑到期之前发布修复,也不会产生僵尸。
这是对的吗?
答案 0 :(得分:3)
是的,如果你想保证没有复活的数据,你仍然需要在删除时使用CL.ALL进行修复。你只是在没有注意到它的情况下减少它发生的可能性。
如果某个节点不可用于删除,则客户端的删除将失败(因为cl.all),但其他节点仍然收到删除。即使你的应用程序将重试删除它有可能失败(即你的应用程序的服务器被流星击中)。那么你的3个副本中有2个已经看到了删除。如果您降低了gc_grace并且没有进行修复,则其他反熵措施(提示,读取修复)可能无法确保在墓碑被压缩之前第3个节点看到墓碑(它们是尽力而为的保证)。下一个读取涉及具有原始数据的第3个节点,并且没有墓碑存在表示它已被删除,因此您将数据恢复为其修复到其他副本的读取。
当你有一个cl.all超时或失败时,你可以做的就是在某个地方记录一个语句。这不是一个保证,因为您的应用程序可能会在日志之前死亡,而失败并不意味着写入没有到达所有副本 - 只是它可能无法写入。那说我强烈建议使用quorum(或local_quorum)。这样,您可以在不丢失可用性的情况下获得一些主机故障,因为无论如何您都需要维修保修。
答案 1 :(得分:1)
当发出具有Consistency = ALL的查询时,具有该特定记录的令牌范围的每个节点都必须确认。因此,如果其中一个NODE在此过程中出现故障,则DELETE将失败,因为它无法实现所需的一致性= ALL。
因此,一致性= ALL,可能最终成为集群中的每个节点都必须保持运行的情况,否则查询将失败。这就是为什么人们建议使用比QUORUM更强的一致性。因此,如果要在CONSISTENCY = ALL
执行查询,则会牺牲REPAIR的高可用性