为什么在cassandra的nodetool清理后丢失了一些数据

为什么在cassandra的nodetool清理后丢失了一些数据,cassandra,nodetool,Cassandra,Nodetool,我们向数据中心添加了一个新节点,然后根据运行nodetool cleanup。但在清理完成后,我们注意到丢失了一些数据 原因可能是什么?nodetool cleanup释放不再属于节点的分区键,因此在添加节点并传输其部分数据后,此“部分”不再属于旧节点,因此运行cleanup将在此节点上释放一些空间 如果您看到旧节点现在具有较低的存储空间,那么就可以了,没有任何数据丢失 另一方面,如果确实找不到某些数据,可能是由于数据损坏或删除了数据(带有墓碑)。数据丢失到底是什么意思?是的,重要的是要了解no

我们向数据中心添加了一个新节点,然后根据运行
nodetool cleanup
。但在清理完成后,我们注意到丢失了一些数据


原因可能是什么?

nodetool cleanup
释放不再属于节点的分区键,因此在添加节点并传输其部分数据后,此“部分”不再属于旧节点,因此运行cleanup将在此节点上释放一些空间

如果您看到旧节点现在具有较低的存储空间,那么就可以了,没有任何数据丢失


另一方面,如果确实找不到某些数据,可能是由于数据损坏或删除了数据(带有墓碑)。数据丢失到底是什么意思?

是的,重要的是要了解
nodetool cleanup
是一种潜在的破坏性工具。您的群集需要处于完全修复状态(通过定期成功运行
nodetool repair
previor)

将新节点添加到集群时,每个节点负责的令牌范围将被调整,并降低。这将使原始节点上的数据不再由它们负责。这是故意的

这个想法是,如果由于任何原因,节点添加过程失败,并且您必须保持集群的原始大小,那么数据仍然存在。但是,如果您不能保证您的集群首先处于完全修复状态,并且正在运行清理,那么很可能不是所有的副本都能到达它们正确的节点。但是像
nodetool getendpoints
一样,引导过程会假设它是


这就是为什么在运行
nodetool cleanup

之前,确保您已经在集群上定期运行了
nodetool repair
,这一点非常重要。请为这个问题添加更多信息,例如,添加新节点前后的
nodetool status
输出,以及如何导出丢失的数据。我同意应定期运行
nodetool repair
,正如您正确指出的,这一点非常重要。但是
nodetool cleanup
将只清除节点不拥有的范围。因此,如果说一旦启动,就无法在事实发生后进行修复,这不是更准确的说法吗?因为现有节点上的这些范围已被有效地解除了所有权?@markc只要有一个副本存活下来并使其进入节点上的有效范围,修复(启动后)应该会有所帮助。这样,丢失的复制副本就应该流式传输。但是,如果某个范围内的所有副本都已损坏或不在所拥有的范围内,那么在引导后进行修复是正确的,实际上不会有多大作用。