cassandra的物理磁盘空间管理

Posted

技术标签:

【中文标题】cassandra的物理磁盘空间管理【英文标题】:physical disk space management of cassandra 【发布时间】:2011-08-30 18:00:06 【问题描述】:

最近我一直从我们新项目的角度研究 Cassandra,并从这个社区及其 wiki 中学到了很多东西。但是我没有发现任何关于 Cassandra 在物理磁盘空间管理方面如何管理更新的信息,尽管它似乎与使用压缩的记录删除管理非常相似。

假设有 100 条记录,每条记录有 5 个列值,所以当所有更改都将被刷新磁盘时,所有记录将被相邻写入,当删除操作完成时,它首先在内存表中标记,并且在设置的一段时间后删除物理记录在配置中或满时。压实过程会占用空间。

现在的问题是,一方面是模式较少,一开始没有固定数量的列,但另一方面,当压缩过程发生时......它是否像传统的 RDBMS 那样将记录相邻地放在磁盘上以加快速度RDBMS 的读取过程很简单,因为它们必须根据列数据类型的声明分配固定数量的空间。

但是 Cassandra 如何在压缩过程中准确地将记录放置在磁盘上(用于更新/删除)以加快读取速度?

另一个与压缩相关的问题是,当没有删除查询但有一个更新查询使用一些可变长度数据更新现有记录或完全插入一个新列时,那么压缩如何使其空间在磁盘上可用是否存在数据行?

【问题讨论】:

【参考方案1】:

行和列按排序顺序存储在 SSTable 中。这允许压缩多个 SSTable 以输出一个新的(排序的)SSTable,只有顺序磁盘 IO。这个新的 SSTable 将被输出到磁盘上的一个新文件和可用空间中。这个过程不依赖于列的行数,只依赖于它们以排序顺序存储。所以是的,在所有 SSTables(甚至是那些产生的压缩形式)中,行和列都将在磁盘上按排序顺序排列。

更重要的是,正如您在问题中所暗示的那样,更新与插入没有什么不同 - 它们不会覆盖磁盘上的值,而是在 Memtable 中缓冲,然后刷新到新的 SSTable 中。当新的 SSTable 最终被包含原始值的 SSTable 压缩时,新的值将消灭旧的值 - 即旧的值不会从压缩中输出。时间戳用于决定哪些值是最新的。

删除以相同的方式处理,有效地插入了“反价值”或墓碑。此过程的限制是可能需要大量空间开销。删除实际上是“懒惰的”,所以空间直到一段时间后才会被释放。此外,虽然压缩的输出可以与输入的大小相同,但在新的 SSTable 完成之前无法删除旧的 SSTable,因此可以将磁盘利用率降低到 50%。

在上述系统中,现有键的新值可以与现有键的大小不同,而无需填充到某个预定长度,因为新值不会在更新时覆盖旧值,而是一个新的 SSTable。

【讨论】:

那么,当编辑行的一部分在两个不同的 SSTables 中时,如何读取呢?这两个 SSTable 是否合并或完整的行记录写入单个 SSTable,同时从其他 SSTable 中删除部分? SSTables 在写入后是不可变的。当一行存在于多个 SSTable 上时,它们会在读取时合并。将压缩(如上所述)视为碎片整理 - 减少任何给定列族的 SSTable 数量,并将给定行的碎片列合并到单个 SSTable 中。

以上是关于cassandra的物理磁盘空间管理的主要内容,如果未能解决你的问题,请参考以下文章

删除 cassandra 数据后磁盘空间不减少

就磁盘空间使用而言,Cassandra 是不是足够适合存储日志?

通过压缩和修复从 Cassandra db 中删除大量数据后,磁盘空间未更改

nodetool 清理后磁盘空间使用量增加 - Apache Cassandra

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

Linux磁盘管理