如何在IPFS中尽快地搜索到内容

Filecoin社区
个人专栏
热度: 29131
IPFS是一个强大的去中心化文件分发和存储协议,尽管有着强大的功能,但IPFS也有些缺憾,比如它无法保证所有的节点之间总是互联。

今天要和大家分享的是一篇技术性比较强的文章,一种在IPFS系统中快速搜索内容的方法。

这里有一个假设:假设希望尝试这个方法的读者已经有了自己搭建的一个IPFS系统并且有多个节点,这些节点都运行在Ubuntu 16操作系统上。

这篇文章适合的读者有下列这些:

- 读者希望自己在已搭建的IPFS系统中能快速地搜索内容

- 读者自己搭建的IPFS系统中不仅运行着普通节点还运行了IPFS网关

- 读者自己搭建的IPFS系统中总有节点时不时和其它节点断开或失联

IPFS是一个强大的去中心化文件分发和存储协议,尽管有着强大的功能,但IPFS也有些缺憾,比如它无法保证所有的节点之间总是互联。

这个缺憾就导致即便我们在整个系统刚搭建好时把所有的节点都启动了,这些节点最终有可能互相断开失联,从而使内容搜索的速度变慢。

在这种情况下,当系统使用了网关,并且把用户引导给网关让网关来给用户搜索所需要的内容时就会产生问题-----如果网关不是直接和所有的节点相联,则用户搜索的内容要等很久才能被发现。

如何解决这个问题呢?

第一步:获取节点的“multiAddresses”

在每一个IPFS节点中打开命令行工具,运行下列命令:

ipfs id

你会看到类似下面的结果:

{"ID": "YourNodeID","PublicKey": "YourPublicKey","Addresses": ["/ip4/127.0.0.1/tcp/4001/ipfs/YourNodeID","/ip4/XXX.XXX.XXX.XXX/tcp/4001/ipfs/YourNodeID","/ip6/::1/tcp/4001/ipfs/YourNodeID","/ip6/YYYY:YYYY:YYYY:YYYY:YYYY:YYYY:YYYY:YYYY/tcp/4001/ipfs/YourNodeID","/ip6/YYYY:YYYY:YYYY:YYYY:YYYY:YYYY:YYYY:YYYY/tcp/4001/ipfs/YourNodeID","/ip6/YYYY:YYYY:YYYY:YYYY:YYYY:YYYY:YYYY:YYYY/tcp/4001/ipfs/YourNodeID","/ip4/XXX.XXX.XXX.XXX/tcp/4001/ipfs/YourNodeID",],"AgentVersion": "go-ipfs/0.4.17/","ProtocolVersion": "ipfs/0.1.0"}

我们重点关注这里的“Addresses”数组。它包含了“multiAddress”值,这些值是外部的IPFS节点用来连接节点使用的数据。这些结果有可能会有重复,但这没关系。这些值中有些包含了外部IP地址,有些包含了本地IP地址,我们记录下那些包含外部IP地址的值。如果你的系统使用的是IPv6,记下那个IPv6的“multiAddress”,如果你的系统没有使用IPv6,就记下IPv4的“multiAddress”。

第二步:连接你的IPFS节点

现在把系统中的IPFS节点互相连接起来。

假设我们有一个节点A和一个节点B,如果有多个节点,下列方法也适用。运行下列命令:

ipfs swarm connect /ip4/BBB.BBB.BBB.BBB/tcp/4001/ipfs/NodeBID

将上例中的“multiAddress”用节点B的IPv4 “multiAddress”替换。

如果节点使用的是IPv6,运行下列命令:

ipfs swarm connect /ip6/BBBB:BBBB:BBBB:BBBB:BBBB:BBBB:BBBB:BBBB/tcp/4001/ipfs/NodeBID

将上例中的“multiAddress”用节点B的IPv6 “multiAddress”替换。

运行完命令后,我们会得到下列结果:

connect NodeBID success

我们可以用下列命令测试一下看这些节点是否已经互联了:

ipfs swarm peers

在节点A上,你现在应该能在返回的结果中看到节点B的“multiAddress”;同理在节点B上,你应该能在返回的结果中看到节点A的“multiAddress”。

现在节点A和节点B已经互联了。假如A搜索的内容就在B上,那么搜索就应该很快,而不再像普通IPFS那样通过一堆节点的中介才能搜索到内容。这是节点A搜索内容时,节点B将会是第一个被查询的对象。

第三步:让运行自动化

前面我们的操作都是在命令行手动输入指令实现的,有没办法让这些自动执行从而使节点之间永远互联呢?

我们可以用Linux服务中的计时器达到这个目标。

这里我们假设我们有一个网关节点,我们希望我们所有的IPFS节点都自动连接到这个网关。对每一个希望直接连接网关的节点,我们在该节点上添加下列两个文件:

第一个文件是:/etc/systemd/system/gateway-connector.service

其内容如下:

[Unit]Description=Job that periodically connects this IPFS node to the gateway node[Service]ExecStart=/home/yourUserName/go/bin/ipfs swarm connect /ip4/GGG.GGG.GGG.GGG/tcp/4001/ipfs/gatewayIDEnvironment="IPFS_PATH=/ipfs"

注意:在上述文件中,有几个值要替换成你自己的值。

在ExecStart中,你IPFS的执行路径要替换成你安装“Go/” IPFS可执行文件的路径。

在ExecStart中,“multiAddress”要替换成你在网关上运行“ipfs id”得到的返回值。这里也可以用IPv6的multiAddress。

在Environment中,你要用你安装IPFS repo的路径替换。你执行“ipfs repo stat”后会得到一个返回值“RepoPath”,就是这个值。

第二个文件是:/etc/systemd/system/gateway-connector.timer

[Unit]Description=Timer that periodically triggers gateway-connector.service

[Timer]OnBootSec=3minOnUnitActiveSec=1min

[Install]WantedBy=timers.target

在上述文件中,“OnBootSec”是你的机器在启动后要等待多久才启动计时器的时间设定。“OnUnitActiveSec”是每一个“gateway-connector.service”执行后下一个“gateway-connector.service”执行之前要等待的时间。

第四步:自动化运行

现在我们创建自动化文件,并运行它们。

在每个节点的命令行,加入我们上面罗列的两个文件,并运行下列命令:

sudo systemctl enable gateway-connector.timer

sudo systemctl start gateway-connector.timer

为了验证我们加入的文件是否有效,运行下列命令:

systemctl list-timers

现在你就能看到“gateway connector”有了一个值,可以运行下列命令验证其结果:

systemctl status gateway-connector

好了,这样下来,我们的系统就搭建好了。

我是IPFS/Filecoin社区发起人晓熙(加入社区,联系v号: liandaoxixi),IPFS/Filecoin是全球共识最大的去中心化存储项目,我会定期在社区分享专业的资讯,为IPFS/Filecoin爱好者建设一个共赢的学习社区。

参考链接:https://medium.com/pinata/how-to-keep-your-ipfs-nodes-connected-and-ensure-fast-content-discovery-7d92fb23da46

声明:本文为入驻“火星号”作者作品,不代表火星财经官方立场。
转载请联系网页底部:内容合作栏目,邮件进行授权。授权后转载时请注明出处、作者和本文链接。 未经许可擅自转载本站文章,将追究相关法律责任,侵权必究。
提示:投资有风险,入市须谨慎,本资讯不作为投资理财建议。
免责声明:作为区块链信息平台,本站所提供的资讯信息不代表任何投资暗示,本站所发布文章仅代表个人观点,与火星财经官方立场无关。鉴于中国尚未出台数字资产相关政策及法规,请中国大陆用户谨慎进行数字货币投资。
语音技术由科大讯飞提供
推广

评论0