一 repo
1 什么是repo?
我们知道,ipfs启动之前需要先运行ipfs init初始化,什么意思?就是生成该程序的配置信息和初始的数据库,就像一个商店要开张迎业,先要把商店盖好,货物提前采购好,那这些初始化的数据放置在哪里呢?位于每个用户的家目录下.ipfs目录下,如下图(我是以ec2-user用户的身份登录的):
[ec2-user@ip-172-31-23-215 ~]$ pwd
/home/ec2-user
[ec2-user@ip-172-31-23-215 ~]$ ls .ipfs
api blocks config datastore datastore_spec keystore repo.lock version
那这些存储配置信息和数据库的目录,就叫repo( 全称:repository ,仓库)
2 repo的作用?
当要向ipfs申请数据时,ipfs先会去本地的repo目录下去查找需要的数据,repo目录里的数据分两部分,一部分是metadata(元数据)一部分是block数据(真正的内容)。metadata想像成是商店的账本,账本上记录了所有商店的产品清单(目录),而block就是摆放在商店里的具体的内容。
运行ipfs repo stat命令,查看repo的状态:
[ec2-user@ip-172-31-23-215 ~]$ ipfs repo stat
NumObjects: 21
RepoSize: 1374684
StorageMax: 10000000000
RepoPath: /home/ec2-user/.ipfs
Version: fs-repo@6
我们尝试向ipfs仓库里添加一个文件,仓库的状态也相应变化
[ec2-user@ip-172-31-23-215 ~]$ echo "ipfs" >foo
[ec2-user@ip-172-31-23-215 ~]$ ipfs add foo
added QmbXBAKDgbhE8HkGuEF4FuQQJej2mxqXtYSMsBPuJDqgjq foo
[ec2-user@ip-172-31-23-215 ~]$ ipfs repo stat
NumObjects: 25
RepoSize: 1387472
StorageMax: 10000000000
RepoPath: /home/ec2-user/.ipfs
Version: fs-repo@6
二 Bootstrap list
1 什么是bootstrap list?
如果ipfs只是通过自己的仓库查找数据,那就太狭隘了,ipfs还会根据bootstrap 列表,了解网络上其他节点的对等体列表,如果自己的仓库里没有需要的数据,就通过bootstrap列表,查到其它的节点是否有需要的数据。 IPFS自带有默认的受信任对等列表。
[ec2-user@ip-172-31-23-215 ~]$ ipfs bootstrap list
/ip4/178.62.158.247/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd
/ip4/34.219.173.48/tcp/4001/ipfs/QmbZWkAvsFbN6Mfj8d5AnBjELb6zi6NFnFZtaDubL7bhok
...
上面列出的行是默认IPFS引导程序节点的地址 - 它们由IPFS开发团队运行。 列出的地址完全解析并以multiaddr格式指定,这使得每个协议都是明确的。 这样,您的节点就可以准确知道到达引导节点的位置 - 该位置是明确的。 除非你明白这意味着什么,否则不要改变这个列表。 Bootstrapping是分布式系统中一个重要的安全故障点:恶意引导对等方只能将您引入其他恶意对等方。 建议保留IPFS开发团队提供的默认列表,或者 - 在设置专用网络的情况下 - 保存您控制的节点列表。 不要将同行添加到您不信任的列表中。
2 实验
我为了更好理解ipfs的工作原理,准备了两台服务器A和B,分别安装运行了ipfs
在A服务器上:
[ec2-user@ip-172-31-23-215 ~]$ ipfs bootstrap rm --all 删除默认的bootstrap list
removed /ip6/2a03:b0c0:0:1010::23:1001/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd
...
[ec2-user@ip-172-31-23-215 ~]$ ipfs bootstrap add /ip4/172.31.31.186/tcp/4001/ipfs/QmbZWkAvsFbN6Mfj8d5AnBjELb6zi6NFnFZtaDubL7bhok 172.31.31.186是B服务器的IP 最后面的ID是B服务器节点ID
added /ip4/172.31.31.186/tcp/4001/ipfs/QmbZWkAvsFbN6Mfj8d5AnBjELb6zi6NFnFZtaDubL7bhok
[ec2-user@ip-172-31-23-215 ~]$ ipfs bootstrap list
/ip4/172.31.31.186/tcp/4001/ipfs/QmbZWkAvsFbN6Mfj8d5AnBjELb6zi6NFnFZtaDubL7bhok
在B服务器上操作同A,省略
环境OK后,我做了一个测试实验,最终验证一个结果,当在A服务器的IPFS上上传了文件后,在B服务器上是可以查找到了,同时B服务器会把查询的结果保存到repo里,那这样,当A服务器宕机后,网络上还是可以通过B获取到数据。
三 Pinning
1 什么是Pinning?
ipfs有一个相当积极的缓存机制,可以在对其执行任何ipfs操作后很短时间内将对象保留在本地,但这些对象可能会被定期垃圾清理。 为了防止垃圾收集简单地固定你关心的哈希,固定的方法就是Pinning
Pinning 是ipfs中非常重要的概念。 ipfs试图让它感觉每个单独的对象都是本地的, 固定是允许你告诉ipfs始终保持给定对象本地的机制。
2 实验
查看哪些数据被Pinning
[ec2-user@ip-172-31-23-215 ~]$ ipfs pin ls
QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn recursive
QmbXBAKDgbhE8HkGuEF4FuQQJej2mxqXtYSMsBPuJDqgjq recursive
QmejvEPop4D7YUadeGqYWmZxHhLc4JBUCzJJHWMzdcMe2y indirect
...
准备文件
[ec2-user@ip-172-31-23-215 ~]$ echo "ipfs rocks" >rocks
[ec2-user@ip-172-31-23-215 ~]$ ipfs add rocks
added QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy rocks
[ec2-user@ip-172-31-23-215 ~]$ ipfs pin ls
QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn recursive
QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy recursive
...
IPFS默认会把新上传的文件做Pinning.
清除repo缓存,但被pinning的文件不会被清除
[ec2-user@ip-172-31-23-215 ~]$ ipfs repo gc 清楚repo缓存
removed Qmaum8B9RA4gxZQRxJxxzEBEJBVfgz2DCgJSq2mzRzzJiP
removed QmQTBtcd7QWY15DsKiaAgWhtEAC6MqFu4AhvtEU2P1tiwx
...
[ec2-user@ip-172-31-23-215 ~]$ ipfs pin ls
QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFyrecursive
QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv recursive
...
[ec2-user@ip-172-31-23-215 ~]$ ipfs cat QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy
ipfs rocks内容还可以查看到
删除对该文件的Pinning
[ec2-user@ip-172-31-23-215 ~]$ ipfs pin rm -r QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy
unpinned QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy
[ec2-user@ip-172-31-23-215 ~]$ ipfs repo gc
removed QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy 该文件的缓存被清除
removed QmaBNU361QD9rA3rmhzTk8oCBd2aygyS9Cca3m81MReGJU
removed QmRY35rAQfSmerbh3JfMMUiecqytkVpnJC9B8tpEM9c3kk
四 工作原理
IPFS获取数据的流程:
第一步:先查询Pinning 如果没有,则进入第二步
第二步:查询本地的repo ,如果没有,则进入第三步
第三步:根据bootstrap list 查寻其它节点 ,如果没有,就真的没有
五 结论
IPFS就像一个强大的连接者,手里有一个庞大的通信薄(bootstrap list),只要网上有数据,就能快速定位,缓存到自己的仓库(repo)里,并且对情有独钟的数据直接固定(pinning),永久锁定!霸气!