Cassandra - 将一个巨大的字段设置为 null 而不归还磁盘空间
Posted
技术标签:
【中文标题】Cassandra - 将一个巨大的字段设置为 null 而不归还磁盘空间【英文标题】:Cassandra - Setting a huge field to null not giving back the disk space 【发布时间】:2020-10-08 04:14:20 【问题描述】:在我们的键空间中,我们只有几张表,其中一张包含大部分数据。在该表中,只有一个 ColumnEntity(比如 X 列)包含 99.99% 的数据。当数据不再相关时,我们将 TTL 设置为几天,并将列 X 设置为 null(来自 java 进程)。理想情况下,这应该立即释放磁盘上的大量空间,因为 X 列有 90% 的总键空间数据,但我们没有看到磁盘空间使用量有任何减少。
此外,在 TTL 到期后,数据正在完美删除,但我们再次没有看到任何空间释放。
我们缺少什么?
【问题讨论】:
【参考方案1】:在 Cassandra 中,不会就地修改任何数据 - 所有文件都是不可变的。当您执行删除或插入空值(相同)时,除了磁盘上的先前数据之外,特殊标记被添加。因此,当您添加数据时,实际上是在添加更多数据 :-)
数据的实际删除发生在后台压缩压缩 SSTable 文件时。文件压缩的调度取决于使用的压缩策略及其配置选项。在某些情况下,当您在大文件中有旧数据时,可能会暂时无法压缩。根据您的 Cassandra/DSE 版本,您可以通过在每个节点上执行 nodetool compact -s
来强制压缩所有数据,但这需要有足够的磁盘空间(表的大小)。另一个机会是在单个 SSTables 上使用nodetool garbagecollect -g CELL
,但它也需要可用磁盘空间。
附:我建议至少参加DataStax Academy 上的 DS201 课程。
【讨论】:
太棒了,我现在明白了。另外,在运行 nodetool compact 之后,释放了很多空间。感谢您的建议,我一定会参加课程。以上是关于Cassandra - 将一个巨大的字段设置为 null 而不归还磁盘空间的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Cassandra 设置为我的 Spark 集群的分布式存储(文件系统)