一 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), 永久锁定! 霸气!
来源: http://www.jianshu.com/p/e4703ad30f65