如何在节点大小有限时从 cassandra 中清除海量数据

How to purge massive data from cassandra when node size is limited

我有一个 Cassandra 集群(使用 cassandra v3.11.11),有 3 个数据中心,复制因子为 3。每个节点有 800GB nvme,但其中一个数据 table 占用了 600GB 数据。结果如下 nodetool status:

DataCenter 1:
 node 1: 620GB (used) / 800GB (total)
DataCenter 2:
 node 1: 610GB (used) / 800GB (total)
DataCenter 3:
 node 1: 680GB (used) / 800GB (total)

出于安全原因,我无法在服务器上安装另一个磁盘并且服务器根本没有互联网连接。唯一能做的就是放一些脚本之类的小文件进去。

所有 cassandra tables 都设置了 SizeTieredCompactionStrategy 所以我最终得到了非常大的文件~一个 200GB sstable(完整 table 大小 600) .由于群集是 space 中的 运行,我需要释放将引入墓碑的数据。但是我只剩下 120GB 的空闲 space 用于压缩或垃圾收集。这意味着我最多只能保留 120GB 的数据,为了 Cassandra 进程的安全,甚至可能更少。

我被处决了nodetool cleanup所以我不确定是否还有更多空间可用。

有没有办法从 Cassandra 中释放 200GB 的数据?或者我只能保留不到 120 GB 的数据?

(如果我们删除 200GB 数据,我们还剩下 400GB 数据,compaction/gc 将需要 400+680GB 数据,这比磁盘 space..)

谢谢!

我个人会先检查整个 space 是否被实际数据占用,而不是被快照占用 - 使用 nodetool listsnapshots to list them, and nodetool clearsnapshot 删除它们。因为如果你出于某种原因做了快照,那么在压缩之后它们会占用 space 因为原始文件被删除了。

下一步将尝试使用nodetool garbagecollect, or nodetool compact with -s option to split table into files of different size. For big table I would try to use nodetool compact with --user-defined option on the individual files (assuming that there will be enough space for them). As soon as you free > 200Gb, you can sstablesplit节点应该已关闭!)从小表中清理逻辑删除和删除数据,将大 SSTable 拆分为小文件(~1-2Gb),所以当节点再次启动时,数据将被压缩