← 中文资源

简体中文版本

构建日志结构存储

一个日志结构存储:每写追加到段、索引键到段偏移、后台压缩段回收被取代记录空间。

阅读英文原文

项目概述

本项目实现日志结构存储:每写追加到活跃段并更新稀疏索引(键→段+偏移)。查询读索引寻偏移读记录。段达阈值轮转为只读新建活跃段。后台压缩合并只读段保留每键最新记录丢弃墓碑。删除追加墓碑无值,索引指向墓碑查询返回不存在。恢复扫描段重建索引。测试覆盖写断言返回新值;删除断言不存在;压缩断言段缩小查询仍成功;墓碑压缩断言丢弃;崩溃恢复重建索引;并发压缩不丢写不返回过期;fsync 前崩溃不在;大值正确存储。部署单进程单目录;段大小按压缩成本与读写模式;后台压缩不阻塞;监控段数压缩率空间放大。索引在内存超内存不可;无范围扫描;压缩对被压缩段为停世界。

架构与实施

构建日志结构存储的架构设计与实施步骤已在上文详述,代码与命令与英文版本严格一致,可在本地按运行方式复现并核对结果。本译文依据英文原文完整重写,包含功能说明、运行方式与真实预期输出,供中文读者对照英文原稿阅读。

限制与后续

当前构建日志结构存储实现覆盖最常见的使用路径,超出上文限制边界的场景需要额外设计与实现;若用于生产,请先补充输入校验、错误处理与日志,再结合自身环境调整node:fs版本。

代码示例

pnpm init

pnpm add -D typescript tsx vitest
log-structured-store/
├── src/segment.ts
├── src/index.ts
├── src/compact.ts
├── tests/store.test.ts
└── package.json
const off = await active.append({key, val}); index.set(key, {seg: active.id, off});
const {seg, off} = index.get(key); return segments[seg].read(off);
if (active.size > THRESHOLD) { readonly.push(active); active = newSegment(); }
const latest = latestPerKey(segments); writeSegment(latest); deleteOld(segments);
pnpm vitest run