Hyperledger Fabric入門實戰(八)——Solo多機多節點部署

1. Solo多機多節點部署

所有的節點分離部署, 每臺主機上有一個節點

名稱 IP Hostname 組織機構
orderer 118.31.35.238 orderer.itcast.com Orderer
peer0 121.40.33.98 peer0.orggo.com OrgGo
peer1 peer1.orggo.com OrgGo
peer0 47.94.242.61 peer0.orgcpp.com OrgCpp
peer1 peer1.orgcpp.com OrgCpp
  • 準備工作 - 創建工作目錄

    1. n臺主機需要創建一個名字相同的工作目錄
        # 121.40.33.98
        mkdir ~/testwork
        # 118.31.35.238
        mkdir ~/testwork
        # 47.94.242.61
        mkdir ~/testwork
    
  • 編寫配置文件 -> 生成證書的
    根據代碼生成…
    在這裏插入圖片描述

    # crypto-config.yaml -> 名字可以改
    OrdererOrgs:
    # ---------------------------------------------------------------------------
    # Orderer
    # ---------------------------------------------------------------------------
    - Name: Orderer
      Domain: test.com
    
      # ---------------------------------------------------------------------------
      # "Specs" - See PeerOrgs below for complete description
      # ---------------------------------------------------------------------------
      Specs:
        - Hostname: orderer
    PeerOrgs:
    # ---------------------------------------------------------------------------
    # OrgGo
    # ---------------------------------------------------------------------------
    - Name: OrgGo
      Domain: orgGo.test.com
      EnableNodeOUs: false
      Template:
        Count: 2
      Users:
        Count: 1
    # ---------------------------------------------------------------------------
    # OrgCpp
    # ---------------------------------------------------------------------------
    - Name: OrgCpp
      Domain: orgCpp.test.com
      EnableNodeOUs: false
      Template:
        Count: 2
      Users:
        Count: 1
    
  • 生成通道文件和創始塊文件
    從測試文件裏拷貝過來…
    在這裏插入圖片描述

    # configtx.yaml -> 名字不能變
    Organizations:
    
      # SampleOrg defines an MSP using the sampleconfig.  It should never be used
      # in production but may be used as a template for other definitions
      - &OrdererOrg
          # DefaultOrg defines the organization which is used in the sampleconfig
          # of the fabric.git development environment
          Name: OrdererOrg
    
          # ID to load the MSP definition as
          ID: OrdererMSP
    
          # MSPDir is the filesystem path which contains the MSP configuration
          MSPDir: crypto-config/ordererOrganizations/test.com/msp
    
      - &OrgGo
          # DefaultOrg defines the organization which is used in the sampleconfig
          # of the fabric.git development environment
          Name: OrgGoMSP
    
          # ID to load the MSP definition as
          ID: OrgGoMSP
    
          MSPDir: crypto-config/peerOrganizations/orgGo.test.com/msp
    
          AnchorPeers:
              # AnchorPeers defines the location of peers which can be used
              # for cross org gossip communication.  Note, this value is only
              # encoded in the genesis block in the Application section context
              - Host: peer0.orgGo.test.com
                Port: 7051
    
      - &OrgCpp
          Name: OrgCppMSP
          ID: OrgCppMSP
    
          MSPDir: crypto-config/peerOrganizations/orgCpp.test.com/msp
    
          AnchorPeers:
              - Host: peer0.orgCpp.test.com
                Port: 7051
    Capabilities:
      Global: &ChannelCapabilities
          V1_1: true
      Orderer: &OrdererCapabilities
          V1_1: true
      Application: &ApplicationCapabilities
          V1_2: true
    Application: &ApplicationDefaults
    
       Organizations:
    
    Orderer: &OrdererDefaults
    
      # Orderer Type: The orderer implementation to start
      # Available types are "solo" and "kafka"
      OrdererType: solo
    
      Addresses:
          - orderer.test.com:7050
    
      # Batch Timeout: The amount of time to wait before creating a batch
      BatchTimeout: 2s
    
      # Batch Size: Controls the number of messages batched into a block
      BatchSize:
    
          # Max Message Count: The maximum number of messages to permit in a batch
          MaxMessageCount: 10
    
          # Absolute Max Bytes: The absolute maximum number of bytes allowed for
          # the serialized messages in a batch.
          AbsoluteMaxBytes: 99 MB
    
          # Preferred Max Bytes: The preferred maximum number of bytes allowed for
          # the serialized messages in a batch. A message larger than the preferred
          # max bytes will result in a batch larger than preferred max bytes.
          PreferredMaxBytes: 512 KB
    
      Kafka:
          # Brokers: A list of Kafka brokers to which the orderer connects
          # NOTE: Use IP:port notation
          Brokers:
              - 127.0.0.1:9092
      Organizations:
     Profiles:
      TwoOrgsOrdererGenesis:
          Capabilities:
              <<: *ChannelCapabilities
          Orderer:
              <<: *OrdererDefaults
              Organizations:
                  - *OrdererOrg
              Capabilities:
                  <<: *OrdererCapabilities
          Consortiums:
              SampleConsortium:
                  Organizations:
                      - *OrgGo
                      - *OrgCpp
      TwoOrgsChannel:
          Consortium: SampleConsortium
          Application:
              <<: *ApplicationDefaults
              Organizations:
                  - *OrgGo
                  - *OrgCpp
              Capabilities:
                  <<: *ApplicationCapabilities
    
    

生成的具體過程參考第四章即可。

1.1 部署 orderer 排序節點

  • 編寫orderer節點啓動的docker-compose.yaml配置文件

    version: '2'
    
    services:
      orderer.test.com:
        container_name: orderer.test.com
        image: hyperledger/fabric-orderer:latest
        environment:
          - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=testwork_default
          - ORDERER_GENERAL_LOGLEVEL=INFO
          - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
          - ORDERER_GENERAL_LISTENPORT=7050
          - 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/github.com/hyperledger/fabric
        command: orderer
        volumes:
        - ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
        - ./crypto-config/ordererOrganizations/test.com/orderers/orderer.test.com/msp:/var/hyperledger/orderer/msp
        - ./crypto-config/ordererOrganizations/test.com/orderers/orderer.test.com/tls/:/var/hyperledger/orderer/tls
        networks:
            default:
              aliases:
                - testwork  # 這個名字使用當前配置文件所在的目錄 的名字
        ports:
          - 7050:7050
    

1.2 部署 peer0.orggo 節點

  • 切換到peer0.orggo主機 - 121.40.33.98

  • 進入到 ~/testwork

  • 拷貝文件

    $ tree -L 1
    .
    ├── channel-artifacts
    └── crypto-config
    
  • 編寫 docker-compose.yaml配置文件

    version: '2'
    
    services:
    
        peer0.orgGo.test.com:
          container_name: peer0.orgGo.test.com
          image: hyperledger/fabric-peer:latest
          environment:
            - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
            - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=testwork_default
            - CORE_LOGGING_LEVEL=INFO
            #- CORE_LOGGING_LEVEL=DEBUG
            - CORE_PEER_GOSSIP_USELEADERELECTION=true
            - CORE_PEER_GOSSIP_ORGLEADER=false
            - CORE_PEER_PROFILE_ENABLED=true
            - CORE_PEER_LOCALMSPID=OrgGoMSP
            - CORE_PEER_ID=peer0.orgGo.test.com
            - CORE_PEER_ADDRESS=peer0.orgGo.test.com:7051
            - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.orgGo.test.com:7051
            - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.orgGo.test.com:7051
            # TLS
            - CORE_PEER_TLS_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
          volumes:
            - /var/run/:/host/var/run/
            - ./crypto-config/peerOrganizations/orgGo.test.com/peers/peer0.orgGo.test.com/msp:/etc/hyperledger/fabric/msp
            - ./crypto-config/peerOrganizations/orgGo.test.com/peers/peer0.orgGo.test.com/tls:/etc/hyperledger/fabric/tls
          working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
          command: peer node start
          networks:
            default:
              aliases:
                - testwork
          ports:
            - 7051:7051
            - 7053:7053
          extra_hosts:  # 聲明域名和IP的對應關係
            - "orderer.test.com:118.31.35.238"
            
        cli:
          container_name: cli
          image: hyperledger/fabric-tools:latest
          tty: true
          stdin_open: true
          environment:
            - GOPATH=/opt/gopath
            - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
            #- CORE_LOGGING_LEVEL=DEBUG
            - CORE_LOGGING_LEVEL=INFO
            - CORE_PEER_ID=cli
            - CORE_PEER_ADDRESS=peer0.orgGo.test.com:7051
            - CORE_PEER_LOCALMSPID=OrgGoMSP
            - CORE_PEER_TLS_ENABLED=true
            - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgGo.test.com/peers/peer0.orgGo.test.com/tls/server.crt
            - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgGo.test.com/peers/peer0.orgGo.test.com/tls/server.key
            - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgGo.test.com/peers/peer0.orgGo.test.com/tls/ca.crt
            - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgGo.test.com/users/[email protected]/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/
              - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
          depends_on:   # 啓動順序
            - peer0.orgGo.test.com
          
          networks:
              default:
                aliases:
                  - testwork
          extra_hosts:
            - "orderer.test.com:118.31.35.238"
            - "peer0.orgGo.test.com:121.40.33.98"
    
  • ~/testwork創建了一個子目錄chaincode, 並將鏈碼文件放進去

  • 啓動容器

    $ docker-compose up -d
    
  • 進入到客戶端容器中
    docker exec -it cli bash

    • 創建通道

      $ peer channel create -o orderer.test.com:7050 -c testchannel -f ./channel-artifacts/channel.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/test.com/msp/tlscacerts/tlsca.test.com-cert.pem
      
    • 將當前節點加入到通道中

      $ peer channel join -b testchannel.block
      
    • 安裝鏈碼(捨棄)

      peer chaincode install -n testcc -v 1.0 -l golang -p github.com/chaincode
      

      如果在服務器A上安裝鏈碼,然後在服務器B上安裝同樣的鏈碼,哪怕鏈碼是一樣的,可能因爲權限或者其他一些差異,也會導致智能合約不一樣。所以在這裏,我們不是直接安裝鏈碼,而是使用下面的方法:

首先將鏈代碼打包:

peer chaincode package -n testcc -p github.com/chaincode -v 1.0 testcc.out

之後安裝:

peer chaincode install testcc.out 

再然後,將testcc.out文件拷貝到宿主機

docker cp cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/test.out  ./ 

再將test.out文件複製到組織服務器B(orgCpp)上的channel-artifacts文件夾裏,當啓動服務器B的docker-compose時,再將該文件move到peer目錄下即可

  • 初始化鏈碼(只初始化一次)
peer chaincode instantiate -o orderer.test.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/test.com/msp/tlscacerts/tlsca.test.com-cert.pem -C testchannel -n testcc -l golang -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "AND ('OrgGoMSP.member', 'OrgCppMSP.member')"
  • 測試查詢
peer chaincode query -C testchannel -n testcc -c '{"Args":["query","a"]}'
  • 將生成的通道文件 testchannel.block 從cli容器拷貝到宿主機

    # 拷貝操作要在宿主機中進行
    $ docker cp cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/testchannel.block ./
    

在這裏插入圖片描述

1.3 部署 peer0.orgcpp 節點

  • 切換到peer0.orgcpp主機 - 47.94.242.61

  • 進入到 ~/testwork

  • 拷貝文件

    $ tree -L 1
    .
    ├── channel-artifacts
    └── crypto-config
    
    • 通道塊文件 從宿主機 -> 當前的peer0.orgcpp上

      # 爲了方便操作可以將文件放入到客戶端容器掛載的目錄中
      $ mv testchannel.block channel-artifacts/
      

在這裏插入圖片描述

  • 編寫 docker-compose.yaml配置文件
version: '2'

services:

    peer0.orgCpp.test.com:
      container_name: peer0.orgCpp.test.com
      image: hyperledger/fabric-peer:latest
      environment:
        - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
        - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=testwork_default
        # - CORE_LOGGING_LEVEL=INFO
        - CORE_LOGGING_LEVEL=DEBUG
        - CORE_PEER_GOSSIP_USELEADERELECTION=true
        - CORE_PEER_GOSSIP_ORGLEADER=false
        - CORE_PEER_PROFILE_ENABLED=true
        - CORE_PEER_LOCALMSPID=OrgCppMSP
        - CORE_PEER_ID=peer0.orgCpp.test.com
        - CORE_PEER_ADDRESS=peer0.orgCpp.test.com:7051
        - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.orgCpp.test.com:7051
        - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.orgCpp.test.com:7051
        # TLS
        - CORE_PEER_TLS_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
      volumes:
        - /var/run/:/host/var/run/
        - ./crypto-config/peerOrganizations/orgCpp.test.com/peers/peer0.orgCpp.test.com/msp:/etc/hyperledger/fabric/msp
        - ./crypto-config/peerOrganizations/orgCpp.test.com/peers/peer0.orgCpp.test.com/tls:/etc/hyperledger/fabric/tls
      working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
      command: peer node start
      networks:
        default:
          aliases:
            - testwork
      ports:
        - 7051:7051
        - 7053:7053
      extra_hosts:
        - "orderer.test.com:118.31.35.238"
        - "peer0.orgGo.test.com:121.40.33.98"
        
    cli:
      container_name: cli
      image: hyperledger/fabric-tools:latest
      tty: true
      stdin_open: true
      environment:
        - GOPATH=/opt/gopath
        - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
        #- CORE_LOGGING_LEVEL=DEBUG
        - CORE_LOGGING_LEVEL=DEBUG
        - CORE_PEER_ID=cli
        - CORE_PEER_ADDRESS=peer0.orgCpp.test.com:7051
        - CORE_PEER_LOCALMSPID=OrgCppMSP
        - CORE_PEER_TLS_ENABLED=true
        - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgCpp.test.com/peers/peer0.orgCpp.test.com/tls/server.crt
        - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgCpp.test.com/peers/peer0.orgCpp.test.com/tls/server.key
        - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgCpp.test.com/peers/peer0.orgCpp.test.com/tls/ca.crt
        - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgCpp.test.com/users/[email protected]/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/
          - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
      depends_on:
        - peer0.orgCpp.test.com
      
      networks:
          default:
            aliases:
              - testwork
      extra_hosts:
        - "orderer.test.com:118.31.35.238"
        - "peer0.orgGo.test.com:121.40.33.98"
        - "peer0.orgCpp.test.com:47.94.242.61"

  • 啓動當前節點

在這裏插入圖片描述

  • 進入到操作該節點的客戶端中

    • 加入到通道中
    • 安裝鏈碼
peer chaincode install cctest.out 
  • 測試查詢
peer chaincode query -C testchannel -n testcc -c '{"Args":["query","a"]}'
  • 調用方法修改數據
# 轉賬
$ peer chaincode invoke -o orderer.test.com:7050  -C testchannel -n testcc --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/test.com/orderers/orderer.test.com/msp/tlscacerts/tlsca.test.com-cert.pem --peerAddresses peer0.orgGo.test.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgGo.test.com/peers/peer0.orgGo.test.com/tls/ca.crt --peerAddresses peer0.orgcpp.test.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgCpp.test.com/peers/peer0.orgCpp.test.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}'
# 查詢
$ peer chaincode query -C testchannel -n testcc -c '{"Args":["query","a"]}' 
$ peer chaincode query -C testchannel -n testcc -c '{"Args":["query","b"]}' 

1.4 部署其他節點

關於其餘節點的部署, 在此不再過多贅述, 部署方式請參考1.3內容, 步驟是完全一樣的

補充:鏈碼的打包

我們在進行多機多節點部署的時候, 所有的peer節點都需要安裝鏈碼, 有時候會出現鏈碼安裝失敗的問題, 提示鏈碼的指紋(哈希)不匹配,我們可以通過以下方法解決

  1. 通過客戶端在第1個peer節點中安裝好鏈碼之後, 將鏈碼打包

    $ peer chaincode package -n testcc -p github.com/chaincode -v 1.0 mycc.1.0.out
    	-n: 鏈碼的名字
    	-p: 鏈碼的路徑
    	-v: 鏈碼的版本號
    	-mycc.1.0.out: 打包之後生成的文件
    
  2. 將打包之後的鏈碼從容器中拷貝出來

    $ docker cp cli:/xxxx/mycc.1.0.out ./
    
  3. 將得到的打包之後的鏈碼文件拷貝到其他的peer節點上

  4. 通過客戶端在其他peer節點上安裝鏈碼

    $ peer chaincode install mycc.1.0.out
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章