1. 程式人生 > >超級賬本(hyperledger)生產多節點部署

超級賬本(hyperledger)生產多節點部署

環境準備

* 安裝docker
* 安裝docker-compose
* 安裝mysql
* 安裝node
* 安裝dnsmasq

架構設計

四臺伺服器
docker0 ca1       couchdb0 zk0  kafka0 peer0-org1 order0 cli
docker1 ca2       couchdb1 zk1  kafka1 peer1-org1 order1
docker2           couchdb2 zk2  kafka2 peer0-org2 order2
docker3           couchdb3      kafka3 peer1-org2

下載程式碼

建立網路

docker network create fabricdockercomposesvt_default -d bridge #預設建立該網路
多機部署採用host模式 對應peer產生對應chaincode的docker容器會採用該網路(fabricdockercomposesvt_default)

安裝dnsmasq 請將ipx改為對應的伺服器ip

ip1 zookeeper0 kafka0 ca1 peer0.org1.example.com orderer0.example.com couchdb0
ip2 zookeeper1 kafka1
ca2 peer1.org1.example.com orderer1.example.com couchdb1 ca.org2.example.com ip3 zookeeper2 kafka2 couchdb2 peer0.org2.example.com orderer3.example.com ip4 kafka3 couchdb3 peer1.org2.example.com 修改docker dns OPTIONS=' --log-driver=journald --signature-verification=false --dns=$dnsmasqip'

生成證書

cd blockchain-explorer
/fabric-docker-compose-svt bash generateArtifacts.sh mychannel

修改配置檔案

cat docker-compose-cli.yaml-1
version: '2'


services:
  ca1:
    image: hyperledger/fabric-ca
    environment:
      - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
      - FABRIC_CA_SERVER_CA_NAME=ca-org1
      - FABRIC_CA_SERVER_TLS_ENABLED=${ENABLE_TLS}
      - FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem
      - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/c107bc25921f005ce49b8ebe7389d51b1391998497d5c06d7760b7ce57b8df4c_sk
    ports:
      - "7054:7054"
    command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/c107bc25921f005ce49b8ebe7389d51b1391998497d5c06d7760b7ce57b8df4c_sk -b admin:adminpw -d'
    volumes:
      - ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
    network_mode: host
    container_name: ca_peerOrg1


  zookeeper0:
    extends:
      file:   base/docker-compose-base.yaml
      service: zookeeper0
    network_mode: host
    container_name: zookeeper0


  kafka0:
    extends:
      file:   base/docker-compose-base.yaml
      service: kafka0
    container_name: kafka0
    network_mode: host
    depends_on:
      - zookeeper0


  orderer0.example.com:
    extends:
      file:   base/docker-compose-base.yaml
      service: orderer0.example.com
    container_name: orderer0.example.com
    network_mode: host
    depends_on:
      - kafka0


  peer0.org1.example.com:
    container_name: peer0.org1.example.com
    network_mode: host
    extends:
      file:  base/docker-compose-base.yaml
      service: peer0.org1.example.com


  cli:
    container_name: cli
    image: hyperledger/fabric-testenv
    tty: true
    network_mode: host
    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.org1.example.com:7051
      - CORE_PEER_LOCALMSPID=Org1MSP
      - CORE_PEER_TLS_ENABLED=${ENABLE_TLS}
      - 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: bash -c 'sleep 30000000000000000000000'
    volumes:
        - /var/run/:/host/var/run/
        - ./examples:/opt/gopath/src/github.com/hyperledger/fabric/examples
        - ./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
cat docker-compose-couch.yaml-1
version: '2'


services:
  couchdb0:
    container_name: couchdb0
    image: hyperledger/fabric-couchdb
    network_mode: host
#   Uncomment the port mapping if you want to expose the CouchDB service,
#   for example to utilize Fauxton User Interface in dev environments.
    ports:
      - "5984:5984"


  peer0.org1.example.com:
    environment:
      - CORE\_LEDGER\_STATE_STATEDATABASE=CouchDB
      - CORE\_LEDGER\_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0:5984
    network_mode: host
    depends_on:
      - couchdb0
cat docker-compose-cli.yaml-2
version: '2'


services:
  ca2:
    image: hyperledger/fabric-ca
    environment:
      - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
      - FABRIC_CA_SERVER_CA_NAME=ca-org2
      - FABRIC_CA_SERVER_TLS_ENABLED=${ENABLE_TLS}
      - FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem
      - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/d296fe44924cd26f7bcceb8ce2aa2fa8fc9c724485baea33421f6b1f6b3d4950_sk
    ports:
      - "8054:7054"
    command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/d296fe44924cd26f7bcceb8ce2aa2fa8fc9c724485baea33421f6b1f6b3d4950_sk -b admin:adminpw -d'
    volumes:
      - ./crypto-config/peerOrganizations/org2.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
    network_mode: host
    container_name: ca_peerOrg2


  zookeeper1:
    extends:
      file:   base/docker-compose-base.yaml
      service: zookeeper1
    network_mode: host
    container_name: zookeeper1


  kafka1:
    extends:
      file:   base/docker-compose-base.yaml
      service: kafka1
    container_name: kafka1
    network_mode: host
    depends_on:
      - zookeeper1


  orderer1.example.com:
    extends:
      file:   base/docker-compose-base.yaml
      service: orderer1.example.com
    network_mode: host
    container_name: orderer1.example.com
    depends_on:
      - kafka1
  peer1.org1.example.com:
    container_name: peer1.org1.example.com
    network_mode: host
    extends:
      file:  base/docker-compose-base.yaml
      service: peer1.org1.example.com
cat docker-compose-couch.yaml-2
version: '2'


services:
  couchdb1:
    container_name: couchdb1
    network_mode: host
    image: hyperledger/fabric-couchdb
#   Uncomment the port mapping if you want to expose the CouchDB service,
#   for example to utilize Fauxton User Interface in dev environments.
    ports:
      - "6984:5984"


  peer1.org1.example.com:
    network_mode: host
    environment:
      - CORE_LEDGER_STATE_STATEDATABASE=CouchDB
      - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb1:5984
cat docker-compose-cli.yaml-3
version: '2'


services:
  zookeeper2:
    extends:
      file:   base/docker-compose-base.yaml
      service: zookeeper2
    network_mode: host
    container_name: zookeeper2


  kafka2:
    extends:
      file:   base/docker-compose-base.yaml
      service: kafka2
    container_name: kafka2
    network_mode: host
    depends_on:
      - zookeeper2


  orderer2.example.com:
    extends:
      file:   base/docker-compose-base.yaml
      service: orderer2.example.com
    network_mode: host
    container_name: orderer2.example.com
    depends_on:
      - kafka2


  peer0.org2.example.com:
    container_name: peer0.org2.example.com
    network_mode: host
    extends:
      file:  base/docker-compose-base.yaml
      service: peer0.org2.example.com
cat docker-compose-couch.yaml-3
version: '2'


services:
  couchdb2:
    container_name: couchdb2
    image: hyperledger/fabric-couchdb
    network_mode: host
#   Uncomment the port mapping if you want to expose the CouchDB service,
#   for example to utilize Fauxton User Interface in dev environments.
    ports:
      - "7984:5984"


  peer0.org2.example.com:
    network_mode: host
    environment:
      - CORE_LEDGER_STATE_STATEDATABASE=CouchDB
      - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb2:5984
cat docker-compose-cli.yaml-4
version: '2'


services:
  kafka3:
    extends:
      file:   base/docker-compose-base.yaml
      service: kafka3
    network_mode: host
    container_name: kafka3


  peer1.org2.example.com:
    network_mode: host
    container_name: peer1.org2.example.com
    extends:
      file:  base/docker-compose-base.yaml
      service: peer1.org2.example.com
cat docker-compose-couch.yaml-4
version: '2'


services:
  couchdb3:
    container_name: couchdb3
    image: hyperledger/fabric-couchdb
    network_mode: host
#   Uncomment the port mapping if you want to expose the CouchDB service,
#   for example to utilize Fauxton User Interface in dev environments.
    ports:
      - "8984:5984"


  peer1.org2.example.com:
    network_mode: host
    environment:
      - CORE_LEDGER_STATE_STATEDATABASE=CouchDB
      - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb3:5984
分別在docker 1,2,3,4上啟動docker-compose
docker-compose -f docker-compose-cli.yaml-${item} docker-compose-couch.yaml-${item}
docker ps -a 檢視容器啟動狀態,確保所有元件啟動正常,因為多機部署,無法保證依賴順序,如果元件啟動失敗可以手動進行啟動, docker start $containername


為了方便我們手動建立channel以及chaincode等資源 cli啟動時未執行初始化操作,docker exec -it cli /bin/bash # ./scripts/script.sh
確保資源初始化成功

安裝fabric-explorer

安裝依賴包


cd fabric-explorer
npm install --registry https://registry.npm.taobao.org
cd explorer_client
npm install --registry https://registry.npm.taobao.org

如果node專案單獨部署需要拷貝 證書,將channel-artifacts crypto-config拷貝到app/app/network-config.json中指定的位置
修改config.json中mysql的配置
如果在部署時指定了ENABLE_TLS=true則需要在config.json中修改"enableTls":true,此時使用的網路配置檔案為app/network-config-tls.json 確保對應證書放在指定位置
啟動 node main.js #最好每次清理tmp下fabric-client開頭的目錄,不然可能造成x509錯誤,這些目錄會快取證書資訊

訪問