..
ipfs-cluster实现ipfs私有网络节点间的数据同步
背景
- 工作需要搭建一个私有的
ipfs
网络 ipfs
本身不提供节点间的数据同步, 数据分块后,分布到不同的节点中。ipfs-cluster
利用 crdt / raft 算法,实现节点间数据的一致性问题。
说明 1
使用 ipfs-cluster
来搭建三个节点的 ipfs
的私有网络。
三台 阿里云 主机。
一台 ubuntu 18.04
, go
版本 1.10。
二台 ubuntu 14.04
, go
版本 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
组成集群。- 一般在同一台机器上同时运行着
ipfs
,ipfs-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
会在
gopath
的bin
下,有一个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
分别拷贝到Node1
和Node2
的~/.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) 依次启动
Node1
和Node2
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/config
下Address
下的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
字段, 应该是Node0
的ipfs-cluster
的PeerID
。 之前一直用Node0
的ipfs
的PeerID
导致连接不上。
使用以下命令查看ipfs-cluster
的peerid
cat ~/.ipfs-cluster/identity.json
-
问题5
【描述】通问题4,peerid 正确后, 依然连接不上。
【解决】端口错了,应该是9096
端口。 - 问题6
在实践的过程中, 参考的其他文章。 3 4