Vite存储层设计详解之blockDB文件系统

2020-09-05 13:06 栏目:经验之谈 来源:网络整理 查看()

块数据库用于存储事务/帐户块和快照块数据。这两种数据类型在生成快照时处于最终确认状态,写入后无需修改,因此非常适合通过快速附加写入进行高效存储。块数据库的存储是根据附加写优化的思想设计的。需要顺序写入的数据通过环形缓冲区依次写入队列,然后异步分批写入文件。

1.提交书面数据

快照块及其关联的帐户块列表将作为一个整体提交给存储层进行存储。存储层依次遍历帐户块及其关联的快照块,序列化相关的数据结构,然后将它们写入存储。

2 .环形缓冲器

序列化数据不直接写入文件,而是写入名为环形缓冲区(ringBuffer)的内存缓冲区,该缓冲区由连续的10M个子数据段组成,每个数据段都有一个相应的递增序列号fileId。对于每个块,首先写入块的序列化字节长度值,然后写入实际数据内容。因为块和段不是一一对应的,所以存在块的数据需要跨段的问题。为了定位和存储块数据段,通过[文件标识,偏移量]二进制来定位块的起始位置,其中偏移量是块在段中的偏移量。

为了提高效率并减少打开和回收缓冲区的开销,这些连续的数据段将被拼接成一个称为环形缓冲区的虚拟环,新数据将被附加到环的尾部,旧数据将从队列的头部弹出。追加和弹出的操作是通过移动段下标来完成的。要刷新的已用段位于队列头和队列尾之间,其他段是可以覆盖的空闲段。

已用段的数据用作写缓存,也用作读缓存。如果空闲段的数据之前已经用有效数据写入,它也将用作读缓存,因此整个环形缓冲区可以用作读缓存。整个环形缓冲区相当于最近写入数据的读写缓冲区。

当在短时间内写入环形缓冲区的数据超过刷新速度时,将导致数据超过环形缓冲区的现有容量,环形缓冲区将自动扩展其容量。当数据逐渐写入文件列表后,环形缓冲区将自动收缩到其初始容量。

3.文件列表、随机阅读和账簿同步

块数据库使用具有固定文件大小的小文件列表来存储块数据,每个文件对应于上面的环形缓冲区中的一个段,文件名是上面的环形缓冲区中的标记文件标识。通过定期刷新操作,环形缓冲区中已使用的段将依次写入文件系统,刷新的段将成为空闲段。

要随机读取一个块,首先通过块数据库索引获得[文件标识,偏移量]二进制,然后根据文件标识尝试将该段定位在环形缓冲区中。如果失败,在通过文件标识打开对应的小文件并寻找偏移位置之后,在从位置的开始读取数据大小之后,可以连续读取对应于该块的数据块,这可能涉及跨文件读取文件标识为1的下一个小文件。因为小文件用于存储,所以寻道操作比大文件快得多,而且对系统页面缓存也很友好。

小文件列表在顺序写入和批量顺序读取中具有良好的性能,这在“书籍同步”的场景中非常有用。

4.数据回滚

块数据库只支持从最新状态到某个历史状态的数据删除,不允许删除中间的历史数据,即数据是一个连续的段,不允许有数据空洞。

回滚数据分为两个阶段:预删除和删除。在预删除阶段,首先删除环形缓冲区中相应的数据,然后标记要删除的目标位置。标记后,该数据不可读,但未被删除。在下一个“异步批处理刷新”中,开始删除阶段,然后文件列表中的数据将被删除。

5.数据压缩

目前,数据压缩采用的是快速算法,每个块都被压缩。

微信二维码
售前客服二维码

文章均源于网络收集编辑侵删

提示:仅接受技术开发咨询!

郑重申明:资讯文章为网络收集整理,官方公告以外的资讯内容与本站无关!
NFT开发,NFT交易所开发,DAPP开发 Keywords: NFT开发 NFT交易所开发 DAPP开发