1 多机部署主机、网络配置
-
虚拟机及系统:
准备5台虚拟机,CentOS7系统,内核4.x,内存1G左右(虚拟机分配为最大内存,内存分配大小视宿主机物理内存大小而定,我的宿主机内存为16GB)。虚拟机搭载的节点全部启动后,宿主机内存使用情况:
剩余可用内存5GB左右,虚拟机内存不能分配过大,不然全部启动后可能会造成蓝屏。在一台虚拟机上配置好环境,并且运行e2e_cli没问题,将network down掉,并且克隆另外4台虚拟机。
-
主机IP及主机名hostname配置
修改所有主机的hostname配置,具体名称对应于启动容器的yaml配置文件
虚拟机IP地址 | 虚拟机hostname |
---|---|
192.168.126.136 | orderer.example.com |
192.168.126.132 | peer0.org1.example.com |
192.168.126.133 | peer1.org1.example.com |
192.168.126.134 | peer0.org2.example.com |
192.168.126.135 | peer1.org2.example.com |
solo多机结构:
4个peer节点均依赖于orderer节点。
每个节点分别对应一台服务器,每个peer节点会启动一个peerx.orgx.example.com容器和一个cli容器。
peerx.orgx.example.com容器依赖于orderer容器。
cli容器依赖于peerx.orgx.example.com容器和orderer容器。
peerx.orgx.example.com容器通过宿主机IP地址及基于SSH协议的默认端口22与orderer容器通信。
cli容器通过宿主机IP地址及基于SSH协议的默认端口22与orderer容器通信,通过基于TCP协议的7050-7053端口与peerx.orgx.example.com容器通信。
2 solo多机部署
-
多机部署的名词概念和基本流程参考:
327-fabric之msp和锚节点
-
多机部署实战参考:
HyperLedger Fabric solo 模式多服务器部署
(本人根据这个教程可以跑成功)
3 盘点一下多机部署的坑
主要填坑参考:
在阿里云进行Fabric的多机部署需要注意的几个坑
坑1:
由于每台服务器的cli容器依赖于peerx.orgx.example.com容器的7050-7053/tcp端口,但是防火墙默认不开放这些端口。导致出现报错
peer channel join -b mychannel.block
2020-07-06 08:46:35.424 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP
2020-07-06 08:46:35.424 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity
2020-07-06 08:46:36.439 UTC [grpc] Printf -> DEBU 003 grpc: addrConn.resetTransport failed to create client transport: connection error: desc = "transport: Error while dialing dial tcp 192.168.126.132:7051: getsockopt: no route to host"; Reconnecting to {peer0.org1.example.com:7051 <nil>}
solution:
查看防火墙已开放端口(可能返回空列表)
firewall-cmd --list-ports
开放端口设置:
firewall-cmd --zone=public --add-port=7050/tcp --permanent
firewall-cmd --zone=public --add-port=7051/tcp --permanent
firewall-cmd --zone=public --add-port=7052/tcp --permanent
firewall-cmd --zone=public --add-port=7053/tcp --permanent
重启防火墙:
firewall-cmd --reload
再次查看开放端口,可以看到7050-7053端口列表。
坑2:
如果出现报错
Error: Got unexpected status: BAD_REQUEST
则通道已经创建,但是节点的签名可能有问题,加入通道失败。遇到这种情况,需要删除channel,并且重新建立channel。最好是重新生成创世区块,并重新部署一遍。
注意在重新部署前,需要停止、删除启动的容器、网络、卷等。同时,由于创建channel时启动容器需要镜像支持,故在docker images中还可以看见支持通道容器启动的相关镜像,需要手动删除该镜像,保证之前建立的channel被删除。