【问题标题】:Cassandra - Setting a huge field to null not giving back the disk spaceCassandra - 将一个巨大的字段设置为 null 而不归还磁盘空间
【发布时间】:2020-10-08 04:14:20
【问题描述】:

在我们的键空间中,我们只有几张表,其中一张包含大部分数据。在该表中,只有一个 ColumnEntity(比如 X 列)包含 99.99% 的数据。当数据不再相关时,我们将 TTL 设置为几天,并将列 X 设置为 null(来自 java 进程)。理想情况下,这应该立即释放磁盘上的大量空间,因为 X 列有 90% 的总键空间数据,但我们没有看到磁盘空间使用量有任何减少。

此外,在 TTL 到期后,数据正​​在完美删除,但我们再次没有看到任何空间释放。

我们缺少什么?

【问题讨论】:

    标签: java cassandra datastax


    【解决方案1】:

    在 Cassandra 中,不会就地修改任何数据 - 所有文件都是不可变的。当您执行删除或插入空值(相同)时,除了磁盘上的先前数据之外,特殊标记被添加。因此,当您添加数据时,实际上是在添加更多数据 :-)

    数据的实际删除发生在后台压缩压缩 SSTable 文件时。文件压缩的​​调度取决于使用的压缩策略及其配置选项。在某些情况下,当您在大文件中有旧数据时,可能会暂时无法压缩。根据您的 Cassandra/DSE 版本,您可以通过在每个节点上执行 nodetool compact -s 来强制压缩所有数据,但这需要有足够的磁盘空间(表的大小)。另一个机会是在单个 SSTables 上使用nodetool garbagecollect -g CELL,但它也需要可用磁盘空间。

    附:我建议至少参加DataStax Academy 上的 DS201 课程。

    【讨论】:

    • 太棒了,我现在明白了。另外,在运行 nodetool compact 之后,释放了很多空间。感谢您的建议,我一定会参加课程。
    猜你喜欢
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多