IPFS私有網路和Cluster叢集搭建
本篇使用虛擬機器搭建IPFS私有網路和叢集
,使用vagrant
和virtualbox來快速搭建環境。
私有網路
下載二進位制檔案
如果使用go-ipfs原始碼編譯,需要安裝go環境
,推薦下載二進位制檔案:
使用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環境
安裝步驟
- 下載生成工具
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
- 複製該檔案到其餘節點上的
~/.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搭建完成
其他配置
對於生產環境,配置檔案提供了很多配置,詳細查閱文件
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節點在本篇使用的是私有網路,但是也可以是公共節點;IPFS Cluster節點組成私有網路即可;兩個網路是獨立的。如果是公共網路,公共閘道器可以訪問叢集中的內容
-
叢集Cluster固定pin可以看作兩個過程,一個是cluster節點維護跟蹤的所有的pin集合—共識元件,另一個是對應的IPFS節點固定pin所對應的檔案內容