fabric多服務器集羣部署
系統環境:
centos 7.3git
服務器地址列表:
A:10.36.8.106 peer0.org1.example.com
B: 10.36.8.107 peer1.org1.example.com
C: 10.36.8.108 peer0.org2.example.com
D: 10.36.8.109 peer1.org2.example.com
E: 10.36.8.222 orderer.example.comgithub
軟件環境:
每臺服務器都得進行單服務器多節點測試經過(見上篇)
鏡像下載過程能夠優化,只下載一臺而後拷貝到其它機器
docker save `docker images | awk 'NR>1{print $1}'` -o images
scp images hosts:/tmp
其它機器加載docker鏡像
docker load -i images
單服務器測試經過後必須關掉全部的容器,執行此命令便可
./network_setup.sh down
docker
多服務器開始配置:
A:
1 修改 /etc/hosts,添加路由映射
10.36.8.222 orderer.example.com
2 修改docker-compose-cli.yaml(目錄/opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli)
在默認的狀況下,docker-compose-cli.yaml會啓動6個service(容器),它們分別爲 peer0.org1.example.com、 peer1.org1.example.com、 peer0.org2.example.com、
peer1.org2.example.com、 orderer.example.com 和 cli,由於每臺機器只運行與之對應的一個節點,所以須要註釋掉無需啓動的 service。
2.1
除 peer0.org1.example.com 和 cli service 外,其餘 service 所有註釋。
2.2
在 cli 的 volumes 中加入映射關係以下(添加這個的目的主要是後面會產生一個鏈的認證文件在peer目錄下,方便獲取):
- ./peer/:/opt/gopath/src/github.com/hyperledger/fabric/peer/
- /etc/hosts:/etc/hosts
2.3
註釋 cli 中的 depends_on 和 command :
depends_on:
#- orderer.example.com
- peer0.org1.example.com
#- peer1.org1.example.com
#- peer0.org2.example.com
#- peer1.org2.example.com
#command: /bin/bash -c ‘./scripts/script.sh CHANNELNAME;sleepTIMEOUT’
3 修改 base/peer-base.yaml,添加 volumes(方便容器能訪問到order):
volumes:
-/etc/hosts:/etc/hosts
B:
1 修改 /etc/hosts,添加路由映射
10.36.8.222 orderer.example.com
10.36.8.106 peer0.org1.example.com
2 修改docker-compose-cli.yaml(目錄/opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli)
2.1
相似VM1,除 peer1.org1.example.com 和 cli service 外,其餘 service 所有註釋。
2.2
在 cli 的 volumes 中加入映射關係:
- ./peer/:/opt/gopath/src/github.com/hyperledger/fabric/peer/
- /etc/hosts:/etc/hosts
2.3
註釋cli中的 depends_on 和 command:
depends_on:
#- orderer.example.com
#- peer0.org1.example.com
- peer1.org1.example.com
#- peer0.org2.example.com
#- peer1.org2.example.com
#command:/bin/bash -c ‘./scripts/script.sh CHANNELNAME;sleepTIMEOUT
2.4
修改cli中的環境變量
CORE_PEER_ADDRESS=peer1.org1.example.com:7051
3 修改base/peer-base.yaml,同VM1的修改。
C:
1 修改 /etc/hosts,添加路由映射
10.36.8.222 orderer.example.com
10.36.8.106 peer0.org1.example.com
2 修改docker-compose-cli.yaml(目錄/opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli)
2.1
相似VM1,除peer0.org2.example.com 和 cli service 外,其餘 service 所有註釋。
2.2
在 cli 的 volumes 中加入映射關係:
- ./peer/:/opt/gopath/src/github.com/hyperledger/fabric/peer/
- /etc/hosts:/etc/hosts
2.3
註釋cli中的 depends_on 和 command:
depends_on:
#- orderer.example.com
#- peer0.org1.example.com
#- peer1.org1.example.com
- peer0.org2.example.com
#- peer1.org2.example.com
#command:/bin/bash -c ‘./scripts/script.sh CHANNELNAME;sleepTIMEOUT
2.4
修改cli中的環境變量(CORE_PEER_TLS_CERT_FILE、CORE_PEER_TLS_KEY_FILE這兩個變量不要修改)
CORE_PEER_LOCALMSPID=」Org2MSP」
CORE_PEER_ADDRESS=peer0.org2.example.com:7051
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
3 修改base/peer-base.yaml,同VM1的修改。
D:
1 修改 /etc/hosts,添加路由映射
10.36.8.222 orderer.example.com
10.36.8.108 peer0.org2.example.com
2 修改docker-compose-cli.yaml(目錄/opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli)
2.1
相似VM1,除peer1.org2.example.com和cliservice 外,其餘 service 所有註釋。
2.2
在 cli 的 volumes 中加入映射關係:
- ./peer/:/opt/gopath/src/github.com/hyperledger/fabric/peer/
- /etc/hosts:/etc/hosts
2.3
註釋cli中的 depends_on 和 command:
depends_on:
#- orderer.example.com
#- peer0.org1.example.com
#- peer1.org1.example.com
#- peer0.org2.example.com
- peer1.org2.example.com
#command:/bin/bash -c ‘./scripts/script.sh CHANNELNAME;sleepTIMEOUT
2.4
修改cli中的環境變量(CORE_PEER_TLS_CERT_FILE、CORE_PEER_TLS_KEY_FILE這兩個變量不要修改)
CORE_PEER_LOCALMSPID=」Org2MSP」
CORE_PEER_ADDRESS=peer1.org2.example.com:7051
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
3 修改base/peer-base.yaml,同VM1的修改。
E:
修改docker-compose-cli.yaml
除orderer外的其餘 service 所有註釋,即只啓動 orderer
至此基本配置完成centos
多服務器開始啓動
1:上述機器任選一臺
cd /opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli
執行 ./generateArtifacts.sh ,產生channel-artifacts/ 和 crypto-config/兩個目錄(裏面有 orderer 和 peer 的證書、私鑰和以及用於通訊加密的tls證書等文件,它經過 configtx.yaml 配置文件生成)
圖片
把這兩個目錄拷貝到其它全部機器
tar -zcf cert.tar.gz channel-artifacts crypto-config
scp cert.tar.gz 10.36.8.106:/tmp
不管其它機器是否有都直接覆蓋(由於全部機器證書必須一致)
\cp -ar channel-artifacts/* /opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/channel-artifacts/
\cp -ar crypto-config/* /opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/crypto-config/
2: 先啓動order節點E
docker-compose -f docker-compose-cli.yaml up -d
經過docker ps 查看容器orderer.example.com是否存在
3:A和B同屬組織Org1MSP,C和D同屬組織Org2MSP,可是A是B的初始節點,C是D的初始節點,因此得先啓動A和C
我這裏先啓動A
docker-compose -f docker-compose-cli.yaml up -d
docker ps 查看 cli 和peer0.org1.example.com 容器是否存在
進入cli容器
docker exec -it cli bash
用於給order認證的證書
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
建立mychannel,會在當前目錄下產生一個mychannel.block文件,其餘節點加入此鏈的話須要此證書文件,因此須要拷貝至其它全部節點的相同目錄下
peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/channel.tx --tls true --cafile $ORDERER_CA
把 peer0.org1.example.com 加入到 mychannel 中:
peer channel join -b mychannel.block
更新 mychannel 中 org1 的 anchor peer 的信息:
peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org1MSPanchors.tx --tls true --cafile $ORDERER_CA
安裝 chaincode 示例 chaincode_example02 到 peer0.org1.example.com 中:
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
這時候 chaincode 代碼已經安裝到了 peer0 節點上,但並未實例化運行。接下來先配置好其餘節點
B:
docker-compose -f docker-compose-cli.yaml up -d
docker exec -it cli bash
peer channel join -b mychannel.block
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
C:
docker-compose -f docker-compose-cli.yaml up -d
docker exec -it cli bashbash
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
peer channel join -b mychannel.block
peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org2MSPanchors.tx --tls true --cafile $ORDERER_CA
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
D:
docker-compose -f docker-compose-cli.yaml up -d
docker exec -it cli bash
peer channel join -b mychannel.block
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
至此都已啓動完畢服務器
多服務器開始實例化並調試:
1 除order外人選一臺實例化
peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR('Org1MSP.member','Org2MSP.member')"
去其餘全部節點查詢均可以查看到剛實例化的值
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","b"]}'tcp
而且會發現都生成了一個新的容器
docker ps 測試
2 發生交易:invoke
peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mycc -c '{"Args":["invoke","a","b","50"]}'
從新查詢:實例化的變量是否發生改變
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","b"]}'優化
3 更新
安裝新版本
peer chaincode install -n mycc -v 2.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
新版裏初始化兩個變量
peer chaincode upgrade -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mycc -v 2.0 -c '{"Args":["init","c","10","d","20"]}'
經過新版本去查如今的值以及以前的值是否都正常
peer chaincode query -C mychannel -n mycc -v 2.0 -c '{"Args":["query","c"]}'
peer chaincode query -C mychannel -n mycc -v 2.0 -c '{"Args":["query","a"]}'加密
而且會產生一個2.0的新容器
其餘節點經過orderer來同步更新,可是其餘節點想要修改和訪問,必須得先安裝最新的chaincode,不然會報錯
peer chaincode install -n mycc -v 2.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
當上述有的節點失敗時能夠從新來過
fabric根下修改Makefile(/opt/gopath/src/github.com/hyperledger/fabric)
註釋 docker rmi 刪除鏡像這行
docker stop `docker ps |awk 'NR>1{print $1}'`;docker rm `docker ps -a|awk 'NR>1{print $1}'`
make clean
mychannel下建立其餘chaincode
全部節點安裝chaincode:
peer chaincode install -n twocc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
任選節點實例化:
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n twocc -v 1.0 -c '{"Args":["init","e","100","f","200"]}' -P "OR('Org1MSP.member','Org2MSP.member')"
只是每一次建立一個新的chaincode實例化時會產生一個新的容器,其餘的節點在首次查詢時也會建立這個心的容器,因此須要等待必定的時間
注:一、由於是內網操做域名得寫host,因此只要加必要的就行,本地啓動覺得ipv6啓動的,若是本地host寫本身基於ipv4的,將會出現沒法bind
host-192-168-1-100 journal: panic: listen tcp 10.36.8.106:7052: bind: cannot assign requested address
二、刪除重來的時候記得把以前的建立chaincode鏡像也刪掉,否則若是從新初始化以前的會報錯
三、若是order證書從新載入了,得重啓order以及全部節點相關的容器
四、若是某個組織初始化的那一臺出現問題,則重啓這個節點的全部容器,同時得刪除以前建立的鏈容器及鏡像,從新進入cli控制檯查詢會
從新建立這個鏈的容器,不然這個組織下的其餘節點能查詢修改,可是不會有變化,由於收不到最新的order消息
docker操做命令
docker rmi -f 鏡像id 強制刪除鏡像
docker rmi -f `docker images |awk 'NR > 1{ print $3}'`
docker rm 容器id或名字 刪除已中止的容器,運行狀態的容器得先stop
docker start/stop/restart name or id
docker ps -a |grep name |awk '{print $NF}'
docker stop `docker ps |awk 'NR>1{print $1}'`;docker rm `docker ps -a|awk 'NR>1{print $1}'`
docker ps -a 獲取全部的容器信息, -q 獲取全部的容器id(包括全部狀態的) docker inspect 容器id docker logs 容器id 獲取對這個容器操做的日誌信息 docker commit 容器id job1 將容器的狀態保存爲鏡像,鏡像名稱只能取字符[a-z]和數字[0-9] docker簡書:https://www.jianshu.com/p/2217cfed29d7