之前的文章深入解析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. [Servlet]Servlet工作流程及注意事项

    Servlet工作过程 采用Servlet完成Web实际的工作流应用程序是通过Tomcatserver公布服务,client与server遵循的端部之间的相互作用Http议完毕的. 详细工作流程例如以 ...

  2. 使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题

    原文 使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题 虽然微软宣称 Windows 10 将是最后一个 Windows 版本,但由于年代跨越 ...

  3. 分类算法SVM(支持向量机)

    支持向量机(Support Vector Machine ,SVM)的主要思想是:建立一个最优决策超平面,使得该平面两侧距离该平面最近的两类样本之间的距离最大化,从而对分类问题提供良好的泛化能力.对于 ...

  4. objective-c启用ARC时的内存管理

    PDF版下载:http://download.csdn.net/detail/cuibo1123/7443125      在objective-c中,内存的引用计数一直是一个让人比較头疼的问题.尤其 ...

  5. 关于禅道提示未安装VC++环境的问题(做个记录)

    明明安装了VC++环境,总是提示未安装,这个问题有可能是你的mysql或其他服务开启影响的,关闭服务就可以了! 我这边是这个问题,把mysql和其他一些服务停止就好了.

  6. 在 DEBIAN 上安装 SQL SERVER

    微软在开源 .NET Framework 之后,相继推出了跨平台的编辑器 Visual Studio Code,跨平台的 SQL Server 数据库 SQL Server vNext,Visual ...

  7. App.xaml介绍

    在App.xaml.cs中指定 public App () { InitializeComponent(); MainPage = new XamarinDemo.MainPage(); } 同时,这 ...

  8. WPF加载等待动画

    原文:WPF加载等待动画 原文地址:https://www.codeproject.com/Articles/57984/WPF-Loading-Wait-Adorner 界面遮罩 <UserC ...

  9. jquery属性过滤器

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  10. Httpclient Fluent API简单封装

    import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.List ...