對於聯盟鏈的業務中搭建一個私有網絡的 IPFS 集群還是很有必要的,私有網絡集群允許 IPFS 節點只連接到擁有共享密鑰的其他對等節點,網絡中的節點不響應來自網絡外節點的通信。 IPFS-Cluster 是一個獨立的應用程序和一個 CLI 客戶端,它跨一組 IPFS 守護進程分配、復制和跟蹤 pin。它使用基於 Raft 一致性算法來協調存儲,將數據集分布到參與節點上。對於我們要將一個 peer 上的存儲同步備份到所有集群上其他的 peers 時,或者對集群的節點管理,這時 IPFS-Cluster 就會起到一個很好的作用。 下面簡單描述一下 IPFS 私有網絡以及 IPFS-Cluster 集群的搭建配置過程(Ubuntu16.04)。
IPFS 和 IPFS-Cluster 默認的端口: IPFS:
- 4001 – 與其他節點同學端口
- 5001 – API server
- 8080 – Gateway server
IPFS-CLUSTER:
- 9094 – HTTP API endpoint
- 9095 – IPFS proxy endpoint
- 9096 – Cluster swarm 集群幾點通信端口
Golang 安裝
IPFS 官方提供的安裝方式有安裝包方式,ipfs-update 方式,源碼編譯安裝方式,具體可以查看 https://docs.ipfs.io/guides/guides/install/ 這里為了 ipfs 版本選擇和升級,所以使用ipfs-update
方式安裝,Go 是必須的,對於 Go 的安裝這里不再贅述。
安裝 ipfs-update
在各個節點中安裝ipfs-update
:
go get -u github.com/ipfs/ipfs-update
也比較簡單,由於 ipfs.io 官網被 dns 污染的原因,安裝以后需要配置一下各個節點的/etc/hosts
:
209.94.78.78 ipfs.io
209.94.90.1 ipfs.io
通過 ipfs-update versions
可以 列出所有可以使用和可以下載的ipfs
版本.我們這里直接安裝最新的版本:
$ ipfs-update install latest
fetching go-ipfs version v0.4.22
binary downloaded, verifying...
success!
stashing old binary
installing new binary to /home/hector/go/bin/ipfs
checking if repo migration is needed...
Installation complete!
這樣ipfs
就安裝成功了,接下來我們需要為每台節點的 IPFS 初始化一下:
ipfs init
創建共享的 key
swarm.key
密鑰允許我們創建一個私有網絡,並告訴網絡節點只和擁有相同秘鑰的節點通信,在一個節點上執行下面命令:
go get -u github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm-key-gen
ipfs-swarm-key-gen > ~/.ipfs/swarm.key
通過scp
或者上傳的方式將生成的swarm.key
拷貝到每一台節點的~/.ipfs/swarm.key
。
移除默認的 bootstrap 節點
為了不連接全球的 IPFS 網絡,你需要將默認的 bootstrap 的節點信息刪除。
ipfs bootstrap rm --all
私有網絡節點配置
在每台節點中添加第一個節點的 bootstrap:
ipfs bootstrap add /ip4/192.168.11.11/tcp/4001/ipfs/QmSyQFFm5KdB9zoTNQJhPnMs4LYsVmEpY427QYxH2CaFqL
QmSyQFFm5KdB9zoTNQJhPnMs4LYsVmEpY427QYxH2CaFqL
為ipfs init
時生成的節點 ID,也可以通過ipfs id
查看當前節點的 ID。 我們還需要設置環境變量LIBP2P FORCE PNET
來強制我們的網絡進入私有模式
export LIBP2P_FORCE_PNET=1
將 IPFS 進程加入到系統進程中啟動
每台的 IPFS 啟動都加入系統的守護進程啟動,添加 /etc/systemd/system/ipfs.service
[Unit]
Description=IPFS Daemon
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=simple
ExecStart=/usr/local/bin/ipfs daemon --enable-namesys-pubsub
User=root
[Install]
WantedBy=multi-user.target
現在可以通過下面的命令來啟動 IPFS 的后台守護進程了:
systemctl daemon-reload
systemctl enable ipfs
systemctl start ipfs
systemctl status ipfs
IPFS-Cluster 安裝
IPFS-Cluster 包含兩個組件:
- ipfs-cluster-service 用於初始化集群 peer 並運行它的守護進程
- ipfs-cluster-ctl 管理集群的節點和數據
我們將ipfs-cluster
克隆到 GOPATH 下,然后 make 編譯安裝(系統已安裝 make):
git clone https://github.com/ipfs/ipfs-cluster.git $GOPATH/src ipfs-cluster
make install
查看一下是否安裝成功:
ipfs-cluster-service --version
ipfs-cluster-ctl --version
設置集群密鑰
類似於 IPFS 的秘鑰,我們管理節點中生成一個隨機密鑰:
od -vN 32 -An -tx1 /dev/urandom | tr -d ' \n'
將生成的隨機你字符串加入到環境變量中,比如: b55262c36de6f97bd50b5233f75866445ec51db74613bad78e906c4dc9ba1d30
分別修改每一個節點的的~/.bashrc
添加到環境變量中:
export CLUSTER_SECRET=b55262c36de6f97bd50b5233f75866445ec51db74613bad78e906c4dc9ba1d30
保存后別忘了 source ~/.bashrc
初始化集群
每一台節點執行初始化命令:
ipfs-cluster-service init
在管理節點啟動進程
ipfs-cluster-service daemon
其他節點啟動--bootstrap
添加主節點:
ipfs-cluster-service daemon --bootstrap /ip4/192.168.11.11/tcp/9096/ipfs/12D3KooWEGrD9d3n6UJNzAJDyhfTUZNQmQz4k56Hb6TrYEyxyW2F
這里注意下,12D3KooWEGrD9d3n6UJNzAJDyhfTUZNQmQz4k56Hb6TrYEyxyW2F
是 IPFS-Cluster 節點 ID,不是 IPFS 節點 ID,可以通過ipfs-cluster-service id
查看。 可以通過命令查看集群節點狀態:
ipfs-cluster-ctl peers ls
將 IPFS-Cluster 節點加入到系統進程中啟動
添/etc/systemd/system/ipfs-cluster.service
:
[Unit]
Description=IPFS-Cluster Daemon
Requires=ipfs
After=syslog.target network.target remote-fs.target nss-lookup.target ipfs
[Service]
Type=simple
ExecStart=/root/go/bin/ipfs-cluster-service daemon
User=root
[Install]
WantedBy=multi-user.target
現在可以通過下面的命令來啟動 ipfs-cluster 的后台守護進程了:
systemctl daemon-reload
systemctl enable ipfs-cluster
systemctl start ipfs-cluster
systemctl status ipfs-cluster
測試一下集群數據復制
在其中一台節點中添加一個文件:
ipfs-cluster-ctl add test.txt
通過添加的文件 CID 來查看文件狀態,可以看到文件以及在所有節點中PINNED
ipfs-cluster-ctl status CID