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文件,具体内容如下:

  1. version: '2'
  2.  
  3. services:
  4.  
  5. orderer.example.com:
  6. extends:
  7. file: base/docker-compose-base.yaml
  8. service: orderer.example.com
  9. container_name: orderer.example.com

这里有一个协助启动文件,是位于base目录下的docker-compose-base.yaml文件,这个文件的参数配置如下:

docker-compose-base.yaml

  1. version: '2'
  2.  
  3. services:
  4.  
  5. orderer.example.com:
  6. container_name: orderer.example.com
  7. image: hyperledger/fabric-orderer
  8. environment:
  9. - ORDERER_GENERAL_LOGLEVEL=debug
  10. - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
  11. - ORDERER_GENERAL_GENESISMETHOD=file
  12. - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
  13. - ORDERER_GENERAL_LOCALMSPID=OrdererMSP
  14. - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
  15. # enabled TLS
  16. - ORDERER_GENERAL_TLS_ENABLED=true
  17. - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
  18. - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
  19. - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
  20. working_dir: /opt/gopath/src/org/peer
  21. command: orderer
  22. volumes:
  23. - ../bin/channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
  24. - ../bin/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp
  25. - ../bin/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/:/var/hyperledger/orderer/tls
  26. ports:
  27. - 7050:7050

文件及目录编写完成后上传至服务器指定位置,本组织的目录为org,如下视图:

随后在org目录下执行如下命令:

  1. docker-compose -f docker-compose-orderer.yaml up -d

完成后执行如下命令:

  1. 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文件,具体内容如下:

  1. version: '2'
  2.  
  3. services:
  4.  
  5. peer0.org.example.com:
  6. container_name: peer0.org.example.com
  7. extends:
  8. file: base/docker-compose-base.yaml
  9. service: peer0.org.example.com
  10. extra_hosts:
  11. - "orderer.example.com:10.130.116.8"
  12.  
  13. cli:
  14. container_name: cli
  15. image: hyperledger/fabric-tools
  16. tty: true
  17. environment:
  18. - GOPATH=/opt/gopath
  19. - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
  20. - CORE_LOGGING_LEVEL=DEBUG
  21. - CORE_PEER_ID=cli
  22. - CORE_PEER_ADDRESS=peer0.org.example.com:7051
  23. - CORE_PEER_LOCALMSPID=orgMSP
  24. - CORE_PEER_TLS_ENABLED=true
  25. - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/org/peer/crypto/peerOrganizations/org.example.com/peers/peer0.org.example.com/tls/server.crt
  26. - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/org/peer/crypto/peerOrganizations/org.example.com/peers/peer0.org.example.com/tls/server.key
  27. - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/org/peer/crypto/peerOrganizations/org.example.com/peers/peer0.org.example.com/tls/ca.crt
  28. - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/org/peer/crypto/peerOrganizations/org.example.com/users/Admin@org.example.com/msp
  29. working_dir: /opt/gopath/src/org/peer
  30. volumes:
  31. - /var/run/:/host/var/run/
  32. - ./chaincode/:/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go
  33. - ./bin/crypto-config:/opt/gopath/src/org/peer/crypto/
  34. - ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/
  35. - ./bin/channel-artifacts:/opt/gopath/src/org/peer/channel-artifacts
  36. depends_on:
  37. - peer0.org.example.com
  38. extra_hosts:
  39. - "orderer.example.com:10.130.116.8"
  40. - "peer0.org.example.com:10.130.116.9"

这里与orderer不同,有两个协助启动文件,分别是位于base目录下的docker-compose-base.yaml和peer-base.yaml文件,这两个文件的参数配置分别如下:

docker-compose-base.yaml:

  1. version: '2'
  2.  
  3. services:
  4.  
  5. peer0.org.example.com:
  6. container_name: peer0.org.example.com
  7. extends:
  8. file: peer-base.yaml
  9. service: peer-base
  10. environment:
  11. - CORE_PEER_ID=peer0.org.example.com
  12. - CORE_PEER_ADDRESS=peer0.org.example.com:7051
  13. - CORE_PEER_CHAINCODELISTENADDRESS=peer0.org.example.com:7052
  14. - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org.example.com:7051
  15. - CORE_PEER_LOCALMSPID=orgMSP
  16. volumes:
  17. - /var/run/:/host/var/run/
  18. - ../bin/crypto-config/peerOrganizations/org.example.com/peers/peer0.org.example.com/msp:/etc/hyperledger/fabric/msp
  19. - ../bin/crypto-config/peerOrganizations/org.example.com/peers/peer0.org.example.com/tls:/etc/hyperledger/fabric/tls
  20. ports:
  21. - 7051:7051
  22. - 7052:7052
  23. - 7053:7053

peer-base.yaml:

  1. version: '2'
  2. services:
  3. peer-base:
  4. image: hyperledger/fabric-peer
  5. environment:
  6. - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
  7. # the following setting starts chaincode containers on the same
  8. # bridge network as the peers
  9. # https://docs.docker.com/compose/networking/
  10. - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=e2ecli_default
  11. #- CORE_LOGGING_LEVEL=ERROR
  12. - CORE_LOGGING_LEVEL=DEBUG
  13. - CORE_PEER_TLS_ENABLED=true
  14. - CORE_PEER_GOSSIP_USELEADERELECTION=true
  15. - CORE_PEER_GOSSIP_ORGLEADER=false
  16. - CORE_PEER_PROFILE_ENABLED=true
  17. - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
  18. - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key
  19. - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt
  20. working_dir: /opt/gopath/src/org/peer
  21. command: peer node start

随后在org目录下执行如下命令:

docker-compose -f docker-compose-org.yaml up -d

完成后执行如下命令:

  1. docker ps

即可查看当前启动镜像,如下视图:

继续执行如下命令来查看我们挂载的peer工作路径是否正确,是否为/opt/gopath/src/org/peer:

  1. 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的相关命令,也可以参照官网给定的方案。

具体需要执行命令的样本如下:

  1. 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挂载路径下需要执行的命令如下:

  1. 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的相关命令,也可以参照官网给定的方案。

具体需要执行命令的样本如下:

  1. peer channel join -b $CHANNEL_NAME.block

将$CHANNEL_NAME修改成example.block,即执行如下命令:

  1. 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成功之后,再次执行如下命令:

  1. docker exec -it cli bash
  2. ls

该命令执行后会有如下视图:

可以看到我们这里有一个example.block文件,该文件的命名方式以各自联盟channel需求为主,这个文件会跟随cli进程的生命周期,即当cli进程被销毁的时候,该进程下的所有目录、文件都会被销毁,比如执行了如下两种命令来销毁进程:

  1. docker-compose -f docker-compose.yaml down -d

  1. docker stop [CONTAINER ID]

因此,当我们确认channel创建无误后,需要对该[channel-ID].block文件进行备份,而docker容器内的文件拷贝到实际挂载硬盘中需要docker cp命令的支持,这里给一个简单的demo,如下命令格式:

  1. docker cp <containerId>:/file/path/within/container /host/path/target

这里实际操作的命令是:

  1. 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文件拷贝回容器中即可,执行如下命令格式:

  1. docker cp /host/path/target <containerId>:/file/path/within/container

这里实际操作的命令是:

  1. 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. models中的pk主键用法

    class FrontUserModel(models.Model): uid = models.UUIDField(primary_key=True,default=uuid.uuid4) emai ...

  2. 分享一波eclipse常用快捷键

    Eclipse快捷键 一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合.通过这些组合可以更加容易的浏览源代码,使得整体的开发效率和质量得到提升. 1. ctrl+shift ...

  3. CentOS安装java and javac(java执行环境和开发环境)

    [root@localhost usr]# yum install java Loaded plugins: fastestmirror, refresh-packagekit, security R ...

  4. stanford-parser for C#

    在项目里用到C#对英文句子进行词性标注.比較成熟的英文词性标注软件是stanford-parser.它个C#版本号,也是借助于IKVM完毕JAVA-C#的转换.详细配置过程例如以下: 1.下载stan ...

  5. VUE-CLI Vue安装及开发,npm run build无法查看项目的问题

    Vue-cli 本地安装vue项目 需要安装node.js,用node命令行npm的方式安装Vue 步骤: 1.进入项目地址安装 npm install vue-cli -g 2.初始化一下 ESli ...

  6. 查看当前支持的shell,echo -e相关转义符,一个简单shell脚本,dos2unix命令把windows格式转为Linux格式

    /etc/shells [root@localhost ~]# more /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bi ...

  7. Intellij IDEA 像eclipse那样给maven添加依赖

    打开pom.xml,在它里面使用快捷键:ALT+Insert  ---->点击dependency 再输入想要添加的依赖关键字,比如:输个spring   出现下图: 根据需求选择版本,完成以后 ...

  8. C#打印杨辉三角

    重主要的方法在于: 1.初始化二维数组 2.边界赋值 3.中心值赋值 4.输出 <pre name="code" class="csharp"> c ...

  9. bzoj 4198: [Noi2015]荷马史诗

    Description 追逐影子的人,自己就是影子. --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由& ...

  10. Apache Avro# 1.8.2 Specification (Avro 1.8.2规范)一

    h4 { text-indent: 0.71cm; margin-top: 0.49cm; margin-bottom: 0.51cm; direction: ltr; color: #000000; ...