管理磁盘空间利用率

概览

可以限制一个RocksDB数据库实例或多个实例总共使用的磁盘空间总量。 在文件系统由多个应用程序共享,而其他应用程序需要与无限的数据库增长隔离的情况下,这可能很有用。

跟踪磁盘空间利用率和限制数据库大小(可选)由rocksdb::SstFileManager完成。它是通过调用NewSstFileManager()分配的,返回的对象被分配给DBOptions::sst_file_manager。 多个DB实例可以共享一个SstFileManager。

用法

调用者可以通过调用SstFileManager::GetTotalSize()获得数据库使用的总磁盘空间。 返回所有SST文件的总大小(以字节为单位)。WAL文件不包括在计算中。 如果多个DB实例共享同一个SstFileManager对象,GetTotalSize()将报告所有实例的大小。

跟踪数据库大小

调用者可以通过调用SstFileManager::GetTotalSize()获得数据库使用的总磁盘空间。返回所有SST文件的总大小(以字节为单位)。WAL文件不包括在计算中。如果多个DB实例共享同一个SstFileManager对象,GetTotalSize()将报告所有实例的大小。

限制DB大小

通过调用SstFileManager::SetMaxAllowedSpaceUsage()和可选的SstFileManager::SetCompactionBufferSize(),可以设置磁盘空间使用的限制。这两个函数都接受一个以字节为单位指定所需大小的参数。 前者设置了DB大小的硬限制,而后者指定了在决定是否允许进行压缩之前应该保留的空间。 设置DB的最大大小限制可以通过以下方式影响DB的操作

1.每次通过刷新或压缩创建一个新的SST文件时,都会调用SstFileManager::OnAddFile()来更新所使用的总大小。 如果这导致总大小超过限制,则ErrorHandler::bgerror变量被设置为Status::SpaceLimit(),并且创建SST文件的DB实例进入只读模式。 有关如何从这种情况中恢复的更多信息,请参见后台错误处理。 2.在开始压缩之前,RocksDB将检查是否有足够的空间来创建输出SST文件。这是通过调用SstFileManager:: enough roomfor()来实现的。 这个函数保守地估计输出大小为所有输入SST文件到压缩的大小之和。如果输出大小加上压缩缓冲区大小(如果设置了压缩缓冲区大小)将导致总大小超过SstFileManager::SetMaxAllowedSpaceUsage()设置的限制,则不允许继续压缩。 在将列族添加回压缩队列之前,压缩线程将休眠1秒。这样就有效地抑制了压实率。