从快照恢复cassandra

从快照恢复cassandra,cassandra,cassandra-2.0,datastax,datastax-enterprise,Cassandra,Cassandra 2.0,Datastax,Datastax Enterprise,因此,我做了一些测试运行/灾难恢复实践,在我构建的测试集群上删除一个表并通过快照在Cassandra中恢复 这个测试集群有四个节点,我使用了node restart方法,因此在截断相关的表之后,所有节点都被关闭,commitlog目录被清除,当前快照数据被复制回每个节点的表目录。之后,我将每个节点都恢复。然后根据文档,我在每个节点上运行修复,然后在每个节点上刷新 我的问题是,为什么我必须在每个节点上运行修复之后,假设没有任何节点关闭,除非我关闭它们以执行恢复过程?(在这个测试实例中,数据量很小,

因此,我做了一些测试运行/灾难恢复实践,在我构建的测试集群上删除一个表并通过快照在Cassandra中恢复

这个测试集群有四个节点,我使用了node restart方法,因此在截断相关的表之后,所有节点都被关闭,commitlog目录被清除,当前快照数据被复制回每个节点的表目录。之后,我将每个节点都恢复。然后根据文档,我在每个节点上运行修复,然后在每个节点上刷新

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

我假设在单个节点实例上运行修复是完全不必要的,对吗

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

什么是修复? 修复是卡桑德拉的主要反熵机制之一。本质上,它确保所有节点都具有所有数据的最新版本。之所以需要12小时(顺便说一句,这是正常的),是因为为所有数据生成merkel树、将其与其他节点的merkel树进行比较以及流式传输任何丢失/过时的数据是一项昂贵的操作——io和CPU密集型操作

为什么在从快照恢复后运行修复 修复为您提供了一致性基线。例如:如果快照不是在同一时间拍摄的,则如果使用CL ONE并命中从旧快照恢复的副本,则有可能读取过时数据。修复可确保您的所有副本都是最新的可用数据

tl;博士: 维修大约需要12个小时,因此这可能是一个巨大的损失 灾难场景中的问题)

在修复运行期间,如果快照没有相同的精确数据,则可能会读取过时数据。如果它们是旧快照,gc_grace可能已经通过了一些墓碑,如果墓碑没有在集群中很好地传播,则会给您带来更高的僵尸数据风险

相关侧-何时进行维修? 术语修复的同位定义似乎暗示您的系统已损坏。我们认为“我必须进行维修?我一定是做错了什么事情才到达这个未维修的状态!”这根本不是真的。维修是卡桑德拉的正常维护操作。事实上,您应该至少每几秒钟运行一次修复,以确保数据一致性并避免僵尸数据(或使用)

在我看来,我们应该称之为
反熵维护
CassandraOilChange
或其他什么,而不是
修复
:)