..

ipfs-cluster实现ipfs私有网络节点间的数据同步

背景

  • 工作需要搭建一个私有的 ipfs 网络
  • ipfs 本身不提供节点间的数据同步, 数据分块后,分布到不同的节点中。
  • ipfs-cluster 利用 crdt / raft 算法,实现节点间数据的一致性问题。

说明 1

使用 ipfs-cluster 来搭建三个节点的 ipfs 的私有网络。
三台 阿里云 主机。
一台 ubuntu 18.04go 版本 1.10。
二台 ubuntu 14.04go 版本 1.2。 约定节点对应的IP如下规则:

Node0: IP_Node0 //主节点IP
Node1: IP_Node1 //节点1的IP
Node2: IP_Node2 //节点2的IP
  • 基于当前三台机器的环境,进行实践,中途遇到问题了,再去解决。

ipfs vs.ipfs-cluster 说明

  • 私有 ipfs 节点之间通过共同的 secret key 来相互连接。
  • ipfs-cluster 是个独立的程序,实现 ipfs 节点间的数据复制。
  • ipfs-cluster 有一个主节点, 和其他节点直接通过 CLUSTER_SECRET 组成集群。
  • 一般在同一台机器上同时运行着 ipfsipfs-cluster
  • ipfs-cluster daemon 依赖 ipfs daemon,所以 ipfs daemon 必须先运行起来。
  • 默认的端口使用情况
IPFS
4001  Communication with other nodes
5001  API server
8080  Gateway server
IPFS-CLUSTER
9094  HTTP API endpoint
9095  IPFS proxy endpoint
9096  Cluster swarm, used for communication between cluster nodes

搭建步骤

  • 第一步: 升级 go 开发环境
    【执行环境】 三台机器都需要。
    这三台机器 go 的版本太低了,但是刚开始没有升级,就是用默认的。 到后边也确实遇到各样的问题,才回头把 go 环境进行了升级,直接用到了 1.16 版本。
    go 的版本升级参考。 1

  • 第二步: 安装 ipfs
    【执行环境】 三台机器都需要安装。
    ipfs 的安装相对简单,去 https://github.com/ipfs/go-ipfs/releases 上找到合适的版本,按照步骤按照即可。
    安装成功后,运行
    ipfs init
    

    记录下来 cid, 其中 Node0 的为 Node0_IPFS_CID


  • 第三步: 生成并配置 swarm.key
    【执行环境】主节点 Node0 上执行
  • 1) 下载工具 ipfs-swarm-key-gen
    go get -u github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm-key-gen
    

    会在 gopathbin 下,有一个 ipfs-swarm-key-gen 工具。

  • 2) 生成 swarm.key
    ./ipfs-swarm-key-gen & > ~/.ipfs/swarm.key
    
  • 如果权限不够,也可以 ./ipfs-swarm-key-gen & > swarm.key 然后,再 copy~/.ipfs 下。
  • 3) 共享 swarm.key
    把在 Node0 生成的 swarm.key 分别拷贝到 Node1Node2~/.ipfs/ 目录下。

  • 第四步: 启动 ipfs
    【执行环境】 三台机器。
    ipfs daemon
    

  • 第五步: 配置boostrap
    【执行环境】 三台机器。
  • 1)清除 原有的 boostrap
    ipfs bootstrap rm all
    
  • 2) 对三个节点添加 boostrap, 其中 bootnode 就是 主节点 Node0
    ipfs bootstrap add /ip4/<ip address of bootnode>/tcp/4001/ipfs/<peer identity hash of bootnode>
    
  • 3)ipfs config show 就会出现如下字段
    "Bootstrap": [
      "/ip4/118.190.39.87/tcp/4001/ipfs/QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc",
      ]
    

  • 第六步: LIBP2P_FORCE_PNET
    【执行环境】 三台机器。
    告诉 ipfs 切换到 private 模式。
    export LIBP2P_FORCE_PNET=1
    

  • 第七步: 配置 ipfs-cluster
  • 1)安装 ipfs-cluser
    【执行环境】 三台机器。
    具体的安装步骤参考 2
  • 2)生成 CLUSTER_SECRET
    【执行环境】 主节点 Node0 下操作。
    export CLUSTER_SECRET=$(od -vN 32 -An -tx1 /dev/urandom | tr -d ' \n')   
    

    【输出】类似这样的数据

    9a420ec947512b8836d8eb46e1c56fdb746ab8a78015b9821e6b46b38344038f
    
  • 3) 添加 CLUSTER_SECRET 环境变量
    【执行环境】 三台机器。
    export CLUSTER_SECRET=9a420ec947512b8836d8eb46e1c56fdb746ab8a78015b9821e6b46b38344038f
    
  • 4) source ~/.bashrc

  • 第八步: 启动 ipfs-cluster
  • 1) 先启动主节点 Node0
    ipfs-cluster-service init
    ipfs-cluster-service daemon
    
  • 2) 依次启动 Node1Node2
    ipfs-cluster-service init
    ipfs-cluster-service daemon --bootstrap /ip4/<ip address of bootnode>/tcp/9096/ipfs/<peerid of cluster on bootnode>(此处是 bootnode  cluster peerid)
    

  • 第九步: 查看集群中的 peers
    【执行环境】 三台机器。
    ipfs-cluster-ctl peers ls
    

  • 第十步: 测试 (任意节点)
    【执行环境】 三台机器。
    ipfs-cluster-ctl add hell.md
    

    【输出】

    CID
    

    查看状态

    ipfs-cluster-ctl status CID
    

遇到的问题

  • 问题1
    【描述】 go 版本太低,安装 ipfs-cluster 的时候,提示 ..pkg not find in ...
    【解决】 升级 go 到最新版本。 由于 qiang 的原因,还得 曲线安装

  • 问题2
    【描述】一起安装完成后,启动 ipfs daemon,提示 tried to listen with no Private Network Protector but usage of Private
    【解决】当时没有把 swarm.key 放到 ~/.ipfs/ 目录下

  • 问题3
    【描述】Node1/Node2,启动 ipfs daemon 的时候,提示 serveHTTPApi: manet.Listen(/ip4/ipxxx/tcp/5001) failed: listen tcp4
    【解决】修改了 ~/.ipfs/configAddress 下的 API 字段,127.0.0.1 ===> Node IP 导致。 又修改成 127.0.0.1 后, 错误消失。

  • 问题4
    【描述】Node1/Node2,运行 ipfs-cluster-service daemon --bootstrap peerID ,不成功,查看 ipfs-cluster-ctl peers ls ,没有链接成功。
    【解决】其中 peerid 字段, 应该是 Node0ipfs-clusterPeerID。 之前一直用 Node0ipfsPeerID 导致连接不上。
    使用以下命令查看 ipfs-clusterpeerid
    cat ~/.ipfs-cluster/identity.json
    
  • 问题5
    【描述】通问题4,peerid 正确后, 依然连接不上。
    【解决】端口错了,应该是 9096 端口。

  • 问题6
    在实践的过程中, 参考的其他文章。 3 4