基于Raft排序的Fabric2.0 多机集群部署教程
基于Raft排序的Fabric2.0 多机集群部署
Fabric运行环境go语言,docker等自行搭建,该处不进行描述。
Raft是Hyperledger Fabric 1.4.1中新增的排序服务模块,这个教程将介绍如何部署一个基于Raft排序服务的多机Fabric2.0网络。
1、用Raft排序服务启动byfn示例
BYFN是学习Hyperledger Fabric的一个很好的例子:它包含了Fabric网络的所有元素,并且在byfn.sh中完整表现出来。当我们不加任何参数运行这个脚本时,它将启动一个包含2个机构、4个peer和1个orderer(使用solo排序)的Fabric网络。byfn.sh的参数-o用来指定排序服务的类型:
# 2.0以后默认是 etcdraft -i指定docker容器版本。 eg:./byfn.sh up -i 2.0.1
./byfn.sh up -o <kafka | etcdraft> -i <imagetag>
最新的BYFN网络设计中包含了5个orderer的密码学资料。如果使用Solo或Kafka排序服务,将值运行第一个Orderer(参见docker-compose-cli.yaml中的定义)。
当我们指定raft作为排序服务时的一个区别之处在于,使用configtxgen生成创世区块我们需要指定configtx.yaml中的SampleMultiNodeEtcdRaft配置端。其他的操作都保持不变。
最后,我们还需要启动其他4个orderer,这些内容在docker-compose-etcdraft2.yaml中定义。
下面时基于raft排序的BYFN网络启动后的情况,你可以看到有5个orderer在运行:
下面是基于Raft排序服务的BYFN网络的拓扑示意图:
在下面的内容中,我们将不再使用BYFN脚本,而是从零开始来学习如何构建多主机的Raft排序的Fabric网络。
2、Hyperledger Fabric多机部署的不同方案
由于Hyperledger Fabric的组件以容器形式部署,当这些容器都在本机时会很顺利的工作。但是当这些容器需要运行在不同的主机上时,我们需要找出让它们彼此通信的办法。
虽然Hyperledger Fabric官方没有给出正式的推荐方案,目前大致有三种方案:
使用静态IP:通过指定容器运行的主机IP,容器之间就可以彼此通信。可以在docker-compose文件中使用extra_hosts方法来指定主机IP,当容器运行后,就可以在/etc/hosts文件中看到这些项。这一方案容易理解,我们也不需要依赖于外部组件,缺点在于所有的东西都是静态配置的,不利于需要动态修改配置的应用场景。
使用docker swarm:Docker Swarm是Docker环境中的原生容器编排服务。简而言之,Docker Swarm为跨主机的容器提供了一个叠加网络层,使容器彼此之间能够通信,就像在一台主机上一样。这一方案的好处在于原始的配置只需要简单修改就可以使用,也不需要在配置中硬编码像IP地址这样的静态信息。缺点在于需要依赖外部组件Docker Swarm。在这个教程中我们将使用这一方案。
使用Kubernetes:k8s使目前最流行的容器编排工具,其机制类似于Docker Swarm。我们已经注意到有一些教程尝试利用k8s来进行fabric的多机部署,但是使用k8s的难度要明显高于前两种方案。
3、Fabrc2.0 Raft多机演示环境搭建
我们需要将容器分发到4个主机,本教程使用的是局域网下的四台主机。系统为Ubuntu和centos均可以。可以自己随便设置,保证能互相联通
分别为:
- 192.168.1.156,作为host1
- 192.168.1.25, 作为host2
- 192.168.1.27, 作为host3
- 192.168.1.27, 作为host4
在Fabric网络启动运行后,我们将使用Fabcar链码进行测试。总体流程如下:
- 准备4台可以互相通信的主机,均为linu内核。
- 构建一个叠加网络,将4个主机都加入该网络
- 在主机1上准备所有资料,包括密码学资料、通道配置交易、每个节点的docker-compose文件等。然后拷贝到其他主机。
- 使用docker-compose启动所有组件
- 创建通道mychannel并将所有peer加入该通道
- 安装并实例化Fabcar链码
- 调用查询链码方法
4、Fabric Raft多机演示
4.1 准备主机
该处不进行详细说明。
4.2 使用Docker Swarm构建叠加网络
现在我们可以打开4个终端,分别对应每个主机:
# eg: ssh -i root@192.168.1.156 -p 22
ssh -i <key> ubuntu@<public IP> -p <port>
从Host 1执行如下命令:
# 本例中我选择的是192.168.1.156作为主机
# 执行命令 docker swarm init --advertise-addr 192.168.1.156
docker swarm init --advertise-addr <host-1 ip address>
docker swarm join-token manager
运行结果如下:
使用最后的输出,将其他节点以管理者身份加入swarm。
此处为:
docker swarm join --token SWMTKN-1-1xf0ab69g80df3awfclw82iv5n35hto2cjhgkbvcywtg4vhw6z- 977vgxp1hjo8gxzq23dkxi164 192.168.1.156:2377
从host 2/3/4执行如下命令:
docker swarm join --token SWMTKN-1-1xf0ab69g80df3awfclw82iv5n35hto2cjhgkbvcywtg4vhw6z- 977vgxp1hjo8gxzq23dkxi164 192.168.1.156:2377
从host 1创建叠加网络first-network:
docker network create --attachable --driver overlay first-network
docker network ls
运行结果为:
在其他3台主机上,我们可以看到这个网络:
4.3 在host 1上准备资料
一个关键的环节时确保所有的Farbic成员使用相同的密码学资料。我们将使用host 1来创建这些密码学资料,然后拷贝到其他主机。
理论上,我们只需要确保个体身份(证书和签名私钥)遵循所要求的规范。一个机构的证书应当由同一个CA签发 —— 例如org1的证书应当由ca.org1签发。出于简化目的,在本教程中,我们在host 1上创建所有的密码学资料,然后将整个目录拷贝到其他主机。
首先进入fabric-samples目录,如果还没有fabric-samples,自行在github上面去当去该项目,然后创建一个raft-4node-swarm目录。
在host 1上执行如下命令:
cd fabric-samples
mkdir raft-4node-swarm
cd raft-4node-swarm
直接从first-network拷贝crypto-config.yaml和configtx.yaml文件:
cp ../first-network/crypto-config.yaml .
cp ../first-network/configtx.yaml .
mkdir scripts
cp ../first-network/scripts/* ./scripts
其中 crypto-config.yaml 用于生成MSP相关证书,育有组织架构和节点数和first-network一样,所以不作修改。
其中configtx.yaml用于生成创世区块,交易通道配置等,由于节点的通信地址变化,所以共识机制配置中排序节点的通信地址要更改,更改内容如下:
更改前:
更改后:
然后根据配置文件生成必要的密码学资料:
../bin/cryptogen generate --config=./crypto-config.yaml
export FABRIC_CFG_PATH=$PWD
mkdir channel-artifacts
../bin/configtxgen -profile SampleMultiNodeEtcdRaft -outputBlock ./channel-artifacts/genesis.block -channelID byfn-sys-channel
../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP
现在我们为所有主机准备docker-compose文件,主要基于BYFN中的文件,需要创建6个docker-compose文件以及一个env文件:
- base/peer-base.yaml
- base/docker-compose-peer.yaml
- host1.yaml
- host2.yaml
- host3.yaml
- host4.yaml
- .env
4.3.1 base/peer-base.yaml
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
services:
peer-base:
image: hyperledger/fabric-peer:$IMAGE_TAG
environment:
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
# the following setting starts chaincode containers on the same
# bridge network as the peers
# https://docs.docker.com/compose/networking/
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=first-network
- FABRIC_LOGGING_SPEC=INFO
#- FABRIC_LOGGING_SPEC=DEBUG
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_GOSSIP_USELEADERELECTION=true
- CORE_PEER_GOSSIP_ORGLEADER=false
- CORE_PEER_PROFILE_ENABLED=true
- CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
- CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key
- CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: peer node start
orderer-base:
image: hyperledger/fabric-orderer:$IMAGE_TAG
environment:
- FABRIC_LOGGING_SPEC=INFO
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
- ORDERER_GENERAL_GENESISMETHOD=file
- ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
- ORDERER_GENERAL_LOCALMSPID=OrdererMSP
- ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
# enabled TLS
- ORDERER_GENERAL_TLS_ENABLED=true
- ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
- ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
- ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
- ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1
- ORDERER_KAFKA_VERBOSE=true
- ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/orderer/tls/server.crt
- ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/orderer/tls/server.key
- ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
working_dir: /opt/gopath/src/github.com/hyperledger/fabric
command: orderer
4.3.2 base/docker-compose-base.yaml
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
services