本篇使用虛擬機搭建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-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節點在本篇使用的是私有網絡,但是也可以是公共節點;IPFS Cluster節點組成私有網絡即可;兩個網絡是獨立的。如果是公共網絡,公共網關可以訪問集群中的內容
-
集群Cluster固定pin可以看作兩個過程,一個是cluster節點維護跟蹤的所有的pin集合—共識組件,另一個是對應的IPFS節點固定pin所對應的文件內容