概述¶
我们有能力使一个 RocksDB 实例,或者多个实例聚合在一起, 的磁盘使用量,保持在一定数值以下。在一些一个文件系统被多个应用使用,并且其他应用系统需要与预先增长的数据库隔离的情况,是非常有用的。
追踪硬盘空间使用以及,可选的,限制数据库大小,是通过 rocksdb::SstFileManager 来实现的。他通过调用 NewSstFileManager 来生成,返回的对象被赋值给 DBOptions::sst_file_manager。可以在多个 DB 实例之间共享一个 SstFileManager。
使用¶
追踪 db 大小¶
通过调用 SstFileManager::GetTotalSize(),调用者可以知道 DB 使用的总磁盘空间。他返回所有 SST 文件使用的总大小。WAL 文件不会被包括进去。如果同一个 SstFileManager 被用于多个 DB 实例,GetTotalSize 会返回所有实例的总大小。
限制 DB 大小¶
通过调用 SstFileManager::SetMaxAllowedSpaceUsage() 以及,可选的,SstFileManager::SetCompactionBufferSize(),可以限制磁盘空间使用的方式。两个函数都接受一个参数,该参数以 byte 为单位,声明希望使用的尺寸。前者设置一个硬性 DB 大小限制,后者声明在决定是否压缩前,内部需要保留的空间。
设置最大的 DB 大小可以从下面几方面影响 DB 行为。
- 每当一个新的 SST 文件通过落盘或者压缩被创建,SstFileManager::OnAddFile() 都会被调用,用于更新总共被使用的大小。如果这回导致总大小大于限制,ErrorHandler::bg_error_ variable 会被设置到 Status::SpaceLimit(),并且创建该 SST 文件的 DB 实例会进入只读模式。更多信息,参考 后台错误处理
- 开始一个压缩前,RocksDB 会检查是否有足够的空间用来创建输出的 SST 文件。这是通过调用 SstFileManager::EnoughRoomForCompaction() 来完成的。这个函数用一种保守的方式估计输出的大小为所有输入的 SST 文件的总大小。如果设置有压缩 buffer,还会加上这个 buffer,得到的输出结果会大于 SstFileManager::SetMaxAllowedSpaceUsage() 设置的值,压缩不会被允许执行。压缩线程会休眠 1 秒之后,把列族重新加入到压缩队列。所以说这是非常有用的压缩比率阈值。