IPFS私有網絡和Cluster集群搭建


本篇使用虛擬機搭建IPFS私有網絡和集群,使用vagrant和virtualbox來快速搭建環境。

私有網絡

下載二進制文件

如果使用go-ipfs源碼編譯,需要安裝go環境,推薦下載二進制文件:

  1. https://dist.ipfs.io

  2. https://github.com/ipfs/go-ipfs/releases

使用1下載go-ipfs等其他組件

搭建虛擬機環境

安裝vagrant和virtualbox

# mac
brew install vagrant
brew intall virtualbox

# ubuntu
sudo apt update
sudo apt install virtualbox

curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install vagrant

創建虛擬機

使用ubuntu/focal64(vagrant boxes list),創建Vagrantfile如下:

mkdir ~/vagrant-project
cd /vagrant-project
vagrant init ubuntu/focal64  # 創建Vagrantfile

初始化的Vagrantfile配置很簡單,使用4個虛擬機環境,簡單修改如下:

Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

	(1..4).each do |i|
		config.vm.define "node#{i}" do |node|
          
			node.vm.box = "ubuntu/focal64"
			node.vm.hostname = "node#{i}"
			node.vm.network "private_network", ip: "192.168.33.10#{i}"

			node.vm.provider "virtualbox" do |v|
				v.name = "node#{i}"
				v.memory = 2048
				v.cpus = 1
			end
		end
	end
end

安裝IPFS和配置

將下載的二進制文件移動到項目目錄下~/vagrant-project,默認該目錄會掛載到虛擬機/vagrant

啟動虛擬機

vagrant up

以下是對節點node1進行配置,其余節點類似配置

安裝IPFS二進制文件

vagrant ssh node1   # 進入node1
cd /vagrant         # 進入掛載目錄
tar -C /usr/local -zxvf go-ipfs_v0.10.0_linux-amd64.tar.gz # 解壓
cd /usr/local/go-ipfs
sudo ./install.sh  # 復制到/usr/local/bin

ipfs節點初始化:

ipfs init

生成私有網絡的共享密鑰

生成共享密鑰文件swarm.key,對等節點只有在其內容相同時才會互相建立連接,需要安裝go環境安裝步驟

  1. 下載生成工具
go get -u github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm-key-gen

生成文件swarm.key,復制到~/.ipfs倉庫目錄

ipfs-swarm-key-gen > ~/.ipfs/swarm.key
  1. 復制該文件到其余節點上的~/.ipfs目錄
  • 復制該文件到節點共享的文件中
  • 或者cat ~/.ipfs/swarm.key復制文件內容,在其他節點重新創建

刪除節點的默認引導節點

 ipfs bootstrap rm all

(添加默認的引導節點: ipfs bootstrap add default)

啟動多個節點

注意,上面的操作在所有的節點中都要進行;啟動多個節點,節點按照上述配置好后,需要連接到本地的引導節點,例如將節點node1設置為引導節點,啟動其他節點(例如node2)連接即可:

首先需要啟動ipfs daemon節點node1

查看node1的地址

ipfs id
# /ip4/192.168.33.101/tcp/4001/p2p/12D3KooWPqPuHFePb6WKsiu1eqkHipYQLNV8t6ZX3SZGhiAonqJG

添加node1

ipfs bootstrap add /ip4/192.168.33.101/tcp/4001/p2p/12D3KooWPqPuHFePb6WKsiu1eqkHipYQLNV8t6ZX3SZGhiAonqJG

啟動其他節點

ipfs daemon

查看對等節點

ipfs swarm peers

說明:

可以使用配置文件中 "Peering": { "Peers": null }中添加需要保護的連接,啟動時也會自動連接

問題:節點啟動后announce地址可能沒有指定的地址,可以在配置文件中announce中添加發布的地址(也可以直接連接)

至此,多個節點組成的私有網絡搭建完畢,外部的節點不能連接,也不能訪問該網絡中的文件;對於管理多個IPFS節點和保證數據的安全和可靠性,可以搭建IPFS Cluster集群

IPFS Cluster搭建

IPFS-Cluster節點和IPFS是一一對應的關系,先搭建上述的IPFS多節點網絡,繼續搭建IPFS-Cluster。官方文檔

簡單介紹兩者的關系:

ipfs-cluster-service啟動一個cluster peer節點,它依賴於一個ipfs daemon節點;cluster節點會加入一個獨立於IPFS網絡的另一個swarm網絡

cluster peer會參與集群的共識,遵循一個關於固定pin和解除固定unpin請求的分布式日志,並且對配置的IPFS daemon管理相關的pin操作

cluster peer提供用於集群管理的API,和一個IPFS Proxy API將請求轉發給IPFS daemon,以及內部通信的組件

             +------------------+
             | ipfs-cluster-ctl |
             +---------+--------+
                       |
                       | HTTP(s)
ipfs-cluster-service   |                           HTTP
+----------+--------+--v--+----------------------+      +-------------+
| RPC      | Peer 1 | API | IPFS Connector/Proxy +------> IPFS daemon |
+----^-----+--------+-----+----------------------+      +-------------+
     | libp2p
     |
+----v-----+--------+-----+----------------------+      +-------------+
| RPC      | Peer 2 | API | IPFS Connector/Proxy +------> IPFS daemon |
+----^-----+--------+-----+----------------------+      +-------------+
     |
     |
+----v-----+--------+-----+----------------------+      +-------------+
| RPC      | Peer 3 | API | IPFS Connector/Proxy +------> IPFS daemon |
+----------+--------+-----+----------------------+      +-------------+

默認情況下,集群使用:

  • 9096/tcp 作為集群 swarm 端點,它應該是開放的並且可以被其他集群對等點撥叫。
  • 9094/tcp 作為 HTTP API 端點
  • 9095/tcp 作為代理 API 端點

下載

按照上述地址下載相關組件

  • ipfs-cluster-service(每個節點安裝) —用於啟動一個cluster對等節點
  • ipfs-cluster-ctl(一個節點安裝即可) —用於和ipfs-cluster-service進行交互
  • ipfs-cluster-follower(可選,運行一個follower peer沒有寫權限,用於加入協作集群)

下載后,直接解壓其,將對應的二進制文件移動到/usr/local/bin下即可

配置

所有的cluster peer需要使用相同的secret以及共識組件,先在node1節點進行初始化(默認使用CRDT):

需要先啟動本節點的IPFS daemon

ipfs-cluster-service init

會在~/ipfs-cluster/下生成3個文件:

  • identity: cluster peer的id和私鑰
  • peerstore: 存儲已知的對等節點地址
  • service.json: 配置文件

可以查看service.json當前節點的secret密鑰;其他節點設置成與節點node1相同:

ipfs-cluster-service init --secrect <node1-secret>

設置密鑰也可以使用相同的環境變量CLUSTER-SECRETs

另外,可以使用遠程的配置文件,也可是使用存儲在IPFS中的配置文件ipfs-cluster-service init http://localhost:8080/ipns/config.mydomain.com

先啟動節點node1對應的cluster peer:

ipfs-cluster-service daemon

啟動其他節點

其他節點設置完相同的secret后,直接添加節點node1啟動對應的cluster peer

查看節點node1的id:

ipfs-cluster-ctl id
#  /ip4/192.168.33.101/tcp/9096/p2p/12D3KooWAPR46HGRohMM1xLcrL2FUgLkWm1qtv6W4YHdLYue6hMW

如果沒有顯示私有地址,可以直接使用該地址

啟動其余節點時使用–bootstrap選項:

ipfs-cluster-service daemon --bootstrap /ip4/192.168.33.101/tcp/9096/p2p/12D3KooWAPR46HGRohMM1xLcrL2FUgLkWm1qtv6W4YHdLYue6hMW

多個節點的IPFS Cluster搭建完成

其他配置

對於生產環境,配置文件提供了很多配置,詳細查閱文檔

IPFS-Cluster配置參考文檔

Cluster集群的交互

對等節點

ipfs-cluster-ctl peers list

添加文件

集群默認的Pinset計划分配策略是每個節點固定一次,對應的配置文件中service.json:

"cluster":{
    ...
    "replication_factor_min": -1,
    "replication_factor_max": -1,
    ...
}

在節點node1添加一個haha.gif文件:【可以顯示指定復制因子】

ipfs-cluster-ctl add haha.gif
# added QmRZ1eBKEvgFx38o1gGB8K2KKsno1dzzunG9cCYuhZLzwp haha.gif

可以添加的選項:

  • 指定最小和最大復制因子--replication-min 2 --replication-max 3,盡量達到max數量副本
  • 指定復制因子--replication 2
  • 設置與引腳關聯的名稱,例如--name website

說明:使用ipfs-cluster-ctl add <file>添加的文件才會使用集群的管理,遵循分配策略;直接使用ipfs add <file>只是添加到該節點本地存儲

將已經添加到IPFS節點中的CID(或者可以訪問的CID)固定到Cluster:

ipfs-cluster-ctl pin add <CID> 

ipfs-cluster-ctl add相當於先將文件添加到 ipfs網絡然后將其pin固定到cluster

詳細的添加過程和操作可以查閱官方文檔

文件狀態

注意的地方:

  • ipfs-cluster-ctl pin ls顯示來自集群共享狀態全局 pinset 的信息,這些信息在每個對等點中都完全可用。它顯示了Pin的分配節點以及Pin的相關配置
  • ipfs-cluster-ctl status請求有關每個集群對等體上每個 pin 狀態信息,包括該 CID 是否在 IPFS 上被 PINNED,或者仍然是 PINNING,或者由於某種原因出錯(實際存儲),支持這些情況的過濾結果

查看cluster跟蹤的CID和pin的分配策略:【cluter集群節點共享的只有CID】

ipfs-cluster-ctl pin ls # all pins
ipfs-cluster-ctl pin ls QmRZ1eBKEvgFx38o1gGB8K2KKsno1dzzunG9cCYuhZLzwp

查看pins/CID實際的固定狀態:status命令

ipfs-cluster-ctl status # 所有跟蹤的all cids的狀態
ipfs-cluster-ctl status QmRZ1eBKEvgFx38o1gGB8K2KKsno1dzzunG9cCYuhZLzwp

刪除pin(ipfs會自動解除固定)

ipfs-cluster-ctl pin rm <CID>

訪問文件

所有的IPFS節點組成私有網絡,可以直接使用IPFS節點訪問文件:

ipfs get -o haha.gif QmRZ1eBKEvgFx38o1gGB8K2KKsno1dzzunG9cCYuhZLzwp

API

ipfs cluster的restful API

說明和總結

  • IPFS節點在本篇使用的是私有網絡,但是也可以是公共節點;IPFS Cluster節點組成私有網絡即可;兩個網絡是獨立的。如果是公共網絡,公共網關可以訪問集群中的內容

  • 集群Cluster固定pin可以看作兩個過程,一個是cluster節點維護跟蹤的所有的pin集合—共識組件,另一個是對應的IPFS節點固定pin所對應的文件內容

  1. ipfs cluster的restful API
  2. https://cluster.ipfs.io/documentation/reference/configuration/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM