IPFS教程:如何保持IPFS节点连接,确保快速发现内容?

  • 0_1540888448455_f80caf73-8631-4e89-aed5-88a8250f1e0b-image.png

    本指南假设读者已经在Ubuntu 16系统上运行了多个IPFS节点。

    本指南适用于以下任何人:

    • 想要使IPFS节点更快地从其他节点发现内容的人;

    • 依靠IPFS节点运行IPFS网关的人员;

    • 拥有IPFS节点的人,但相互之间“记不住”彼此的节点,导致节点链接反复断开。

    问题

    IPFS目前不提供允许主机将其控制的所有节点,永久保持相互连接的机制。这就产生了这样的场景:即使我们在启动时将节点引导至一起,它们最终也会“忘记”彼此并断开连接。这可能导致内容发现速度变慢,并阻止内容被完全发现。

    当一个产品托管自己的网关,并指向用户以检索产品自身节点上托管的内容时,这可能是一个问题。如果网关未直接连接到产品的节点,那么用户可能会发现自己需要等待很长时间,才能加载其内容。对于用户来说,这不是一个很好的体验。

    那我们怎么解决这个问题呢?

    || 步骤1 - 获取节点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"
    }

    我们主要关心的是“地址”数组。这些包含IPFS节点可用于连接的“multiAddress”值。你可能会得到一些重复的结果,这没关系。这里的关键是要注意包含外部IP地址的条目,而不是包含本地IP地址的条目。如果在所有节点上启用了IPv6,请复制该multiAddress,否则,请复制IPv4 multiAddress。

    || 第2步 - 连接你的IPFS节点

    现在我们有了multiAddresses,让我们将节点连接在一起。

    对于这个例子,我们假设有一个节点A和节点B.实际上是作为多个节点工作的。

    从节点A的命令行运行:

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

    (用节点B的IPv4多地址替换上面的示例multiAddress)

    或者如果你通过IPv6连接,请运行:

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

    (将上述示例multiAddress替换为Node B的IPv6 multiAddress)

    结果

    我们应该在终端收到以下结果:

    connect NodeBID success

    你可以通过在每个节点上运行以下命令来验证此工作:

    ipfs swarm peers

    在节点A上,你应该在返回的列表中看到节点B的multiAddress(多地址),并且在节点B上,你应该在返回的列表中看到节点A的multiAddress(多地址)。

    现在我们的两个节点连接在了一起,内容发现应该是即时的。在节点A发现节点B具有其正在寻找的内容之前,不必经过多层节点,节点B将是第一个请求内容的节点之一,并且可以立即开始提供内容(反过来也是如此) 。

    || 第3步 - 让节点自动链接

    通过命令行手动连接我们的节点,很有趣,但如何让这个过程自动化,以便我们的节点可以自己保持连接?

    使用linux服务/定时器,我们可以做到这一点!

    (对于这些示例,让我们假设有一个网关节点,并且希望我们的内容托管节点自动连接到网关节点)

    对于要连接到网关的每个节点,请添加以下两个文件:

    /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/gatewayID
    Environment="IPFS_PATH=/ipfs"

    注意 - 在上面的文件中,你需要输入以下自定义值:

    • 在ExecStart下,你的ipfs可执行文件路径,将取决于安装Go / ipfs可执行文件的位置。

    • 在ExecStart下,multiAddress将是在网关节点上运行“ipfs id”的检索值之一。也可以在此处使用IPv6多地址。

    • 在Environment下,如果你可以通过在命令行中运行“ipfs repo stat”,并复制“RepoPath”值来获取此值。需要将其替换为安装了IPFS repo的位置。

    /etc/systemd/system/gateway-connector.timer

    [Unit]
    Description=Timer that periodically triggers gateway-connector.service
    [Timer]
    OnBootSec=3min
    OnUnitActiveSec=1min
    [Install]
    WantedBy=timers.target

    在上面的文件中,“OnBootSec”是机器启动后等待启动计时器的时间。OnUnitActiveSec是每次执行gateway-connector.service之间的时间量。

    || 第4步 - 开始自动化运行

    现在已经创建了自动化文件,我们开始启用/运行它们。

    从每个节点的命令行添加了我们的自动化文件,运行:

    sudo systemctl enable gateway-connector.timer
    sudo systemctl start gateway-connector.timer

    仔细检查这项工作,运行:

    systemctl list-timers

    你应该看到网关连接器服务的条目。还可以通过运行以下命令检查其最后执行尝试的状态:

    systemctl status gateway-connector

    从现在开始,当从网络中的节点(来自其他节点)请求内容时,一切请求都应该快得多。这是通过swarm保持节点连接的神奇之处!

    备注:有想获取IPFS下载地址的,可以通过IPFS官网进行下载或添加小秘书微信咨询。

    本文由Matt Ober发表于 Medium 网站,经由 Filecoin.cn 中国社区翻译整理。

    识别二维码进入IPFS-Filecoin社群

    0_1540888826595_5d688ed5-c8a9-400a-9c69-7b86abd0864c-image.png

登录后回复
 

加微信进群交流

与 Filecoin中国社区 的连接断开,我们正在尝试重连,请耐心等待