Cassandra - 将一个巨大的字段设置为 null 不归还磁盘 space

Cassandra - Setting a huge field to null not giving back the disk space

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

而且,在 TTL 过期后,数据会被完美删除,但我们再次没有看到任何 space 释放。

我们还缺少什么?

在 Cassandra 中,不会就地修改任何数据 - 所有文件都是 immutable。当您执行删除或插入 null 时(它是相同的),除了磁盘上有以前的数据之外,特殊标记是 added。所以当你添加数据时,你实际上是在添加更多数据:-)

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

P.S。我建议至少参加 DataStax Academy.

的 DS201 课程