1. 程式人生 > 其它 >IPFS私有網路和Cluster叢集搭建

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-ctladd<file>新增的檔案才會使用叢集的管理,遵循分配策略;直接使用ipfsadd<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/