之前的文章深入解析Hyperledger Fabric启动的全过程主要讲解了Fabric的网络搭建,以及启动的整体流程,但是都是通过单机完成的。而区块链本身就是去中心化的,所以最终还是要完成Fabric网络的多机部署。在本文中,将会详细说明Fabric如何完成多机部署。

1 搭建环境

本文使用的是Fabric 1.4版本,搭建solo模式的4+1的架构:1Order,4Peer,数据库使用CouchDb,所以这里需要五台机器。同时,五台机器的网络需要互通,系统使用Ubuntu16.04。

域名 ip地址
orderer.example.com 10.65.182.150
peer0.org1.example.com 10.65.26.64
peer1.org1.example.com 10.65.26.140
peer0.org2.example.com 10.65.200.182
peer1.org2.example.com 10.65.200.44

Fabric的环境搭建过程不再详解,可以参考这一篇文章Hyperledger Fabric环境搭建过程

2.多机环境搭建

如果要成功搭建多机下的Fabric运行环境,首先要保证五台机子上的Fabric网络可以正常运行。

按照Hyperledger Fabric环境搭建过程在五台机子上搭建Fabric完成后,

就可以对相应的配置文件进行修改了,这里本文只在Orderer节点的机子上修改配置文件,最后通过scp命令将配置文件复制到其余四台机子,保证所有的节点所使用的配置文件都是相同的。

在官方的例子中,已经有很多模板可以拿来进行修改,这里本文使用first-network这个文件夹内的配置文件来修改为自己所需要的配置文件。

本文以orderer节点为例,在10.65.182.150这台服务器上进行操作。

2.1准备配置文件

#step1 进入到first-network文件夹的上一级目录
cd ~/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/
#step2 拷贝first-network文件夹,并命名为first
cp -r first-network/ first
#step3 进入到first文件夹内
cd first
#step4 删除此次多机环境搭建使用不到的文件,文件夹内剩余的文件有
.
├── base
│   ├── docker-compose-base.yaml
│   └── peer-base.yaml
├── channel-artifacts
├── configtx.yaml
├── crypto-config.yaml
├── docker-compose-cli.yaml
├── docker-compose-couch.yaml

本文就对以上文件进行修改搭建自己的Fabric多机网络

由于官方的first-network中的配置文件中使用的就是4+1的架构,所以我们可以直接生成所需要的证书文件,创世区块,通道配置文件。

2.2生成相关配置文件

#step1 生成证书文件
cryptogen generate --config=./crypto-config.yaml
#step2 生成创世区块 首先要确保channel-artifacts文件夹存在,如果不存在需要手动创建,不然会报错
configtxgen -profile TwoOrgsOrdererGenesis -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
#step3 生成通道配置文件 其中通道名mychannel可以修改为自己的
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
#step4 生成锚节点配置文件
#========Org1=============
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
##========Org2=============
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP

所有需要的配置文件全部建立完成,在channel-artifacts中应该有以下几个文件。

channel.tx、genesis.block、Org1MSPanchors.tx、Org2MSPanchors.tx

2.3修改节点配置文件

2.3.1base/docker-compose-base.yaml

这个文件中配置了所有节点的一些基本信息,我们需要修改的地方有

peer0.org1.example.com:
container_name: peer0.org1.example.com
extends:
file: peer-base.yaml
service: peer-base
environment:
- CORE_PEER_ID=peer0.org1.example.com
- CORE_PEER_ADDRESS=peer0.org1.example.com:7051
- CORE_PEER_LISTENADDRESS=0.0.0.0:7051
- CORE_PEER_CHAINCODEADDRESS=peer0.org1.example.com:7052
- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
- CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org1.example.com:8051 #这里更改为7051,因为我们是多机环境,不存在端口冲突问题
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
volumes:
- /var/run/:/host/var/run/
- ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/fabric/msp
- ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/etc/hyperledger/fabric/tls
- peer0.org1.example.com:/var/hyperledger/production
ports:
- 7051:7051 peer1.org1.example.com:
container_name: peer1.org1.example.com
extends:
file: peer-base.yaml
service: peer-base
environment:
- CORE_PEER_ID=peer1.org1.example.com
- CORE_PEER_ADDRESS=peer1.org1.example.com:8051 # 7051
- CORE_PEER_LISTENADDRESS=0.0.0.0:8051 #7051
- CORE_PEER_CHAINCODEADDRESS=peer1.org1.example.com:8052 #7052
- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:8052 #7052
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:8051 #7051
- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org1.example.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
volumes:
- /var/run/:/host/var/run/
- ../crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp:/etc/hyperledger/fabric/msp
- ../crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls:/etc/hyperledger/fabric/tls
- peer1.org1.example.com:/var/hyperledger/production ports:
- 8051:8051 #这里不要忘记修改为 7051:7051
...
#只需要修改当前主机上需要启动的节点的端口就可以,比如当前主机节点为peer0.org1.example.com,那么只需要修改peer0.org1...的端口信息

2.3.2 docker-compose-cli.yaml

本文需要使用该文件启动节点,我们将该文件复制一份,以orderer节点为例

#复制该文件,并命名为docker-compose-orderer.yaml
cp docker-compose-cli.yaml docker-compose-orderer.yaml
#用编辑器打开该文件
sudo vim docker-compose-orderer.yaml

我们只在这台电脑上启动orderer节点,所以关于peer节点的信息用不到,我们将配置文件中多余的字段删除,只留下这些内容:

version: '2'

volumes:
orderer.example.com: networks:
byfn: services: orderer.example.com:
extends:
file: base/docker-compose-base.yaml
service: orderer.example.com
container_name: orderer.example.com
networks:
- byfn

接下来可以启动Orderer节点了,执行以下命令启动Orderer节点。

sudo docker-compose -f docker-compose-orderer.yaml up

orderer节点启动成功后,我们使用scp命令将first文件夹传输到peer0.org1节点服务器。

#step1 进入到上级目录
cd ..
#step2 传输文件
sudo scp -r first/ [peer0.org1节点主机名]@10.65.26.64:/home/[用户名]/

然后,我们登陆10.65.26.64主机,对peer0.org1节点进行配置,同样,我们复制一份docker-compose-cli.yaml文件:

#step1:进入传输到的first文件夹
cd ~/first
#step2:复制docker-compose-cli.yaml文件 并命名为docker-compose-peer0-Org1.yaml
cp docker-compose-cli.yaml docker-compose-peer0-Org1.yaml
#step3:用编辑器打开该文件
vim docker-compose-peer0-Org1.yaml

对于peer0.Org1节点,同样,首先删除多余的部分,添加一些字段,最终文件内容为:

version: '2'

volumes:
peer0.org1.example.com: networks:
byfn: services: peer0.org1.example.com:
container_name: peer0.org1.example.com
extends:
file: base/docker-compose-base.yaml
service: peer0.org1.example.com
networks:
- byfn
extra_hosts: #=========需要添加的额外字段,这里不写当前节点
- "orderer.example.com:10.65.182.150"
- "peer1.org1.example.com:10.65.26.140"
- "peer0.org2.example.com:10.65.200.182"
- "peer1.org2.example.com:10.65.200.44" cli:
container_name: cli
image: hyperledger/fabric-tools:$IMAGE_TAG
tty: true
stdin_open: true
environment:
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- FABRIC_LOGGING_SPEC=DEBUG #这里改为DEBUG
- CORE_PEER_ID=cli
- CORE_PEER_ADDRESS=peer0.org1.example.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt
- CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key
- CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
- CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: /bin/bash
volumes:
- /var/run/:/host/var/run/
- ./../chaincode/:/opt/gopath/src/github.com/chaincode
- ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
- ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/
- ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
depends_on:
- peer0.org1.example.com
networks:
- byfn
extra_hosts: #=========需要添加的额外字段.
- "orderer.example.com:10.65.182.150"
- "peer0.org1.example.com:10.65.26.64" #这里需要写当前节点,因为cli容器需要与peer0.org1节点进行通信
- "peer1.org1.example.com:10.65.26.140"
- "peer0.org2.example.com:10.65.200.182"
- "peer1.org2.example.com:10.65.200.44"

此外,因为本文中Fabric数据库使用了CouchDb,所以需要对CouchDb进行相关配置,CouchDb配置文件为docker-compose-couch.yaml

2.3.3 docker-compose-couch.yaml

同样,我们复制一份该文件,命名为docker-compose-peer0-Org1-couch.yaml

cp docker-compose-couch.yaml docker-compose-peer0-Org1-couch.yaml
#使用编辑器打开该文件
vim docker-compose-peer0-Org1-couch.yaml

在这个配置文件中,我们需要删除其他节点的配置信息,只保留peer0.org1的配置文件,最后完整的配置文件内容为:

version: '2'

networks:
byfn: services:
couchdb0:
container_name: couchdb0
image: hyperledger/fabric-couchdb
# Populate the COUCHDB_USER and COUCHDB_PASSWORD to set an admin user and password
# for CouchDB. This will prevent CouchDB from operating in an "Admin Party" mode.
environment:
- COUCHDB_USER=
- COUCHDB_PASSWORD=
# Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,
# for example map it to utilize Fauxton User Interface in dev environments.
ports:
- "5984:5984"
networks:
- byfn peer0.org1.example.com:
environment:
- CORE_LEDGER_STATE_STATEDATABASE=CouchDB
- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0:5984
# The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD
# provide the credentials for ledger to connect to CouchDB. The username and password must
# match the username and password set for the associated CouchDB.
- CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=
- CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=
depends_on:
- couchdb0

至于peer0.org1的配置文件已经修改完毕,接下来我们启动该节点:

sudo docker-compose -f docker-compose-peer0-Org1.yaml -f docker-compose-peer0-Org1-couch.yaml up

如果没有报错的话,peer0.org1节点成功启动。至于其他peer节点,只需要将first文件夹使用scp命令复制到各个服务器上,按照该模板对配置文件进行修改,主要是docker-compose-cli.yamldocker-compose-couch.yaml两个文件。

如果所有节点都可以成功启动的话,接下来就可以进行链码的安装测试了,这一部分不再重复介绍,具体内容可以参考深入解析Hyperledger Fabric启动的全过程中链码的安装测试过程。

整个过程中可能会遇到各种各样的坑,不过大部分问题都是由于配置文件某一地方没有修改好,或者就是yaml文件的格式错误,还是比较好解决的。

最后关闭网络需要清空所有数据,不然再次启动网络会出错。

3 关闭网络

对于Order节点,关闭网络的命令:

sudo docker-compose -f docker-compose-orderer.yaml down --volumes

Peer节点:

sudo docker-compose -f docker-compose-peer0-Org1.yaml -f docker-compose-peer0-Org1-couch.yaml down --volumes

建议在每一次启动网络之前都执行一次关闭网络的命令。

此外,有可能会出现容器无法删除的情况,我们可以执行以下命令进行删除:

sudo docker rm $(docker ps -aq)

到这里,所有文章都还没有讲解Fabric-Ca的内容,Fabric-Ca将会在下一篇文章中讲解。

Hyperledger Fabric1.4的多机部署的更多相关文章

  1. Fabric 1.0的多机部署

    Fabric1.0已经正式发布一段时间了,官方给出的单机部署的脚本也很完备,基本上傻瓜式的一键部署,直接运行官方的network_setup.sh up即可.但是在实际生产环境,我们不可能把所有的节点 ...

  2. 菜鸟系列Fabric——Fabric 1.2 多机部署(3)

    多机部署fabric kafka共识 1. 角色分配 主机1 主机 2 Org1 peer0 1 Org2 peer 0 1 Orderer 0 1 Orderer 2 kafka 0 1 kafka ...

  3. Xcode证书破解 iphone真机部署

    Xcode证书破解 iphone真机部署 证书伪造: 先按照该教程的步骤添加证书.注意,原教程选择的是"系统"证书,这里我们用"登录"证书,切记. Xcode破 ...

  4. Java多机部署下的定时任务处理方案(mysql)

    因为自己有csdn和博客园两个博客, 所以两边都会发一下. csdn地址: http://blog.csdn.net/u012881584/article/details/70194237 今天来说一 ...

  5. ionic项目ios真机部署(不需开发者账号)

    ionic项目ios真机部署(不需开发者账号) 安装ionic和cordova npm install -g ionic npm install -g cordova 创建一个新项目 ionic st ...

  6. jumpserver堡垒机部署

    初稿(后面我有时间再整理一下,看能不能弄成自动化脚本安装): systemctl stop firewalld #关闭防火墙setenforce 0 #关闭selinuxyum install htt ...

  7. 学习用Node.js和Elasticsearch构建搜索引擎(5):mac本机部署canal

    1.背景介绍 最近做的一个项目需要快速检索数据,经过商讨后采用了ElasticSearch作为快速检索数据引擎,但是数据如何同步到ES中是个问题,我们最开始计划了定时任务.mysql trigger等 ...

  8. shell脚本实例-mysql多机部署

    今天我给大家分享shell 安装mysql 多机部署的实例,本次实验是基于各个主机的公钥已经配置好了,如果还不会推送公钥的同学,可以看看我以前写的文章,那里面有写推公钥的实例,mysql 多机部署一般 ...

  9. hyperledger fabric 1.0.5 分布式部署 (八)

    gdb debug peer 程序 在开始我们从 github 上download 下来的源码包,实际上已经包含了可执行的 peer 程序,但是该程序是使用 release 方式编译的,并不支持gdb ...

随机推荐

  1. 将git文件挂到cdn上

    网址:http://raw.githack.com/

  2. wpf控件开发基础(4) -属性系统(3)

    原文:wpf控件开发基础(4) -属性系统(3) 知识回顾 接上篇,上篇我们真正接触到了依赖属性的用法,以及依赖属性的属性元数据的用法,并且也实实在在地解决了之前第二篇提到的一系列问题.来回顾一下 属 ...

  3. SpringBoot、Groovy

    Java——搭建自己的RESTful API服务器(SpringBoot.Groovy)   这又是一篇JavaWeb相关的博客,内容涉及: SpringBoot:微框架,提供快速构建服务的功能 Sp ...

  4. Leetcode 319 Bulb Switcher 找规律

    有n盏关着的灯,第k轮把序号为k倍数的关着的灯打开,开着的灯关闭. class Solution { public: int bulbSwitch(int n) { return (int)sqrt( ...

  5. android延时处理任务范例

    今天要做一个任务,要求图片做button开关,点击出发对应事件.点击打开,图片左边显示几行字体,这几行字体是延时显示的.以下将主要代码附上.以下是main.xml <?xml version=& ...

  6. [Swift]UIAlertController 以及 Swift 中的闭包和枚举

    原文地址:http://blog.callmewhy.com/2014/10/08/uialertcontroller-swift-closures-enum/ 在 iOS8 的 SDK 中, UIK ...

  7. Jenkins 部署

    1  修改jenkins的根目录,默认地在C:\Documents and Settings\AAA\.jenkins . .jenkins ├─jobs│  └─JavaHelloWorld│    ...

  8. Oltu在Jersey框架上实现oauth2.0授权模块

    oltu是一个开源的oauth2.0协议的实现,本人在此开源项目的基础上进行修改,实现一个自定义的oauth2.0模块. 关于oltu的使用大家可以看这里:http://oltu.apache.org ...

  9. CommandParameter binding Introduction:

    Design Patterns SampleCode https://csharpdesignpatterns.codeplex.com/ DevExpress Support Center http ...

  10. 编译时MSIL注入--实践Mono Cecil(1)

    原文:编译时MSIL注入--实践Mono Cecil(1) 紧接上两篇浅谈.NET编译时注入(C#-->IL)和浅谈VS编译自定义编译任务—MSBuild Task(csproject),在第一 ...