7Fabric多节点集群生产启动

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多节点集群生产启动的更多相关文章

  1. Hyperledger Fabric 1.0 从零开始(八)——Fabric多节点集群生产部署

    6.1.平台特定使用的二进制文件配置 该方案与Hyperledger Fabric 1.0 从零开始(五)--运行测试e2e类似,根据企业需要,可以控制各节点的域名,及联盟链的统一域名.可以指定单独节 ...

  2. Hyperledger Fabric 1.0 从零开始(一)

    在HyperLedger/Fabric发布0.6的时候,公司就已经安排了一个团队研究这一块,后来也请IBM的专家组过来培训了一批人,不幸的是,这批人后来全走了,然后1.0就发布了.自从2017年7月H ...

  3. Hyperledger Fabric 1.0 从零开始(一)——吐槽

    在HyperLedger/Fabric发布0.6的时候,公司就已经安排了一个团队研究这一块,后来也请IBM的专家组过来培训了一批人,不幸的是,这批人后来全走了,然后没过多久1.0就发布了.自从2017 ...

  4. Hyperledger Fabric 1.0 从零开始(十三)——orderer分布式方案

    简述 在搭建HyperLedger Fabric环境的过程中,我们会用到一个configtx.yaml文件(可参考Hyperledger Fabric 1.0 从零开始(八)——Fabric多节点集群 ...

  5. Hyperledger Fabric 1.0 从零开始(三)——环境构建(内网/准离线)

    有公网环境的服务器可以直接看 Hyperledger Fabric 1.0 从零开始(二)--环境构建(公网) ,本篇内容与上篇相似,只不过环境搭建需要在内网下,也就是网络被限制的情况下. 1:环境构 ...

  6. Hyperledger Fabric 1.0 从零开始(二)——环境构建(公网)

    1:环境构建 在本文中用到的宿主机环境是Centos ,版本为Centos.x86_647.2,通过Docker 容器来运行Fabric的节点,版本为v1.0.因此,启动Fabric网络中的节点需要先 ...

  7. Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用【补充】

    在 Hyperledger Fabric 1.0 从零开始(十二)--fabric-sdk-java应用 中我已经把官方sdk具体改良办法,即使用办法发出来了,所有的类及文件都是完整的,在文章的结尾也 ...

  8. Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用

    Hyperledger Fabric 1.0 从零开始(十)--智能合约 Hyperledger Fabric 1.0 从零开始(十一)--CouchDB 上述两章,最近网上各路大神文章云集,方案多多 ...

  9. Hyperledger Fabric 1.0 从零开始(七)——启动Fabric多节点集群

    5:启动Fabric多节点集群 5.1.启动orderer节点服务 上述操作完成后,此时各节点的compose配置文件及证书验证目录都已经准备完成,可以开始尝试启动多机Fabric集群. 首先启动or ...

随机推荐

  1. JavaWeb学习总结(一)——JavaWeb开发入门(转)

    转载自 http://www.cnblogs.com/xdp-gacl/p/3729033.html 一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示In ...

  2. Java基础(十一) Stream I/O and Files

    Java基础(十一) Stream I/O and Files 1. 流的概念 程序的主要任务是操纵数据.在Java中,把一组有序的数据序列称为流. 依据操作的方向,能够把流分为输入流和输出流两种.程 ...

  3. UVA 1426 - Discrete Square Roots(数论)

    UVA 1426 - Discrete Square Roots 题目链接 题意:给定X, N. R.要求r2≡x (mod n) (1 <= r < n)的全部解.R为一个已知解 思路: ...

  4. nyoj 123 士兵杀敌(四)【树状数组】+【插线问点】

    树状数组有两种情况:插点问线和插线问点.这道题是插线问点. 由于树状数组最简单的作用是计算1~x的和,所以给出(a, b. c).表示(a,b)区间添加c, 那我们仅仅须要在a点原来的基础上添加c,然 ...

  5. 在Azure Container Service创建Kubernetes(k8s)群集运行ASP.NET Core跨平台应用程序

    引子 在此前的一篇文章中,我介绍了如何在本地docker环境中运行ASP.NET Core跨平台应用程序(http://www.cnblogs.com/chenxizhang/p/7148657.ht ...

  6. bandit_pass

    boJ9jbbUNNfktd78OOpsqOltutMc3MY1CV1DtqXWVFXTvM2F0k09SHz0YwRINYA9UmHadQclWmgdLOKQ3YNgjWxGoRMb5luKpIwr ...

  7. 安装Oracle之后在DOS命令下不能使用sqlplus命令启动Oracle?

    就像完成安装JDK后需要给系统配置环境变量JAVA_HOME和PATH,以便让系统认识在JDK里面的Javac命令.同样的,安装Oracle也需要这么一个过程.在正常情况下安装Oracle时系统安装程 ...

  8. HTML5 桌面通知:Notification API

    原文地址:http://blog.gdfengshuo.com/article/23/ 前言 Notification API 是 HTML5 新增的桌面通知 API,用于向用户显示通知信息.该通知是 ...

  9. SpringMVC框架(三)from标签(转)

    原文地址:http://blog.csdn.net/kutim/article/details/46682547 spring表单标签   <%@taglib uri="http:// ...

  10. 通信机制-TCP/IP、Http、Socket的区别

    原文转自:http://blog.csdn.net/axing1991/article/details/45149087 网络由下往上分为 物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. ...