代码之家  ›  专栏  ›  技术社区  ›  Flavio

写一致性=全部:我还需要每周修复以避免僵尸记录吗?

  •  1
  • Flavio  · 技术社区  · 7 年前

    据我所知,删除的数据在卡桑德拉重新出现的问题如下:

    • 发出的删除具有一致性<all(例如quorum)
    • 删除成功,但在删除过程中无法访问复制集中的某些节点
    • 墓碑被写入所有到达的节点,而其他节点中没有。
    • 10天过去了,墓碑有资格过期
    • 压缩发生,墓碑实际上被移除
    • 发出读取:接收到“无数据”的删除回复的节点;在使用旧数据的删除回复期间不可用的节点;生成僵尸

    现在我的问题是:如果原始删除是以consistency=all发出的,那么所有节点要么有墓碑(在expiry&compression之前),要么根本没有数据(在expiry&compression之后)。即使在墓碑到期之前我们没有发布修复,也不应该产生僵尸。

    这是对的吗?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Chris Lohfink    7 年前

    是的,即使删除了cl.all,如果要保证没有恢复的数据,仍然需要运行修复。你只是在不知不觉中降低了它发生的可能性。

    如果某个节点不可用于删除,则客户端的删除将失败(因为cl.all),但其他所有节点仍收到删除。即使你的应用会重试删除,也有可能失败(即你的应用服务器被流星击中)。因此,您有一个已被3个副本中的2个看到的删除。如果您降低了gc_的优雅度,并且没有运行repairs,那么其他的反熵措施(提示,读取repairs)可能无法确保墓碑(它们是尽最大努力而不是保证)在墓碑被压缩之前被第三个节点看到。下一次读取会接触到第三个节点,该节点具有原始数据,并且不存在表示该数据已被删除的墓碑,因此在将数据的读取修复到其他副本时会将其恢复。

    您可以做的是将一条语句记录到某个地方,以指向cl.all超时或失败的时间。这并不是一个保证,因为你的应用程序可能在日志之前就死掉了,而失败并不意味着写操作并没有到达所有的副本——只是 可以 的未能写入。也就是说,我强烈建议只使用quorum(或local_quorum)。这样,您就可以在不损失可用性的情况下发生一些主机故障,因为您无论如何都需要对保证进行修复。

        2
  •  1
  •   dilsingi    7 年前

    当使用consistency=all发出查询时,具有该特定记录的令牌范围的每个节点都必须确认。因此,如果在此过程中某个节点关闭,则删除将失败,因为它无法达到所需的一致性=全部。