假设希望尝试这个方法的读者已经有了自己搭建的一个IPFS系统,并且有多个运行在Ubuntu16操作系统上的节点。
适合阅读这篇文章的读者有以下几类:- 读者希望在自己已搭建的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地址的值。如果你的系统使用的是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"替换。
运行完命令后,我们会得到"connectNodeBIDsuccess"的结果。
我们可以用下列命令测试一下看这些节点是否已经互联了:
ipfs swarm peers
在节点A上,你现在应该能在返回的结果中看到节点B的"multiAddress",同理在节点B上,你应该能在返回的结果中看到节点A的"multiAddress"。
现在节点A和节点B已经互联了。如果A搜索的内容就在B上,那么搜索就应该很快,而不再像普通IPFS那样通过一堆节点中介才能搜索到内容。这时节点B将会是节点A搜索内容时的第一个被查询的对象。
第三步是让运行自动化。
前面我们的操作都是在命令行手动输入指令实现的,那有没有办法让这些指令自动执行,使节点之间永远互联呢?
我们可以使用Linux服务中的计时器来实现这个目标。
假设我们有一个网关节点,并希望我们所有的IPFS节点都能自动连接到这个网关。那么对于每一个希望直接连接网关的节点,我们在该节点上添加两个文件:
1. 第一个文件是:/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",就是这个值。
2. 第二个文件是:/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.timersudo systemctl start gateway-connector.timer
为了验证我们添加的文件是否有效,运行下列命令:
systemctl list-timers
现在你就能看到"gateway-connector"有一个值,可以运行下列命令验证其结果:
systemctl status gateway-connector
至此,我们的系统就搭建好了。
参考链接:https://medium.com/pinata/how-to-keep-your-ipfs-nodes-connected-and-ensure-fast-content-discovery-7d92fb23da46作者:Filecoin社区
本站所有软件信息均由用户上传发布,版权归原著所有。如有侵权/违规内容,敬请来信告知邮箱:764327034@qq.com,我们将及时撤销! 转载请注明出处:https://czxurui.com/zx/66262.html
发表回复
评论列表(0条)