问题域/PD-234

WAL 持久化与段管理

WAL & Segment Storage

通过写前日志和分段存储实现数据持久性、崩溃恢复和高效读写

子问题

1.WAL 写入与回放

2.段合并与压缩

3.版本快照管理

4.进程级文件锁与读写模式隔离

5.段切换时的 dump-seal-create 三步原子操作

6.Compact 时临时段 ID 与目录 rename 原子切换

各项目的解法1 solutions

Signals

横向对比

维度zvec
WAL 记录格式length(4B)+CRC32c(4B)+content,单条最大 4MB,64B 对齐文件头
段生命周期SegmentManager unordered_map 管理,按 min_doc_id 排序,支持并行列操作
版本快照管理Protobuf Manifest 递增文件(manifest.N),写新删旧,崩溃取最大版本号
刷盘策略可配置 max_docs_wal_flush 阈值自动 flush,0 表示不自动刷盘
崩溃恢复正则扫描 manifest 目录取最大版本号,逐段 Open 恢复 + IDMap/DeleteStore 重建
删除追踪ConcurrentRoaringBitmap64 + 增量修改标记,make_filter 空 bitmap 返回 nullptr
并发控制mutex 保护 WAL 写入和 Version 操作,shared_mutex 分离读写锁,file_lock 进程级互斥

最佳实践

1.WAL 保障写入原子性,段合并减少读放大

2.Manifest 写新删旧保证崩溃安全

3.ConcurrentRoaringBitmap 高效追踪删除状态

4.并行 std::async 加速多段列变更