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 加速多段列变更