即使从Cassandra数据库中删除keyspace并进行压缩,磁盘空间仍未释放

16

我创建了一个keyspace,里面包含了一个table(columnfamily),我们称之为"ks.cf"

在columnfamily cf中插入了几十万行数据后,使用df -h命令查看磁盘使用情况。

然后,我使用cqlsh中的DROP KEYSPACE ks命令删除了keyspace。

即使删除了keyspace,磁盘使用情况也保持不变。我还尝试使用nodetool compact命令,但没有成功。

有没有人可以帮我配置一下,这样在删除数据/行后可以释放磁盘空间?

5个回答

17
最近遇到了这个问题。在删除一个表之后,会创建一个快照。如果你不打算回滚,这个快照将允许你回滚。如果你想要回收硬盘空间,你需要在适当的节点上运行以下命令:nodetool -h localhost -p 7199 clearsnapshot。此外,你也可以在cassandra.yml文件中设置 auto_snapshot: false 关闭快照功能。
注:已修改拼写/语法错误。

1
我使用了相同的方法,但即使在清除快照后仍然有空目录。我的猜测是可以安全地删除它们。有人能确认吗? - Nikolay Dimitrov
1
@gubble 是的,由于强迫症,我最终手动删除了它们。如果您有类似命名的表,请确保哈希值对齐。 - Highstead

7
如果你只是想删除行,那么你需要让删除步骤遵循通常的删除周期(delete_row->tombstone_creation->compaction_actually_deletes_the_row)。
现在如果你完全想摆脱你的keyspace,请检查你的cassandra数据文件夹(它应该在你的yaml文件中指定)。在我的情况下,它是“/mnt/cassandra/data/”。在这个文件夹中有一个子文件夹用于每个keyspace(即 ks)。你可以完全删除与你的keyspace相关的文件夹。
如果你想保留文件夹,要知道cassandra在删除keyspace之前会创建一个快照。基本上备份了你所有的数据。你只需进入“ks”文件夹,并找到快照子目录。进入快照子目录,然后删除与你keyspace删除相关的快照。

是的!它保留了可以手动删除的快照。但是我仍然看到使用df -h相同的磁盘空间,但当我再次将数据推入Cassandra时,它不会增长。也许操作系统或Cassandra执行某种缓存或磁盘空间管理,我不知道。 - Pankaj Goyal
3
请记住,对于所有的Cassandra写入操作,数据首先会被保存在内存中,直到Cassandra决定将其作为SStable形式刷新到磁盘上。您可以通过使用“nodetool flush <keyspace>”手动将其刷新到磁盘上。 - Aki
哦,好的!那么一定有一些配置参数来决定什么时候刷新以及刷新多少数据。这些配置参数是什么?我可以在Cassandra官方文档中找到吗? - Pankaj Goyal
3
是的 - memtable_total_space_in_mb ... 这是官方文档中的链接:http://docs.datastax.com/en/cassandra/2.0/cassandra/configuration/configCassandra_yaml_r.html?scroll=reference_ds_qfg_n1r_1k__memtable_total_space_in_mb - Aki
非常感谢 :) 我会看看如何在我的应用程序中使用这些参数。 - Pankaj Goyal

2

Cassandra在删除表或键空间时不会自动清除快照。如果您在cassandra.yaml中启用了auto_snapshot,则每次删除表或键空间时,Cassandra都会捕获该表的快照。如果这是错误操作,此快照将帮助您回滚此表数据。如果您要从磁盘中清除这些表数据,则需要运行以下clearsnapshot命令以释放空间。

nodetool -u XXXX -pw XXXXX clearsnapshot -t snapshotname

您可以随时在cassandra.yaml中禁用此auto_snapshot功能。


我认为这是对原帖问题的更好回答。 - Polymerase

0

nodetool cleanup 会清除所有不再需要的磁盘数据,即那些节点不负责的数据。(clearsnapshot 会清除所有快照,这可能不是您想要的。)


nodetool cleanup 触发一种特殊类型的压缩,适用于所有或特定的keyspaces/tables。如果表被删除,则Cassandra将不再关心它,因此不会发生压缩... - Alex Ott

0

nodetool 命令可用于一次性清理所有未使用(即先前已删除)的表快照(在运行的 bitnami/cassandra:4.0 docker 容器内发出以下命令):

$ nodetool --username <redacted> --password <redacted> clearsnapshot --all
Requested clearing snapshot(s) for [all keyspaces] with [all snapshots]

证据:旧表快照在“dicts”键空间中使用的空间:
a)清理之前:
$ sudo du -sch /home/<host_user>/cassandra_data/cassandra/data/data/<keyspace_name>/
134G    /home/<redacted>/cassandra_data/cassandra/data/data/dicts/
134G    total
清理后:
$ sudo du -sch /home/<host_user>/cassandra_data/cassandra/data/data/<keyspace_name>/
4.0K    /home/<redacted>/cassandra_data/cassandra/data/data/dicts/
4.0K    total


注意:被接受的答案遗漏了--all开关(以及需要登录),但它仍然值得被点赞。

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