full gc什么时候触发_IPFS中MFS以及GC机制

bb379f21c3922a59c2f11eeabb24b0fd.png  概 述

IPFS的介绍在IPFS文件存储详解》已经详细介绍过,本文主要介绍IPFS中的文件系统MFS(Mutable File System)以及文件的GC机制。

MFS和传统的文件系统一样使用目录对文件进行管理,区别在于MFS中的目录和文件都有哈希,该哈希由文件内容或者目录下面所有目录以及文件的内容唯一确定,如果目录下面的文件或者目录有变化则该目录的哈希也会变化,所以根据哈希可以判断该文件或者目录下面的内容是否有修改。

文件的GC机制主要介绍IPFS是如何进行文件删除的。 本文所述的IPFS的版本为v0.6.0。 MFS 本版块主要介绍IPFS的文件系统,即文件及目录结构是如何生成、组织和存储。 MFS中文件及目录结构如下图所示,最上层是root目录,表示该文件系统的根目录,所有文件夹以及文件都在该目录下面,MFS中用Root,Directory,File这三种类型分别表示root目录,文件夹,文件。root目录通过link(link中包含link文件夹或者文件的Name、Size和CID)链接到文件夹或者文件,文件夹又通过link链接到文件夹或者文件。 其中,root目录、文件夹都会存储在IPFS的DAG中进行持久化,另外root目录的CID(参考 《IPFS文件存储详解》 )存储在IPFS内置的LevelDB中,当IPFS启动的时候从LevelDB中取出root目录的CID,然后在IPFS的DAG中取出根目录,最后加载出整个目录结构。 0b8f006c448b1aa0ac4e09b42821250c.png 下面详细介绍创建文件夹和增加文件的过程: 创建文件夹的过程如下图所示: 1. 新建文件夹; 2. 将该文件夹的父文件夹添加一条link,link包含该文件夹的Name、CID和Size; 3. 调用该文件夹的update函数,通过parent递归更新父级文件夹的状态(CID,修改时间等),逐级向上层文件夹更新,直到更新root结束递归过程。 删除文件夹和创建文件夹类似,只需要unlink(删除父级文件夹的link)和递归update即可。 aa00e47daff370eae2cf481f5b2f45a4.png 增加文件的过程如下图所示: 1. 上传文件(参考《IPFS文件存储详解》中文件存储过程) 2. 将该文件的父文件夹添加一条link,link包含该文件夹的Name,CID和Size; 3. 调用该文件的flush函数,通过parent递归更新父级文件夹的状态(CID、修改时间等),逐级向上层文件夹更新,直到更新root结束递归过程。 ff2afee73f8e5cfbf9ff71e12cf00e77.png 删除文件和增加文件的过程类似,只需要unlink(删除父级文件夹的link)和flush即可。 文件GC机制 IPFS中删除文件时并不会立即删除掉该文件,而是将该文件的CID unpin(pin是固定CID,保证不会被GC,unpin则是会被GC),下次GC的时候则可以真正的删除该文件。 下 图是 IPFS 的配置文件,其中红色部分是 GC 相关的配置。 a9d1fd38bd6686234ccb55b04eb94755.png StorageMax是存储文件的最大容量,默认是10GB,可以根据项目需要进行修改,当存储的文件超过该最大容量时会有warning,文件还是可以继续存储的。 StorageGCWatermark是GC的阈值,默认是90,即90%,触发GC的阈值容量为10GB*90%=9GB。 另外,GCPeriod是GC的间隔,默认是1h。GC触发的机制是每一个GC间隔时间,触发GC的检查,当存储容量超过阈值时则开始GC,将需要删除的文件或者块进行删除。 文件或者块的Pin模式如下图所示,文件的Pin模式是recursive,即递归Pin文件的所有的块。 8bf58dce458c5f658cdc7d55db1d1d82.png 如下图所示,pinner是块的GC管理器,其中recursePin是递归的pin的集合,里面存储所有文件的根CID: e7160f423fb5c3e99fb83394b41f74b8.png 每次触发GC时会进行ColoredSet,如下面两张图所示,将所有recursePin中的CID依次遍历,深度遍历该CID所有的links,这些links的CID都会存储到gcs这个集合中: e1c5a2fc3b30a42b82d18fbf423f615a.png 3bd1ffe8b2cd1b300fb02d8c5111058c.png 然后通过bs.AllKeysChan(ctx)可以获得所有的块的CID集合,最后遍历这些CID集合,判断gcs中没有的该CID的块都需要删除掉,具体见下图,从而实现了所有unpin的块GC触发的时候都会删除的效果。 fcbda009c503e3af32169647e7e59d2e.png 注意 :GC的时候会lock,此时上传文件和删除文件都会阻塞,GC需要占用的时间和文件存储量以及删除的文件大小有关系,可以将GC时间固定在每天用户操作最少的时间点,例如每天的凌晨3点,减少用户操作和GC的冲突。 总结 IPFS中MFS提供了一套基于CID的文件系统,目录结构也存储在IPFS的DAG中,目录的树状结构和DAG的结构本身是很类似的,所以将目录结构存储在DAG中巧妙地解决了文件系统目录结构地存储问题,最后只需要存储文件系统的根目录的CID从而可以方便地加载整个文件系统的目录。 IPFS中的文件GC机制目前不是很高效,通常文件存储10GB容量左右时,触发GC可能就需要几分钟到十几分钟的时间,由于IPFS是一个面向公网的一个用户一个IPFS节点的模式,所以该问题对于IPFS项目本身并不明显, 但是如果将 IPFS 的存储以及 GC 机制作为投产项目使用,则需要对 GC 机制进行优化,减少 GC 占用的时间间隔。 另外 IPFS 本身每隔一段时间触发 GC 也不是很合理,针对项目的用户使用情况可以将 GC 触发时间固定在每天的凌晨某个时间,然后每 24 小时的 GC 触发间隔也是一种比较简单的解决 IPFS 的 GC 冲突问题的办法。 作者简介 姚文豪 来自数据网格实验室BitXMesh团队 ,数据平台架构师 文末福利 本文是与IPFS相关的第三篇技术干货,你是否对IPFS有了更多了解? 是否想和大佬们直接探讨更多技术问题? 趣链科技区块链技术交流群全面开放啦! 技术交流不迷路,技术大咖等你来~ 快快添加小助手桔子(微信:18458407117 )备注“1209”领你进入技术奥秘世界

82b84909ee36700deced790c7c4785c4.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值