Hyperledger Fabric 1.0 从零开始(九)——Fabric多节点集群生产启动
7:Fabric多节点集群生产启动
7.1、多节点服务器配置
在生产环境上,我们沿用4.1、配置说明中的服务器各节点配置方案。
我们申请了五台生产服务器,其中四台服务器运行peer节点,另外一台服务器运行orderer节点,为其它四个节点提供排序服务。
虚拟机具体参数如下表所示:
|
名称 |
ip |
节点标识 |
节点Hostname |
Organization(组织机构) |
|
Server1 |
10.130.116.8 |
orderer |
orderer.example.com |
Orderer |
|
Server2 |
10.130.116.9 |
org0 |
peer0.org.example.com |
org |
|
Server3 |
10.130.116.10 |
orgs0 |
peer0.orgs.example.com |
orgS |
|
Server4 |
10.130.116.25 |
orgpay0 |
peer0.orgpay.example.com |
orgPAY |
|
Server5 |
10.130.116.27 |
orgt0 |
peer0.orgt.example.com |
orgT |
7.2、启动orderer排序服务节点
第六章中提到的所有配置方案可以在任意一台符合条件的服务器上进行生成配置,配置完成后,我们首先要启动属于本组织(org)的排序节点服务,启动之前需要创建一个docker-compose-orderer.yaml文件,该文件可参考fabric-samples-release/first-network/docker-compose-cli.yaml进行个性化编写。
具体的编写步骤和内容介绍可参考4.6、设置order节点的docker-compose文件,根据第六章所配置的联盟环境及本组织名称等内容及4.5节中的介绍,我们最终得到属于本组织的专属docker-compose-orderer.yaml文件,具体内容如下:
version: '2' services: orderer.example.com:
extends:
file: base/docker-compose-base.yaml
service: orderer.example.com
container_name: orderer.example.com
这里有一个协助启动文件,是位于base目录下的docker-compose-base.yaml文件,这个文件的参数配置如下:
docker-compose-base.yaml
version: '2' services: orderer.example.com:
container_name: orderer.example.com
image: hyperledger/fabric-orderer
environment:
- ORDERER_GENERAL_LOGLEVEL=debug
- 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]
working_dir: /opt/gopath/src/org/peer
command: orderer
volumes:
- ../bin/channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
- ../bin/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp
- ../bin/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/:/var/hyperledger/orderer/tls
ports:
- 7050:7050
文件及目录编写完成后上传至服务器指定位置,本组织的目录为org,如下视图:

随后在org目录下执行如下命令:
docker-compose -f docker-compose-orderer.yaml up -d
完成后执行如下命令:
docker ps

至此我们在10.130.116.8这台服务器上启动了orderer排序服务。
7.3、启动orgMSP peer节点
peer节点的启动方式可参考4.4、设置peer0.org1.excmple.com节点的docker-compose文件,这里因为在6.6、生成channel下节点集合认证文件已经生成了orgMSP的认证文件,故此我们不必再去创建和生成,为了不必要的混乱,建议各组织生成统一认证的服务器固定。
我们需要将orderer排序服务器上的org/bin目录下的文件拷贝至org组织所在节点服务器org0,即10.130.116.9服务器的/opt/gopath/src目录下。其中crypto-config.yaml和configtx.yaml文件无需拷贝,因为具体的证书等生成都交由orderer排序服务器去执行。
这里的启动步骤与上一节的内容类似,在启动orgMSP之前需要创建一个docker-compose-org.yaml文件,该文件可参考fabric-samples-release/first-network/docker-compose-cli.yaml进行个性化编写。
具体的编写步骤和内容介绍可参考4.4、设置peer0.org1.excmple.com节点的docker-compose文件,根据第六章所配置的联盟环境及本组织名称等内容及4.4节中的介绍,我们最终得到属于本组织的专属docker-compose-org.yaml文件,具体内容如下:
version: '2' services: peer0.org.example.com:
container_name: peer0.org.example.com
extends:
file: base/docker-compose-base.yaml
service: peer0.org.example.com
extra_hosts:
- "orderer.example.com:10.130.116.8" cli:
container_name: cli
image: hyperledger/fabric-tools
tty: true
environment:
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- CORE_LOGGING_LEVEL=DEBUG
- CORE_PEER_ID=cli
- CORE_PEER_ADDRESS=peer0.org.example.com:7051
- CORE_PEER_LOCALMSPID=orgMSP
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/org/peer/crypto/peerOrganizations/org.example.com/peers/peer0.org.example.com/tls/server.crt
- CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/org/peer/crypto/peerOrganizations/org.example.com/peers/peer0.org.example.com/tls/server.key
- CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/org/peer/crypto/peerOrganizations/org.example.com/peers/peer0.org.example.com/tls/ca.crt
- CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/org/peer/crypto/peerOrganizations/org.example.com/users/Admin@org.example.com/msp
working_dir: /opt/gopath/src/org/peer
volumes:
- /var/run/:/host/var/run/
- ./chaincode/:/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go
- ./bin/crypto-config:/opt/gopath/src/org/peer/crypto/
- ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/
- ./bin/channel-artifacts:/opt/gopath/src/org/peer/channel-artifacts
depends_on:
- peer0.org.example.com
extra_hosts:
- "orderer.example.com:10.130.116.8"
- "peer0.org.example.com:10.130.116.9"
这里与orderer不同,有两个协助启动文件,分别是位于base目录下的docker-compose-base.yaml和peer-base.yaml文件,这两个文件的参数配置分别如下:
docker-compose-base.yaml:
version: '2' services: peer0.org.example.com:
container_name: peer0.org.example.com
extends:
file: peer-base.yaml
service: peer-base
environment:
- CORE_PEER_ID=peer0.org.example.com
- CORE_PEER_ADDRESS=peer0.org.example.com:7051
- CORE_PEER_CHAINCODELISTENADDRESS=peer0.org.example.com:7052
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org.example.com:7051
- CORE_PEER_LOCALMSPID=orgMSP
volumes:
- /var/run/:/host/var/run/
- ../bin/crypto-config/peerOrganizations/org.example.com/peers/peer0.org.example.com/msp:/etc/hyperledger/fabric/msp
- ../bin/crypto-config/peerOrganizations/org.example.com/peers/peer0.org.example.com/tls:/etc/hyperledger/fabric/tls
ports:
- 7051:7051
- 7052:7052
- 7053:7053
peer-base.yaml:
version: '2'
services:
peer-base:
image: hyperledger/fabric-peer
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=e2ecli_default
#- CORE_LOGGING_LEVEL=ERROR
- CORE_LOGGING_LEVEL=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/org/peer
command: peer node start
随后在org目录下执行如下命令:
docker-compose -f docker-compose-org.yaml up -d
完成后执行如下命令:
docker ps
即可查看当前启动镜像,如下视图:

继续执行如下命令来查看我们挂载的peer工作路径是否正确,是否为/opt/gopath/src/org/peer:
docker exec -it cli bash
该命令执行后会有如下结果视图:

出现上述目录,则表示我们的挂载没有问题。
因为后续的工作都需要在cli容器中执行,而peer节点的操作就挂载在cli容器中的指定目录。
7.4、创建并加入channel
操作org所在组织的所在节点,即org组织所在节点服务器org0,即10.130.116.9服务器。
如7.3中最后所述,当我们进入peer挂载目录后,即可对当前peer进行相关操作。
在6.5、生成channel源文件的过程中,我们定义了当前channel的名称为examplechannel。参照/scripts/ script.sh文件,我们可以看到创建channel的相关命令,也可以参照官网给定的方案。
具体需要执行命令的样本如下:
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA
上述命令中需要根据生产中实际的需求进行替换,将orderer.example.com组织替换成我们之前定义的orderer.example.com;将$CHANNEL_NAME替换成examplechannel;$CORE_PEER_TLS_ENABLED这个全局变量我们在docker-compose-org.yaml已经定义过了,可以直接引用;$ORDERER_CA是orderer排序服务器TLS证书所在位置,该位置需要通过peer的挂载路径来定位,因此将$ORDERER_CA替换成/opt/gopath/src/org/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem。
在前一步$ORDERER_CA定位的过程中,我们通过ftp等在peer下是找不到指定目录及文件的,主要是通过挂载的方式将./bin/crypto-config和/opt/gopath/src/org/peer/crypto/路径相关联,参考7.3、启动orgMSP peer节点对docker-compose-org.yaml文件的配置详情。
综上所述,我们最终在peer挂载路径下需要执行的命令如下:
peer channel create -o orderer.example.com:7050 -c example -f ./channel-artifacts/example_channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
执行该命令会返回了一个genesis block- <channel-ID.block> -我们可以通过这个id进入到channel。它包含channel.tx中指定的配置信息,创建成功后有如下视图:

接下来,我们要将本组织的当前节点,即org组织所在节点服务器org0,即10.130.116.9服务器节点,加入到channel中,这其中会用到channel-ID.block,而channel-ID.block是上一步所生成的,即example.block。
参照/scripts/ script.sh文件,我们可以看到加入channel的相关命令,也可以参照官网给定的方案。
具体需要执行命令的样本如下:
peer channel join -b $CHANNEL_NAME.block
将$CHANNEL_NAME修改成example.block,即执行如下命令:
peer channel join -b example.block
加入成功后,会有如下视图:

7.4.1、注意事项-必读
通过peer来创建并加入一个channel的时候,如果之前已经创建过同样的channel,导致系统已经返回过一个[channel-ID].block,此时再执行创建的时候会提示该channel已经创建过,若执行加入又会提示该channel的[channel-ID].block 文件不存在,无法加入。
解决上述问题的方案目前笔者已知的有且仅有一个,即在创建channel的时候,系统会返回一个[channel-ID].block文件,该文件就存储在cli容器入口目录里面,当我们创建一个channel成功之后,再次执行如下命令:
docker exec -it cli bash
ls
该命令执行后会有如下视图:

可以看到我们这里有一个example.block文件,该文件的命名方式以各自联盟channel需求为主,这个文件会跟随cli进程的生命周期,即当cli进程被销毁的时候,该进程下的所有目录、文件都会被销毁,比如执行了如下两种命令来销毁进程:
docker-compose -f docker-compose.yaml down -d
或
docker stop [CONTAINER ID]
因此,当我们确认channel创建无误后,需要对该[channel-ID].block文件进行备份,而docker容器内的文件拷贝到实际挂载硬盘中需要docker cp命令的支持,这里给一个简单的demo,如下命令格式:
docker cp <containerId>:/file/path/within/container /host/path/target
这里实际操作的命令是:
docker cp 56d4d547f93f:/opt/gopath/src/github.com/hyperledger/fabric/peer/example.block /opt/gopath/src/github.com/hyperledger/fabric/example/org/channelbak/
我们在org目录下新建一个channelbak目录,专门用来备份各种[channel-ID].block文件。
有了这个备份之后,我们可以停止或删除之前创建的cli及peer等进程,随后当我们创建新的cli及peer容器后,将备份的[channel-ID].block文件拷贝回容器中即可,执行如下命令格式:
docker cp /host/path/target <containerId>:/file/path/within/container
这里实际操作的命令是:
docker cp /opt/gopath/src/github.com/hyperledger/fabric/example/org/channelbak/example.block c912fb6c0a0b:/opt/gopath/src/github.com/hyperledger/fabric/peer/
如果之前没有备份[channel-ID].block文件,那么该服务器可能已经被污染,执行任何删除或销毁容器的方法都无法再次成功创建或加入之前已经创建过的channel中,只能暴力解决该问题,即删除peer、cli等相关镜像,并重新load进来,再执行后续初始化yaml等方法来一步一步实现,但该方案笔者并未尝试过,只是猜测,因为channel的创建依赖cli容器。
补充说明一点,根据peer创建channel的命令来看,创建channel需要的文件都是由configtxgen生成的channel.tx及orderer组织下的pem文件,这两个文件是固定的,且在各不同组织的节点都是相同的,只要其中一个组织生成了[channel-ID].block文件,并将其拷贝给其它组织,其它组织的peer节点无需再次生成,只需要藉此文件执行加入channel的命令就可以了。
即,如果想加入该channel的组织的peer节点服务器因为一些错误操作导致丢失[channel-ID].block文件,可以通过从其它组织的peer节点中拷贝的方式来继续完成加入channel流程。
Hyperledger Fabric 1.0 从零开始(九)——Fabric多节点集群生产启动的更多相关文章
- Hyperledger Fabric 1.0 从零开始(八)——Fabric多节点集群生产部署
6.1.平台特定使用的二进制文件配置 该方案与Hyperledger Fabric 1.0 从零开始(五)--运行测试e2e类似,根据企业需要,可以控制各节点的域名,及联盟链的统一域名.可以指定单独节 ...
- Hyperledger Fabric 1.0 从零开始(一)
在HyperLedger/Fabric发布0.6的时候,公司就已经安排了一个团队研究这一块,后来也请IBM的专家组过来培训了一批人,不幸的是,这批人后来全走了,然后1.0就发布了.自从2017年7月H ...
- Hyperledger Fabric 1.0 从零开始(一)——吐槽
在HyperLedger/Fabric发布0.6的时候,公司就已经安排了一个团队研究这一块,后来也请IBM的专家组过来培训了一批人,不幸的是,这批人后来全走了,然后没过多久1.0就发布了.自从2017 ...
- Hyperledger Fabric 1.0 从零开始(十三)——orderer分布式方案
简述 在搭建HyperLedger Fabric环境的过程中,我们会用到一个configtx.yaml文件(可参考Hyperledger Fabric 1.0 从零开始(八)——Fabric多节点集群 ...
- Hyperledger Fabric 1.0 从零开始(三)——环境构建(内网/准离线)
有公网环境的服务器可以直接看 Hyperledger Fabric 1.0 从零开始(二)--环境构建(公网) ,本篇内容与上篇相似,只不过环境搭建需要在内网下,也就是网络被限制的情况下. 1:环境构 ...
- Hyperledger Fabric 1.0 从零开始(二)——环境构建(公网)
1:环境构建 在本文中用到的宿主机环境是Centos ,版本为Centos.x86_647.2,通过Docker 容器来运行Fabric的节点,版本为v1.0.因此,启动Fabric网络中的节点需要先 ...
- Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用【补充】
在 Hyperledger Fabric 1.0 从零开始(十二)--fabric-sdk-java应用 中我已经把官方sdk具体改良办法,即使用办法发出来了,所有的类及文件都是完整的,在文章的结尾也 ...
- Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用
Hyperledger Fabric 1.0 从零开始(十)--智能合约 Hyperledger Fabric 1.0 从零开始(十一)--CouchDB 上述两章,最近网上各路大神文章云集,方案多多 ...
- Hyperledger Fabric 1.0 从零开始(七)——启动Fabric多节点集群
5:启动Fabric多节点集群 5.1.启动orderer节点服务 上述操作完成后,此时各节点的compose配置文件及证书验证目录都已经准备完成,可以开始尝试启动多机Fabric集群. 首先启动or ...
随机推荐
- C++学习笔记24,方法重写与方法隐藏
该博文仅用于交流学习.请慎用于不论什么商业用途.本博主保留对该博文的一切权利. 博主博客:http://blog.csdn.net/qq844352155 转载请注明出处: 方法重写.是指在子类中又一 ...
- Winform开发框架中工作流模块之审批会签操作
在前面介绍了框架中工作流的几个开发过程,本篇随笔重点介绍一下日常审批环节中的具体处理过程,从开始创建表单,以及各个审批.会签过程的流转过程,希望大家对其中流程的处理有一个大概的印象. 1.请假申请表单 ...
- 五、Spring Boot 事务
spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactio ...
- MyBatis_延迟加载01
一.延迟加载 MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时, 按照设置延迟规则推迟对关联对象的select查询.延迟加载可以有效的减少数据库压力. MyBatis的延迟加载只是对关联 ...
- python 列表解析
列表解析,主要用于动态创建列表 本篇主要说一下,lambda.map().和filter()同列表解析语句之间结合的用法 列表解析的基本语法为:[expr for iter_var in iterab ...
- 自学Zabbix3.9.2-模板Templates-linking/unlinking
自学Zabbix3.9.2-模板Templates-linking/unlinking HOST链接模板之后,便继承了模板里定义的item,trigger等等,使用这个方法,配置zabbix监控会减少 ...
- Anaconda+用conda创建python虚拟环境
Anaconda+用conda创建python虚拟环境 Anaconda与conda区别 conda可以理解为一个工具,也是一个可执行命令,其核心功能是包管理与环境管理.包管理与pip的使用类似,环境 ...
- JMeter接口测试系列:Jmeter+jenkins+ant 的自动化构建
在JMeter接口测试不断深入的过程中,发现可以和jenkins和ant一起搭配进行自动化的构建.下面是jmeter自动化构建的整理笔记. 准备环境 需要本机上确定安装了jmeter.ant和jenk ...
- iOS动态性 运行时runtime初探(强制获取并修改私有变量,强制增加及修改私有方法等)
借助前辈的力量综合一下资料. OC是运行时语言,只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方法.利用runtime机制让我们可以在程序运行时动态修改类.对象中的所有属性.方法,就算是 ...
- wait/notify 实现多线程交叉备份
一.任务 创建20个线程,其中10个线程是将数据备份到 A 数据库中,另外10 个线程将数据备份到 B 数据库中,并且备份 A 数据库和 备份 B 数据库的是交叉运行的. 二.实现 1.实现备份 A ...