从快照恢复卡桑德拉

Restoring cassandra from snapshot

所以我做了一些测试 run/disaster 恢复练习,删除 table 并通过我构建的测试集群上的快照在 Cassandra 中恢复。

这个测试集群有四个节点,我使用了节点重启方法,所以在 t运行cating 有问题的 table 之后,所有节点都被关闭,commitlog 目录被清除,当前快照数据复制回每个节点的 table 目录。之后,我将每个节点都备份了。然后按照文档我 运行 对每个节点进行修复,然后对每个节点进行刷新。

我的问题是,假设 none 个节点已关闭,为什么我之后需要 运行 对每个节点进行修复,除非我关闭它们以执行恢复程序? (在这个测试实例中,数据量很小,修复时间很短,如果在我们的生产环境中发生这种情况,修复将需要大约 12 个小时才能执行,因此在灾难场景中这对我们来说可能是一个巨大的问题) .

而且我假设 运行在单个节点实例上完全不需要修复,对吗?

只是想弄清楚 运行修复和后续刷新的目的是什么。

什么是修复?

修复是 Cassandra 的主要反熵机制之一。从本质上讲,它确保您的所有节点都拥有所有数据的最新版本。需要 12 小时的原因(顺便说一句,这是正常的)是它是一项昂贵的操作——io 和 CPU 密集型——为所有数据生成默克尔树,并将它们与其他节点的默克尔树进行比较,并流式传输任何丢失/过时的数据。

为什么 运行 从快照恢复后进行修复

修复为您提供一致性基准。例如:如果快照不是在同一时间拍摄的,如果您使用 CL ONE 并点击从旧快照恢复的副本,则有机会读取陈旧数据。修复可确保您的所有副本都与最新的可用数据保持同步。

tl;博士:

repairs would take about 12 hours to perform so this could be a HUGE issue for us in a disaster scenario).

虽然您的修复是 运行ning,但如果您的快照没有完全相同的数据,您将有读取陈旧数据的风险。如果它们是旧快照,gc_grace 可能已经通过某些逻辑删除,如果逻辑删除未在集群中很好地传播,则僵尸数据的风险更高。

相关方咆哮-什么时候运行修复?

修复一词的通俗定义似乎暗示您的系统已损坏。我们认为“我必须 运行 维修?我一定是做错了什么才能达到这种 未修复 状态!”这是不正确的。修复是 Cassandra 的正常维护操作。事实上,您应该至少每 gc_grace 秒 运行ning 修复一次,以确保数据一致性并避免僵尸数据(或使用 opscenter repair service)。

在我看来,我们应该称它为 AntiEntropyMaintenenceCassandraOilChange 或其他名称而不是 Repair :)