2.3 KiB
2.3 KiB
BFS设计
TODO
- block对指定内容可以压缩:比如text/html, text/plain
- block offset信息可以自动合并
- 实现bfs/下的所有TODO
- 系统退出(quit/terminate/kill)时自动关闭文件
- compact的时候同时compact .b和.m两个文件
- 实现对可缓存文件尺寸的限制
- 提前为文件扩展出空间: mFile, bFile
- FileReader可以重用:使用完之后放入Pool,但要考虑到数据可能已经变更
- 读的时候不允许修改相应区域
- 在compact的时候尤其注意不修改正在Read的区域
- 记录写入和读取速度,然后下次启动的时候根据写入和读取速度调整相关参数
- 可以实现缓存数据加密功能
- 校验mFile:可以在文件末尾写入一个特殊标记?比如$$$END$$$,下次读取的时候检查此标记是否仍然存在?可能导致写入性能较低
- IMPORTANT
- 实现空余空间重复利用:需要保证此块区域没有正在被读
- 策略:单个文件内容写入时,先写入最大的Gap,写满之后,再写入到尾部,防止太过零碎
- delete file的时候记录空闲blocks:freeBlocks
- 再次被使用的时候减去空闲blocks
- 实现bFile和mFile的compact、定时器
- bFile和mFile的corruption检测
- 增加End Block?
- 增加 openWriter options
- 增加 opnReader options
- 在 MetaFile 中实现 HeaderBlocks和BodyBlocks 合并操作
- 考虑 BlocksFile.Close()中是否要sync(),还是简单的close即可?这需要corruption检测支持
- fs.BFilesMap分区管理,减少锁
- 思考把打开BFile和关闭BFile移出锁
- 完全避免 check status failed: the file closed
- 增加重试功能?
- limiter使用fsutils.Limiter
- 实现空余空间重复利用:需要保证此块区域没有正在被读
参考文档
- (CockroachDB's Storage Layer)[https://www.cockroachlabs.com/docs/stable/architecture/storage-layer]
设计目标
1亿个文件,20TiB文件内容。
目录结构
00/
a.b - 文件内容
a.m - 元数据
01/
...
数据结构
文件内容:
block1, block2, ...
元数据:
hash
modifiedAt
expiresAt
status
fileSize
headerSize
bodySize
[header blocks info]
[body blocks info]
元数据要点:
- 单个文件可以放入512个文件
block info:
[fromOffset1, toOffset1 ], [fromOffset2, toOffset2 ], ...