IPFS作为区块链分布式存储板块的开创项目已经经历了6年不断地改进与完善,早就具备了成熟的数据存储机制。其实在很多人眼里,IPFS分布式存储网络是能够永久保证人类数据安全的,当然也有人说文件一旦被存储在ipfs中就不会丢失这一说法是错误的,因为ipfs节点也有可能因为各种原因导致数据丢失。
如果一个数据对象在ipfs网络中被多个节点访问,则会在访问节点产生多份备份,备份的数据对象不会被永久保存,当节点执行GC操作时,备份数据会被清除。要让一份数据能够被节点永久保存,则需要执行pin操作。下面就来对ipfs数据对象持久化进行操作讲解。
服务器准备
准备两台服务器node1和node2,分别在两台服务器上安装ipfs,启动ipfs守护进程(ipfs daemon),这里不再对安装启动做讲解。
数据准备
node1准备一份数据
[root@node1 ~]# echo "node-1" | ipfs add
added QmadskBmtG5Fwux8mnBPacme9Ebwep6zEfVsaW3T2QEKsi QmadskBmtG5Fwux8mnBPacme9Ebwep6zEfVsaW3T2QEKsi
node2 准备数据
[root@node2 ~]# echo "node-2" | ipfs add
added QmQzEDpiVMsMePtGZYUR2ee8Ve5rTsF771RHyuewmYx9bD QmQzEDpiVMsMePtGZYUR2ee8Ve5rTsF771RHyuewmYx9bD
不做持久化的观察
node1上通过ipfs pin ls能看到新增的数据对象,看不到node2上新增的数据对象。反之在node2上也是如此
[root@node1 ~]# ipfs pin ls
QmadskBmtG5Fwux8mnBPacme9Ebwep6zEfVsaW3T2QEKsi recursive
[root@node2 ~]# ipfs pin ls
QmQzEDpiVMsMePtGZYUR2ee8Ve5rTsF771RHyuewmYx9bD recursive
在node1上访问node2的数据对象,能够读到文件内容,但访问持久化区时,pin出来是没有node2数据对象的hash值的
[root@node1 ~]# ipfs cat QmQzEDpiVMsMePtGZYUR2ee8Ve5rTsF771RHyuewmYx9bD
node-2
[root@node1 ~]# ipfs pin ls
QmadskBmtG5Fwux8mnBPacme9Ebwep6zEfVsaW3T2QEKsi recursive
这时候停掉node2的daemon守护进程,再访问node2的数据对象,仍然能够读到内容,这是因为节点没有执行GC操作,执行GC操作后,node2数据不能再访问到。
[root@node1 ~]# ipfs cat QmQzEDpiVMsMePtGZYUR2ee8Ve5rTsF771RHyuewmYx9bD
node-2
[root@node1 ~]# ipfs repo gc
removed bafkreibhk7az6hwkh6qbluusf35olnm4shzr7loyasbgbnmrkvi2hsfv5a
[root@node1 ~]# ipfs cat QmQzEDpiVMsMePtGZYUR2ee8Ve5rTsF771RHyuewmYx9bD
.............................(获取不到,持久等待)
持久化操作
重启node2的daemon守护进程,在node1上重新拉取node2的数据对象,并将其加入持久化,可在持久化列表中看到node2数据对象的hash值。
[root@node1 ~]# ipfs cat QmQzEDpiVMsMePtGZYUR2ee8Ve5rTsF771RHyuewmYx9bD
node-2
[root@node1 ~]# ipfs pin add QmQzEDpiVMsMePtGZYUR2ee8Ve5rTsF771RHyuewmYx9bD
pinned QmQzEDpiVMsMePtGZYUR2ee8Ve5rTsF771RHyuewmYx9bD recursively
[root@node1 ~]# ipfs pin ls
QmadskBmtG5Fwux8mnBPacme9Ebwep6zEfVsaW3T2QEKsi
QmQzEDpiVMsMePtGZYUR2ee8Ve5rTsF771RHyuewmYx9bD
停掉node2的daemon守护进程,执行GC操作后,再访问node2的数据对象,可看到仍能访问到数据内容,及node2的数据已经加入到node1的数据持久化存储中。
[root@node1 ~]# ipfs repo gc
removed bafkreibhk7az6hwkh6qbluusf35olnm4shzr7loyasbgbnmrkvi2hsfv5a
[root@node1 ~]# ipfs cat QmQzEDpiVMsMePtGZYUR2ee8Ve5rTsF771RHyuewmYx9bD
node-2
删除持久化
ipfs持久化的存储是可以删除掉的,pin rm操作删除后,需要执行GC操作才能完全删除,删除的数据不能再被访问
[root@node1 ~]# ipfs pin rm QmQzEDpiVMsMePtGZYUR2ee8Ve5rTsF771RHyuewmYx9bD
unpinned QmQzEDpiVMsMePtGZYUR2ee8Ve5rTsF771RHyuewmYx9bD
[root@node1 ~]# ipfs pin ls
QmadskBmtG5Fwux8mnBPacme9Ebwep6zEfVsaW3T2QEKsi recursive
[root@node1 ~]# ipfs repo gc
removed bafkreibhk7az6hwkh6qbluusf35olnm4shzr7loyasbgbnmrkvi2hsfv5a
[root@node1 ~]# ipfs cat QmQzEDpiVMsMePtGZYUR2ee8Ve5rTsF771RHyuewmYx9bD
.............................(获取不到,持久等待)
同样,本地数据对象也能进行持久化删除
[root@node1 ~]# ipfs pin rm QmadskBmtG5Fwux8mnBPacme9Ebwep6zEfVsaW3T2QEKsi
unpinned QmadskBmtG5Fwux8mnBPacme9Ebwep6zEfVsaW3T2QEKsi
[root@node1 ~]# ipfs pin ls
[root@node1 ~]# ipfs repo gc
removed bafkreifwwxnupxybxrlpxchyty5llinjqqolyvatf4rwspytgvjagzketu
[root@node1 ~]# ipfs cat QmadskBmtG5Fwux8mnBPacme9Ebwep6zEfVsaW3T2QEKsi
.............................(获取不到,持久等待)