Cassandra节点没有空间执行压缩(garbagecollect),我们可以安全地删除SSTables并修复吗?

aydmsdu9  于 2023-11-18  发布在  Cassandra
关注(0)|答案(1)|浏览(186)

我正在使用一个有10个节点的Cassandra集群。不幸的是,在这些节点上,我们使用了2个单独的键空间:第一个中有2个表,第二个中有1个表。
我们的问题似乎来自第一个键空间中的一个表。我们的复制因子为10,所以我假设每个节点上都有整个表的副本,但是这4个节点的磁盘使用率明显高于其他6个节点。大约30%/40%%。
我尝试在一个有问题的节点上运行“nodetool -h localhost garbagecollect”,但不幸的是,由于以下原因,该过程甚至没有启动:“* 没有足够的空间用于压缩,估计sstables = 1,预期写入大小= 61055287773*"。
我的猜测是,在某个时候,由于上述问题,无法启动garbagecollect过程,并且从那时起,根本没有删除过期的行。前几个月的存储变化图似乎表明了类似的情况。此外,删除历史没有关于此表上完成的任何操作的数据。
因此,作为一种潜在的修复方法,我正在考虑在4个有问题的节点上删除该表的SSTables,考虑到该表不再插入。然后在每个节点上运行:“nodetool -h localhost repair --full”,以便它们从剩余的6个节点复制该表的数据(在重新创建SSTables的过程中?)。这是一个合理的,或者完全可以实现的选择吗?我应该在删除SSTables之前提前刷新这个表的commitlog和Memtable吗?
不幸的是,正如前面提到的,这些节点上的第二个keyspace对我们来说非常重要,因为它甚至有一个更小的复制因子5,所以副本在所有节点上都不可用。我担心删除不再使用的表的SSTables并修复它可能会导致其他keyspace上的重要表出现问题。

7nbnzgx9

7nbnzgx91#

一般来说,如果压缩由于磁盘空间不足而停止,并且您完全用完了磁盘空间,如果您确定在群集中的其他位置具有一致的数据副本,则可以安全地将节点脱机,删除数据,然后重新联机后运行完全修复。
只要确保你有一个良好的数据副本的节点将保持在线。如果你不确定,你总是可以开始只删除键空间数据,有一个RF为10,然后尝试让压缩赶上RF 5键空间之前修复RF 10键空间。如果你走这条路,请确保您使用高于ONE/NOW_ONE的一致性级别进行读取,并一次修复一个节点,以确保阅读一致的数据。

相关问题