在Cassandra中,为什么在nodetool清理后会丢失一些数据?

3

2
请在此问题中添加更多信息,例如您添加新节点之前和之后的nodetool status输出以及您如何推断出数据丢失的情况。 - markc
2个回答

9
是的,重要的是要理解nodetool cleanup是一个可能有破坏性的工具。在运行nodetool cleanup之前,您的集群需要处于完全修复状态(先前定期成功运行nodetool repair)。
当您向集群添加新节点时,每个节点负责的令牌范围会进行调整,并且每个节点都会降低。这将导致原始节点上的数据不再由它们负责。这是有意设计的。
这样做的想法是,如果由于某种原因节点添加过程失败,并且您必须将集群保留在其原始大小,则数据仍然存在。但是,如果您无法保证首先使您的集群处于完全修复状态并运行了清理,则可能并非所有副本都已到达其正确的节点。但是,就像nodetool getendpoints一样,引导过程会认为已经完成了。
这就是在运行nodetool cleanup之前确保您已经定期在集群上运行nodetool repair的重要性所在。

我同意nodetool repair应该经常运行,正如你正确指出的那样,这非常重要。然而,nodetool cleanup只会清除节点不拥有的范围。因此,更准确地说,一旦你完成引导操作后,你实际上不能通过修复来恢复数据,因为现有节点上的那些范围已经被无效化了,也就是被释放了所有权。 - markc
只要有一个副本存活并进入节点的有效范围,那么引导后的修复应该会有所帮助。这样,被忽略的副本应该会被流式传输。但是,如果某个范围的所有副本都已损坏或不在拥有的范围内,则您是正确的,引导后的修复确实不会有太大作用。 - Aaron

1

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

如果您发现旧节点现在具有较低的存储空间,那没关系,没有任何数据丢失。

另一方面,如果您真的找不到某些数据,可能是由于数据损坏或删除(使用墓碑)。 无论如何,您所说的数据丢失是什么意思?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接