经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 其他 » 区块链 » 查看文章
Hyperledger Fabric的多机部署
来源:cnblogs  作者:触不可及`  时间:2019/6/24 8:37:46  对本文有异议

之前的文章深入解析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准备配置文件

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

本文就对以上文件进行修改搭建自己的Fabric多机网络
由于官方的first-network中的配置文件中使用的就是4+1的架构,所以我们可以直接生成所需要的证书文件,创世区块,通道配置文件。

2.2生成相关配置文件

  1. #step1 生成证书文件
  2. cryptogen generate --config=./crypto-config.yaml
  3. #step2 生成创世区块 首先要确保channel-artifacts文件夹存在,如果不存在需要手动创建,不然会报错
  4. configtxgen -profile TwoOrgsOrdererGenesis -channelID mychannel -outputBlock ./channel-artifacts/genesis.block
  5. #step3 生成通道配置文件 其中通道名mychannel可以修改为自己的
  6. configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
  7. #step4 生成锚节点配置文件
  8. #========Org1=============
  9. configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
  10. ##========Org2=============
  11. 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

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

  1. peer0.org1.example.com:
  2. container_name: peer0.org1.example.com
  3. extends:
  4. file: peer-base.yaml
  5. service: peer-base
  6. environment:
  7. - CORE_PEER_ID=peer0.org1.example.com
  8. - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
  9. - CORE_PEER_LISTENADDRESS=0.0.0.0:7051
  10. - CORE_PEER_CHAINCODEADDRESS=peer0.org1.example.com:7052
  11. - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
  12. - CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org1.example.com:8051 #这里个性为7051,因为我们是多机环境,不存在端口冲突问题
  13. - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051
  14. - CORE_PEER_LOCALMSPID=Org1MSP
  15. volumes:
  16. - /var/run/:/host/var/run/
  17. - ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/fabric/msp
  18. - ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/etc/hyperledger/fabric/tls
  19. - peer0.org1.example.com:/var/hyperledger/production
  20. ports:
  21. - 7051:7051
  22. peer1.org1.example.com:
  23. container_name: peer1.org1.example.com
  24. extends:
  25. file: peer-base.yaml
  26. service: peer-base
  27. environment:
  28. - CORE_PEER_ID=peer1.org1.example.com
  29. - CORE_PEER_ADDRESS=peer1.org1.example.com:8051 # 7051
  30. - CORE_PEER_LISTENADDRESS=0.0.0.0:8051 #7051
  31. - CORE_PEER_CHAINCODEADDRESS=peer1.org1.example.com:8052 #7052
  32. - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:8052 #7052
  33. - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:8051 #7051
  34. - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org1.example.com:7051
  35. - CORE_PEER_LOCALMSPID=Org1MSP
  36. volumes:
  37. - /var/run/:/host/var/run/
  38. - ../crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp:/etc/hyperledger/fabric/msp
  39. - ../crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls:/etc/hyperledger/fabric/tls
  40. - peer1.org1.example.com:/var/hyperledger/production
  41. ports:
  42. - 8051:8051 #这里不要忘记修改为 7051:7051
  43. ...
  44. #以下全部需要修改 8051/9051/10051修改为7051 8052/9052/10052修改为7052
  45. #其余地方不需要修改

2.3.2 docker-compose-cli.yaml

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

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

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

  1. version: '2'
  2. volumes:
  3. orderer.example.com:
  4. networks:
  5. byfn:
  6. services:
  7. orderer.example.com:
  8. extends:
  9. file: base/docker-compose-base.yaml
  10. service: orderer.example.com
  11. container_name: orderer.example.com
  12. networks:
  13. - byfn

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

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

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

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

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

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

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

  1. version: '2'
  2. volumes:
  3. peer0.org1.example.com:
  4. networks:
  5. byfn:
  6. services:
  7. peer0.org1.example.com:
  8. container_name: peer0.org1.example.com
  9. extends:
  10. file: base/docker-compose-base.yaml
  11. service: peer0.org1.example.com
  12. networks:
  13. - byfn
  14. extra_hosts: #=========需要添加的额外字段,这里不写当前节点
  15. - "orderer.example.com:10.65.182.150"
  16. - "peer1.org1.example.com:10.65.26.140"
  17. - "peer0.org2.example.com:10.65.200.182"
  18. - "peer1.org2.example.com:10.65.200.44"
  19. cli:
  20. container_name: cli
  21. image: hyperledger/fabric-tools:$IMAGE_TAG
  22. tty: true
  23. stdin_open: true
  24. environment:
  25. - GOPATH=/opt/gopath
  26. - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
  27. - FABRIC_LOGGING_SPEC=DEBUG #这里改为DEBUG
  28. - CORE_PEER_ID=cli
  29. - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
  30. - CORE_PEER_LOCALMSPID=Org1MSP
  31. - CORE_PEER_TLS_ENABLED=true
  32. - 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
  33. - 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
  34. - 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
  35. - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
  36. working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
  37. command: /bin/bash
  38. volumes:
  39. - /var/run/:/host/var/run/
  40. - ./../chaincode/:/opt/gopath/src/github.com/chaincode
  41. - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
  42. - ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/
  43. - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
  44. depends_on:
  45. - peer0.org1.example.com
  46. networks:
  47. - byfn
  48. extra_hosts: #=========需要添加的额外字段.
  49. - "orderer.example.com:10.65.182.150"
  50. - "peer0.org1.example.com:10.65.26.64" #这里需要写当前节点,因为cli容器需要与peer0.org1节点进行通信
  51. - "peer1.org1.example.com:10.65.26.140"
  52. - "peer0.org2.example.com:10.65.200.182"
  53. - "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

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

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

  1. version: '2'
  2. networks:
  3. byfn:
  4. services:
  5. couchdb0:
  6. container_name: couchdb0
  7. image: hyperledger/fabric-couchdb
  8. # Populate the COUCHDB_USER and COUCHDB_PASSWORD to set an admin user and password
  9. # for CouchDB. This will prevent CouchDB from operating in an "Admin Party" mode.
  10. environment:
  11. - COUCHDB_USER=
  12. - COUCHDB_PASSWORD=
  13. # Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,
  14. # for example map it to utilize Fauxton User Interface in dev environments.
  15. ports:
  16. - "5984:5984"
  17. networks:
  18. - byfn
  19. peer0.org1.example.com:
  20. environment:
  21. - CORE_LEDGER_STATE_STATEDATABASE=CouchDB
  22. - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0:5984
  23. # The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD
  24. # provide the credentials for ledger to connect to CouchDB. The username and password must
  25. # match the username and password set for the associated CouchDB.
  26. - CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=
  27. - CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=
  28. depends_on:
  29. - couchdb0

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

  1. 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节点,关闭网络的命令:

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

Peer节点:

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

建议在每一次启动网络之前都执行一次关闭网络的命令。
此外,有可能会出现容器无法删除的情况,我们可以执行以下命令进行删除:

  1. sudo docker rm $(docker ps -aq)

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

原文链接:http://www.cnblogs.com/cbkj-xd/p/11067814.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号