Cassandra “nodetool repair”也会针对保存数据的机器进行修复';你不在拳击场上认输吗?

Cassandra “nodetool repair”也会针对保存数据的机器进行修复';你不在拳击场上认输吗?,cassandra,datastax,datastax-enterprise,datastax-startup,Cassandra,Datastax,Datastax Enterprise,Datastax Startup,假设我有一个由三个节点组成的集群(为了简单起见),复制因子为1。让我们调用节点A、B和C 根据环,分区键X应该存储在A上。但是,由于数据库恢复,分区键X的数据已经在节点B上结束(而A根本不存储X) 问题:如果我发出nodetool repair,它会确保分区键X最终位于一个磁盘上吗 我知道,进行数据库恢复的真正方法是使用类似于sstableloader,但是由于不可预见的情况,对我来说,执行上述操作可能是一个更简单的解决方案(如果可行!)。您不能对复制因子为1的集群进行修复。如果每个节点专门拥有

假设我有一个由三个节点组成的集群(为了简单起见),复制因子为1。让我们调用节点A、B和C

根据环,分区键X应该存储在A上。但是,由于数据库恢复,分区键X的数据已经在节点B上结束(而A根本不存储X)

问题:如果我发出
nodetool repair
,它会确保分区键X最终位于一个磁盘上吗


我知道,进行数据库恢复的真正方法是使用类似于
sstableloader
,但是由于不可预见的情况,对我来说,执行上述操作可能是一个更简单的解决方案(如果可行!)。

您不能对复制因子为1的集群进行修复。如果每个节点专门拥有自己的令牌范围,那么Cassandra跨节点修复数据就没有意义了。在这种情况下,使用
sstableloader
将是更干净的解决方案。

我明白了。因此,修复不会针对每个其他节点检查数据?它会,也不会。请允许我向您指出,如果我能进一步澄清,请告诉我。谢谢Stefan。我读了这篇文章。太棒了!然而,据我所知,如果每次修复都基于一个令牌范围,那么修复只会为持有该令牌范围副本的节点计算merkle树?也就是说,答案总是“它不会”。在什么情况下,修复将检查是否有任何其他非副本节点碰巧拥有它们不应该持有的数据?令牌范围的非副本节点永远不会参与该范围的merkle树计算。对于您的三节点示例来说,这可能不太方便,但请考虑在具有数百个节点的集群中运行修复的影响……是的,我想这将是相当严重的,除非每个节点都可以跟踪非关联数据以快速检查它(根据您的答案,情况似乎并非如此)。说得好!非常感谢您的投入!非常感谢。