初识ipfs, 认为其能保证文件高可用.听某人聊起在A节点添加文件,过了许久后,A节点离线(退出 ipfs daemon), B节点已无法(添加后的第一次)访问A节点添加的文件, 即 文件并不会主动分发 .由此做一些测试并做如下总结.
ipfs文件add及访问测试 ipfs单节点的文件存储 ipfs add xxx 默认启用pin , 即将文件复制一份副本存储在本地
1 2 3 4 5 6 7 8 9 10 11 echo 'pin.no.daemon' > pin.no.daemon.txtipfs add pin.no.daemon.txt added bafk43jqbedag3yc4ixfr73frvbvz5fs6afx4rogxiiaipmdcce7jgcrdlwa5o pin.no.daemon.txt 14 B / 14 B [=======================================================================================================] 100.00% ipfs pin ls |grep bafk43jqbedag3yc4ixfr73frvbvz5fs6afx4rogxiiaipmdcce7jgcrdlwa5o bafk43jqbedag3yc4ixfr73frvbvz5fs6afx4rogxiiaipmdcce7jgcrdlwa5o recursive ipfs cat /ipfs/bafk43jqbedag3yc4ixfr73frvbvz5fs6afx4rogxiiaipmdcce7jgcrdlwa5o pin.no.daemon
添加文件后使用 ipfs pin ls 命令可查询文件到已 pin 到本地
1 2 3 4 5 6 7 rm pin.no.daemon.txt ipfs pin ls |grep bafk43jqbedag3yc4ixfr73frvbvz5fs6afx4rogxiiaipmdcce7jgcrdlwa5o bafk43jqbedag3yc4ixfr73frvbvz5fs6afx4rogxiiaipmdcce7jgcrdlwa5o recursive ipfs cat /ipfs/bafk43jqbedag3yc4ixfr73frvbvz5fs6afx4rogxiiaipmdcce7jgcrdlwa5o pin.no.daemon
删除源文件及仍可访问, 推测原因是ipfs add 命令 pin 了副本
1 2 3 4 5 6 7 ipfs pin rm bafk43jqbedag3yc4ixfr73frvbvz5fs6afx4rogxiiaipmdcce7jgcrdlwa5o unpinned bafk43jqbedag3yc4ixfr73frvbvz5fs6afx4rogxiiaipmdcce7jgcrdlwa5o ipfs pin ls |grep bafk43jqbedag3yc4ixfr73frvbvz5fs6afx4rogxiiaipmdcce7jgcrdlwa5o ipfs cat /ipfs/bafk43jqbedag3yc4ixfr73frvbvz5fs6afx4rogxiiaipmdcce7jgcrdlwa5o pin.no.daemon
“删除” pin文件发现仍可访问,推测’删除’并未立刻生效,联想到是否有类似 GC 机制
1 2 3 4 5 6 ipfs repo gc ... removed bafk43jqbedag3yc4ixfr73frvbvz5fs6afx4rogxiiaipmdcce7jgcrdlwa5o ipfs cat /ipfs/bafk43jqbedag3yc4ixfr73frvbvz5fs6afx4rogxiiaipmdcce7jgcrdlwa5o Error: merkledag: not found
GC才会真正回收 unpined 文件
ipfs config show 查看 Datastore 配置
1 2 3 4 5 6 7 8 9 { "Datastore" : { "StorageMax" : "10GB" , "StorageGCWatermark" : 90 , "GCPeriod" : "1h" , ... }, }
默认定时GC不开启 , 使用ipfs daemon --enable-gc
开启, 使用ipfs repo gc
手动触发 GC
多节点情况下测试 A、B 两节点组成的私有网络,都使用 ipfs daemon 启动
1 2 3 4 5 6 7 8 9 ipfs repo gc echo 'pin.with.daemon' > pin.with.daemon.txtipfs add pin.with.daemon.txt added bafk43jqbedzjup3mmlj5vuq65nqpkoob3ayjnnsmv4sq75zy7bmu4h3zws43i pin.with.daemon.txt 16 B / 16 B [==========================================================================================] 100.00% ipfs pin ls |grep bafk43jqbedzjup3mmlj5vuq65nqpkoob3ayjnnsmv4sq75zy7bmu4h3zws43i bafk43jqbedzjup3mmlj5vuq65nqpkoob3ayjnnsmv4sq75zy7bmu4h3zws43i recursive
文件pin.with.daemon.txt pin 在 A 节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 ipfs repo gc ipfs pin ls |grep bafk43jqbedzjup3mmlj5vuq65nqpkoob3ayjnnsmv4sq75zy7bmu4h3zws43i ipfs cat /ipfs/bafk43jqbedzjup3mmlj5vuq65nqpkoob3ayjnnsmv4sq75zy7bmu4h3zws43i pin.with.daemon ipfs pin ls |grep bafk43jqbedzjup3mmlj5vuq65nqpkoob3ayjnnsmv4sq75zy7bmu4h3zws43i ipfs get /ipfs/bafk43jqbedzjup3mmlj5vuq65nqpkoob3ayjnnsmv4sq75zy7bmu4h3zws43i Saving file(s) to bafk43jqbedzjup3mmlj5vuq65nqpkoob3ayjnnsmv4sq75zy7bmu4h3zws43i 16 B / 16 B [=======================================================================================] 100.00% 0s ipfs pin ls |grep bafk43jqbedzjup3mmlj5vuq65nqpkoob3ayjnnsmv4sq75zy7bmu4h3zws43i
B 节点可访问,但并无 pin 副本
1 2 3 4 5 6 7 8 rm pin.with.daemon.txt ipfs pin rm bafk43jqbedzjup3mmlj5vuq65nqpkoob3ayjnnsmv4sq75zy7bmu4h3zws43i unpinned bafk43jqbedzjup3mmlj5vuq65nqpkoob3ayjnnsmv4sq75zy7bmu4h3zws43i ipfs repo gc ... removed bafk43jqbedzjup3mmlj5vuq65nqpkoob3ayjnnsmv4sq75zy7bmu4h3zws43i
1 2 3 4 ipfs cat /ipfs/bafk43jqbedzjup3mmlj5vuq65nqpkoob3ayjnnsmv4sq75zy7bmu4h3zws43i pin.with.daemon ipfs pin ls |grep bafk43jqbedzjup3mmlj5vuq65nqpkoob3ayjnnsmv4sq75zy7bmu4h3zws43i
此时B节点仍旧可以访问,但无 pin 副本
1 2 3 4 5 6 ipfs repo gc removed bafk43jqbedzjup3mmlj5vuq65nqpkoob3ayjnnsmv4sq75zy7bmu4h3zws43i ipfs pin ls |grep bafk43jqbedzjup3mmlj5vuq65nqpkoob3ayjnnsmv4sq75zy7bmu4h3zws43i ipfs cat /ipfs/bafk43jqbedzjup3mmlj5vuq65nqpkoob3ayjnnsmv4sq75zy7bmu4h3zws43i
B节点缓存失效, ipfs cat 因私有网络已无副本挂起
ipfs文件add及访问机制
ipfs如何保证可靠分布式存储 参考 Replication on IPFS