清理几乎已满的Cassandra节点中的空间

清理几乎已满的Cassandra节点中的空间,cassandra,nodetool,scylla,Cassandra,Nodetool,Scylla,我有一个Cassandra集群(2个DC),每个集群有6个节点,RF 2个。4个节点(每个DC中)已满,因此我需要尽快清理空间 我试图进行一次全面的维修,但结果是一个坏主意,因为空间开始增加了更多,维修最终被挂起。作为最后一个解决方案,我正在考虑开始修复,然后从最小到最大清理特定的列 i、 e 您认为该程序对数据安全吗 谢谢你你不应该用超过50-60%的磁盘来压缩空间。如果你超过了磁盘使用量,你需要考虑得到更大的磁盘或增加更多的节点。 Datastax建议通常很好遵循:您在问题中提出的命令做出了

我有一个Cassandra集群(2个DC),每个集群有6个节点,RF 2个。4个节点(每个DC中)已满,因此我需要尽快清理空间

我试图进行一次全面的维修,但结果是一个坏主意,因为空间开始增加了更多,维修最终被挂起。作为最后一个解决方案,我正在考虑开始修复,然后从最小到最大清理特定的列

i、 e

您认为该程序对数据安全吗


谢谢你

你不应该用超过50-60%的磁盘来压缩空间。如果你超过了磁盘使用量,你需要考虑得到更大的磁盘或增加更多的节点。
Datastax建议通常很好遵循:

您在问题中提出的命令做出了一些不正确的假设。首先,“修复”不应该也不会节省任何空间。修复所做的一切就是发现不同副本之间的不一致并修复它们。它要么什么都不做(如果没有不一致),要么添加数据,而不是删除数据。 第二,“清理”是在向集群添加新节点后需要执行的操作-在每个节点将其部分数据发送到新节点后,“清理”将从旧节点中删除数据。但在不添加节点时,清除不相关

您可能要查找的命令是“compact”。这可以节省空间,但只有当您知道有大量的覆盖(重写现有行)、删除或数据过期(TTL)时才可以。您使用的压缩策略是什么?如果是默认的大小分层压缩策略(STCS),则可以启动主要压缩(nodetool compact),但应注意其中涉及的一大风险:

主压缩将所有数据合并到一个sstable(Cassandra的磁盘文件格式),删除已删除、过期或覆盖的数据。但是,在此压缩过程中,您同时拥有输入和输出文件,在最坏的情况下,这可能会使您的磁盘使用率翻倍,如果磁盘已满50%以上,则可能会失败。这就是为什么许多Cassandra最佳实践指南建议磁盘的填充率不要超过50%。但这只是最坏的情况。如果您知道输出文件将比输入文件小得多(因为大部分数据已被删除),那么您可以获得更少的可用空间。也许更有用的是,如果您有许多单独的表(列族),则可以单独压缩每个表(如您所建议的,从最小到最大),并且压缩过程中临时需要的最大磁盘空间可以远远小于磁盘空间的50%


《CyLLA》是Casdand的一个C++重新实现,它开发了一种称为“混合压缩”(SEM)的方法,它类似于卡桑德拉的尺寸分层压实,但它是在小块中压实而不是生成一个巨大的文件,以避免在压缩过程中占用巨大的临时磁盘。不幸的是,Cassandra还没有这个特性。

好主意是首先在最小的键空间中的最小表上逐个开始修复,然后完成修复。这将需要时间,但更安全的方式,并没有机会绞死和交通损失。
修复完成后,以与修复相同的方式开始清理。这样对节点和集群也没有影响。

我建议在dba.stackexchange.com上发布。由于这与编程无关,因此堆栈溢出与此无关。如果您添加了一个将从现有节点卸载数据的节点,则运行清理将有意义。当然,这还取决于如何添加现有节点以及是否运行了清理。如前所述,您的解决方案可能是添加一些较大的磁盘。您可以尝试从系统中删除旧的快照数据。您好,谢谢您的回答。我在清理之前执行修复,以修复数据的不一致性,并在执行清理时降低数据丢失的风险。有很多文章,人们抱怨在执行清理后丢失了数据。不幸的是,我在每个DC的3个节点上都有90%的空间,所以我迫切需要一种获得空闲空间的方法。
nodetool repair -full foo_keyspace bar_columnfamily

nodetool cleanup foo_keyspace bar_columnfamily