FISCO BCOS 多服务器分布式部署
最近在搭建FISCO BCOS 多服务器平台上花了些许时间,写篇博客记录一下,方便项目里的其他小伙伴借鉴。官方文档上是在一台服务器上模拟多服务器进行搭建的,要在实际生成环境中进行部署,有些许不同。接下来我将在两台服务器上进行搭建。以下部分内容摘自官方文档,不再赘述:
FISCO BCOS官方文档:使用企业级部署工具
下载安装
下载
cd ~/ && git clone https://github.com/FISCO-BCOS/generator.git
安装
cd ~/generator && bash ./scripts/install.sh
获取二进制节点
拉取最新fisco-bcos二进制文件到meta中
./generator --download_fisco ./meta
错误解决
这一步有可能出现两个问题,一个是网络错误,如下面这样
这个问题是因为github由于众所周知的原因,网络不是很稳定,所以下载失败,但是其实应该也不至于这么稳定,总之可以在后面加上--cdn
指令,从国内的镜像进行下载。
还有一个问题则是由--cdn
导致的,从cdn下载的压缩文件似乎损坏了,导致解压会出问题,如下图:
解决这个问题的办法是用直接浏览器在github下载二进制文件,也可以直接在服务器使用wget下载,地址如下:
https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v2.4.0/fisco-bcos.tar.gz
然后使用winrar等解压软件,或直接在linux使用如下命令进行解压:
tar -xzvf fisco-bcos.tar.gz
然后会得到一个fisco-bcos
文件,移动到generator
目录下,并赋予运行权限:
chmod +x fisco-bcos
即可跳过./generator --download_fisco ./meta
这一步
检查二进制版本
./meta/fisco-bcos -v
若看到版本号信息则说明二进制文件已经生效可用
初始化链证书
这里我就直接用机构A来初始化证书了,首先进入到generator目录下
cd ~/generator
执行命令:
./generator --generate_chain_certificate ./dir_chain_ca
不出问题的话,在dir_chain_ca目录下应该出现了证书文件:
root@blockchain-1:~/plumk/generator# ls dir_chain_ca/
ca.crt ca.key
ca.crt为链证书,ca.key为链私钥
机构A、B构建群组1
初始化机构A
教程中为了简化操作直接生成了机构证书和私钥,实际应用时应该由机构本地生成私钥agency.key,再生成证书请求文件,向证书签发机构获取机构证书agency.crt。 ————官方文档如是说到
由于我直接在机构A生成证书了,那就直接在机构A的generator目录下进行操作
生成机构A的证书:
./generator --generate_agency_certificate ./dir_agency_ca ./dir_chain_ca agencyA
执行完命令后机构A证书应该就生成到dir_agency_ca/agencyA/
目录下了,我们查看一下:
root@blockchain-1:~/plumk/generator# ls dir_agency_ca/agencyA/
agency.crt agency.key ca.crt
然后将这些文件移动到机构A的meta目录下,这里我就直接移动到本机目录下
cp ./dir_agency_ca/agencyA/* ./meta/
初始化机构B
同样的操作,生成证书,并移动到机构B目录下,我这里直接用scp传送过去了
./generator --generate_agency_certificate ./dir_agency_ca ./dir_chain_ca agencyB
scp ./dir_agency_ca/agencyB/* root@10.13.1.12:~/generator/meta/
一条联盟链中只能用到一个根证书ca.crt,多服务器部署时不要生成多个根证书和私钥。一个群组只能有一个群组创世区块group.x.genesis ———— 官方文档如是提醒
机构A修改配置文件
编辑机构A下generator/conf/node_deployment.ini
文件:
这里并不全是填一样的ip,一般来讲P2P填的是外网ip,而RPC填的是内网ip,这里由于分配到的服务器只有内网ip,我就全填内网了,也只有内网的机子能访问,实际开发过程中RPC切记不能填外网ip,关于配置文件中的3个接口的详细资料,具体可看这篇文章
[group]
group_id=1
[node0]
; Host IP for the communication among peers.
; Please use your ssh login IP.
p2p_ip=[机构A ip]
; Listening IP for the communication between SDK clients.
; This IP is the same as p2p_ip for the physical host.
; But for virtual host e.g., VPS servers, it is usually different from p2p_ip.
; You can check accessible addresses of your network card.
; Please see https://tecadmin.net/check-ip-address-ubuntu-18-04-desktop/
; for more instructions.
rpc_ip=[机构A ip]
channel_ip=0.0.0.0
p2p_listen_port=30300
channel_listen_port=20200
jsonrpc_listen_port=8545
[node1]
p2p_ip=[机构A ip]
rpc_ip=[机构A ip]
channel_ip=0.0.0.0
p2p_listen_port=30301
channel_listen_port=20201
jsonrpc_listen_port=8546
机构B修改配置文件
机构B同上
机构A生成并发送节点信息
以下为在机构A上generator目录下的操作
./generator --generate_all_certificates ./agencyA_node_info
命令操作完可以在agencyA_node_info
目录下发现以下文件:
# 从左至右分别为需要交互给机构A的节点证书,节点P2P连接地址文件(根据node_deployment.ini生成的本机构节点信息)摘自官方
root@blockchain-1:~/plumk/generator# ls agencyA_node_info
cert_10.13.1.11_30300.crt cert_10.13.1.11_30301.crt peers.txt
机构生成节点,需要指定其他节点的P2P连接地址,这里我是用scp将P2P地址连接文件发送给机构B
scp ./agencyA_node_info/peers.txt root@10.13.1.12:~/generator/meta/peersA.txt
机构B生成并发送节点信息
与上一步一样,这里不过多赘述,放上命令
./generator --generate_all_certificates ./agencyB_node_info
生成创世区块的机构需要节点证书,示例中由A机构生成创世区块,因此B机构除了发送节点P2P连接地址文件外,还需发送节点证书至机构A
scp ./agencyB_node_info/cert*.crt root@10.13.1.11:~/generator/meta/
同样的,发送节点P2P连接地址文件:
scp ./agencyB_node_info/peers.txt root@10.13.1.11:~/generator/meta/peersB.txt
机构A生成群组1创世区块
修改机构A的conf文件夹下的group_genesis.ini,初始内容如下:
[group]
group_id=1
[nodes]
node0=127.0.0.1:30300
node1=127.0.0.1:30301
node2=127.0.0.1:30302
node3=127.0.0.1:30303
修改为如下,这里要结合个人主机的ip地址来看,注意端口要对上,与前面node_deployment.ini
文件中端口的对应:
;命令解释
[group]
;群组id
group_id=1
[nodes]
;机构A节点p2p地址
node0=10.13.1.11:30300
;机构A节点p2p地址
node1=10.13.1.11:30301
;机构B节点p2p地址
node2=10.13.1.12:30300
;机构B节点p2p地址
node3=10.13.1.12:30301
教程中选择机构A生成群组创世区块,实际生产中可以通过联盟链委员会协商选择。 ————摘自官方文档
接下来就是用命令生成群组创世区块,这步会用到A机构meta文件下面的节点证书,包括A和B
./generator --create_group_genesis ./group
然后我们将这个群组创世区块分发至机构B
scp ./group/group.1.genesis root@10.13.1.12:~/generator/meta
机构A生成所属节点
此命令在机构A上操作,会根据node_deployment.ini
文件生成节点配置文件:
./generator --build_install_package ./meta/peersB.txt ./nodeA
注意,此步指定的节点P2P连接信息peers.txt为群组内其他节点的链接信息,多个机构组网的情况下需要将其合并。 ————摘自官方
此时nodeA文件夹下应该已经有文件了
root@blockchain-1:~/plumk/generator# ls nodeA/
monitor node_10.13.1.11_30300 node_10.13.1.11_30301 scripts start_all.sh stop_all.sh
机构A启动节点:
bash ./nodeA/start_all.sh
启动成功:
try to start node_10.13.1.11_30300
try to start node_10.13.1.11_30301
node_10.13.1.11_30301 start successfully
node_10.13.1.11_30300 start successfully
机构B生成所属节点
与机构A类似,不赘述,放代码:
./generator --build_install_package ./meta/peersA.txt ./nodeB
启动
bash ./nodeB/start_all.sh
查看群组1节点运行状态
查看节点log:
tail -f ./node*/node*/log/log* | grep +++
出现下面这样的字符串说明成功了
info|2020-05-19 22:40:46.229945|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=3,hash=5d19a569...
info|2020-05-19 22:40:47.237060|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=0,hash=b95fc203...
info|2020-05-19 22:40:50.255719|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=3,hash=8f9eb369...
info|2020-05-19 22:40:51.260244|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=0,hash=2c82cb3f...
info|2020-05-19 22:40:54.276552|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=3,hash=f1f629d9...
搭建控制台
首先安装一下JAVA JDK
sudo apt install -y default-jdk
输入java -version
出现类似一下版本信息就是成功了
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-8u252-b09-1~18.04-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
机构A、B下载控制台程序
我们先下载控制台程序,这个命令会自动为我们配置好控制台的配置文件
./generator --download_console ./
错误解决
这里可能会出现之前下安装二进制文件的错误,处理起来比较麻烦,需要手动操作,首先从下面链接下载:
https://github.com/FISCO-BCOS/console/releases/download/v1.0.9/console.tar.gz
然后直接解压可得console
文件夹,如果说文件格式错误,多半是下载的时候文件出错了,多下几次即可
配置A机构控制台(B机构同理):生成sdk证书
./generator --generate_sdk_certificate ./dir_sdk_ca ./dir_agency_ca/agencyA
执行完命令后,在dir_sdk_ca/sdk目录下可以看到如下文件:
root@blockchain-1:~/plumk/generator# ls dir_sdk_ca/sdk
ca.crt node.crt node.key sdk.crt sdk.key
将文件复制至console目录下的conf文件夹:
cp -rf dir_sdk_ca/sdk/* console/conf/
然后复制样例文件applicationContext-sample.xml
为新文件:
cp applicationContext-sample.xml applicationContext.xml
在applicationContext.xml
中应该可以看到一个value标签,修改value标签为两个:
<value>[你的ip]:20200</value>
<value>[你的ip]:20201</value>
这样就配置完了
启动控制台
回到console目录,执行:
./start.sh
过一会就能看见控制台了
=============================================================================================
Welcome to FISCO BCOS console(1.0.9)!
Type 'help' or 'h' for help. Type 'quit' or 'q' to quit console.
________ ______ ______ ______ ______ _______ ______ ______ ______
| | \/ \ / \ / \ | \ / \ / \ / \
| $$$$$$$$\$$$$$| $$$$$$| $$$$$$| $$$$$$\ | $$$$$$$| $$$$$$| $$$$$$| $$$$$$\
| $$__ | $$ | $$___\$| $$ \$| $$ | $$ | $$__/ $| $$ \$| $$ | $| $$___\$$
| $$ \ | $$ \$$ \| $$ | $$ | $$ | $$ $| $$ | $$ | $$\$$ \
| $$$$$ | $$ _\$$$$$$| $$ __| $$ | $$ | $$$$$$$| $$ __| $$ | $$_\$$$$$$\
| $$ _| $$_| \__| $| $$__/ | $$__/ $$ | $$__/ $| $$__/ | $$__/ $| \__| $$
| $$ | $$ \\$$ $$\$$ $$\$$ $$ | $$ $$\$$ $$\$$ $$\$$ $$
\$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$
=============================================================================================
[group:1]>
尝试deploy一个HelloWorld,应该可以看到类似如下内容:
[group:1]> deploy HelloWorld
contract address: 0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx