Hyperledger Fabric1.4的多機部署


之前的文章深入解析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將會在下一篇文章中講解。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM