88 lines
2.3 KiB
Markdown
88 lines
2.3 KiB
Markdown
# 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 ], ...
|
||
~~~
|
||
|