为何RocksDB需对Compaction生成文件执行目录级fsync?
为什么Compaction生成SST文件后还要执行目录级fsync?
你说的文件级fsync确实能保证单个SST的内容落盘,但目录级fsync解决的是目录元数据持久化的核心问题,具体作用有这几点:
确保新SST的目录条目被持久化:创建SST文件后,文件系统的目录里会新增一条指向该文件的条目(包含文件名、inode关联信息)。文件级fsync只处理文件本身的内容,目录的这条新条目可能还停留在内存缓存里。如果此时机器意外掉电,重启后系统会找不到这个SST文件——虽然文件内容确实在磁盘上,但目录里没记录,相当于“隐形”了,后续可能被当成无效文件清理,或者导致数据查询失败。
保障Compaction操作的原子性与完整性:Compaction过程不只是生成新文件,通常还会删除旧的SST文件、更新元数据。目录级fsync能把这些目录层面的变更(新增新文件、删除旧文件的记录)一起刷到磁盘,确保重启后Compaction的结果是完整的——不会出现新文件没被记录,或者旧文件还留在目录里的情况,避免数据不一致。
适配文件系统的缓存机制:很多现代文件系统(比如ext4、XFS)会对目录元数据做缓存优化,修改目录后不会立刻刷盘。只做文件级fsync的话,目录的变更可能一直留在内存,掉电后就丢失了,导致新生成的SST无法被系统识别,直接影响数据的可用性。
内容的提问来源于stack exchange,提问作者qing zhao
相关产品推荐
相关产品推荐

