7. Solo多机多节点部署
7.1. 准备工作
所有的节点分离部署, 每台主机上有一个节点, 节点的分布如下表:
| 名称 | IP | Hostname | 组织机构 | 
|---|---|---|---|
| orderer | 192.168.247.129 | orderer.wumansgy.com | Orderer | 
| peer0 | 192.168.247.141 | peer0.orggo.com | OrgGo | 
| peer1 | 192.168.247.142 | peer1.orggo.com | OrgGo | 
| peer0 | 192.168.247.131 | peer0.orgcpp.com | OrgCpp | 
| peer1 | 192.168.247.1451 | peer1.orgcpp.com | OrgCpp | 
下面的操作在任意一台主机上做都可以, 下面的例子中, 生成证书和创始块、通道文件操作是在
Orderer节点对应的主机上进行的。
7.1.1 准备工作 - 创建工作目录
| 1 | N台主机需要创建一个名字相同的工作目录, 该工作目录名字自己定, 切记名字一定要相同 | 
7.1.2 生成组织节点和用户证书
- 编写配置文件 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32- # crypto-config.yaml -> 名字可以改, 一般起名为crypto-config.yaml 
 OrdererOrgs:
 # ---------------------------------------------------------------------------
 # Orderer
 # ---------------------------------------------------------------------------
 - Name: Orderer
 Domain: test.com
 Specs:
 - Hostname: orderer
 PeerOrgs:
 # ---------------------------------------------------------------------------
 # Org1
 # ---------------------------------------------------------------------------
 - Name: OrgGo
 Domain: orggo.test.com
 EnableNodeOUs: false
 Template:
 Count: 2
 Users:
 Count: 1
 # ---------------------------------------------------------------------------
 # Org2: See "Org1" for full specification
 # ---------------------------------------------------------------------------
 - Name: OrgCpp
 Domain: orgcpp.test.com
 EnableNodeOUs: false
 Template:
 Count: 2
 Users:
 Count: 1
- 使用 - cryptogen生成证书- 1 - cryptogen generate --config=crypto-config.yaml 
7.1.3 生成通道文件和创始块文件
- 编写配置文件, 名字为 - configtx.yaml, 该名字不能改, 是固定的.- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99- # configtx.yaml -> 名字不能变 
 ################################################################################
 #
 # Section: Organizations
 #
 ################################################################################
 Organizations:
 -
 Name: OrdererOrg
 ID: OrdererMSP
 MSPDir: ./crypto-config/ordererOrganizations/test.com/msp
 -
 Name: OrgGoMSP
 ID: OrgGoMSP
 MSPDir: ./crypto-config/peerOrganizations/orggo.test.com/msp
 AnchorPeers:
 - Host: peer0.orggo.test.com
 Port: 7051
 -
 Name: OrgCppMSP
 ID: OrgCppMSP
 MSPDir: ./crypto-config/peerOrganizations/orgcpp.test.com/msp
 AnchorPeers:
 - Host: peer0.orgcpp.test.com
 Port: 7051
 ################################################################################
 #
 # SECTION: Capabilities
 #
 ################################################################################
 Capabilities:
 Global:
 V1_1: true
 Orderer:
 V1_1: true
 Application:
 V1_2: true
 ################################################################################
 #
 # SECTION: Application
 #
 ################################################################################
 Application:
 Organizations:
 ################################################################################
 #
 # SECTION: Orderer
 #
 ################################################################################
 Orderer:
 # Available types are "solo" and "kafka"
 OrdererType: solo
 Addresses:
 - orderer.test.com:7050
 BatchTimeout: 2s
 BatchSize:
 MaxMessageCount: 10
 AbsoluteMaxBytes: 99 MB
 PreferredMaxBytes: 512 KB
 Kafka:
 Brokers:
 - 127.0.0.1:9092
 Organizations:
 ################################################################################
 #
 # Profile
 #
 ################################################################################
 Profiles:
 TwoOrgsOrdererGenesis:
 Capabilities:
 <<:
 Orderer:
 <<:
 Organizations:
 -
 Capabilities:
 <<:
 Consortiums:
 SampleConsortium:
 Organizations:
 -
 -
 TwoOrgsChannel:
 Consortium: SampleConsortium
 Application:
 <<:
 Organizations:
 -
 -
 Capabilities:
 <<:
- 通过命令 - configtxgen生成创始块和通道文件- 1 
 2
 3
 4
 5
 6- 我们先创建一个目录 channel-artifacts 存储生成的文件, 目的是为了和后边的配置文件模板的配置项保持一致 
 mkdir channel-artifacts
 生成通道文件
 configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
 生成创始块文件
 configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID testchannel
7.2 部署 orderer 排序节点
7.2.1 编写配置文件
编写启动
orderer节点容器使用的配置文件 -docker-compose.yaml
| 1 | version: '2' | 
注意的细节:
networks的名字要跟当前配置文件所在的目录名相同- 环境变量
CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=testwork_default的名字是网络名_default
7.2.2 启动orderer容器
通过上面编写好的docker-compose配置文件就可以启动
orderer容器了
| 1 | docker-compose up -d | 
7.3 部署 peer0.orggo 节点
7.3.1 准备工作
- 切换到 - peer0.orggo主机 -- 192.168.247.141
- 进入到工作目录中: - 1 - cd ~/testwork 
- 拷贝文件 - 将 - orderer节点所在宿主机上生成的- crypto-config和- channel-artifacts目录拷贝到当前- testwork目录中。- 我们可以通过 - scp命令实现远程拷贝, 从- orderer节点宿主机拷贝到当前- peer0.orggo节点.- orderer节点宿主机IP: 192.168.247.129, 登录用户名:wumansgy
 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13- 通过scp命令远程拷贝 
 -r : 表示要拷贝的是目录, 执行递归操作
 wumansgy@192.168.247.129:/home/wumansgy/testwork/channel-artifacts
 wumansgy@192.168.247.129: 从192.168.247.129上拷贝数据, 登录用户名为wumansgy
 /home/wumansgy/testwork/channel-artifacts: 要拷贝192.168.247.129上wumansgy用户的哪个目录
 ./ : 远程目录拷贝到本地的什么地方
 scp -r wumansgy@192.168.247.129:/home/wumansgy/testwork/channel-artifacts ./
 scp -r wumansgy@192.168.247.129:/home/wumansgy/testwork/crypto-config ./
 查看拷贝结果
 tree ./ -L 1
 .
 ├── channel-artifacts
 └── crypto-config
- orderer节点宿主机
7.3.2 编写 配置文件
编写启动
peer0-orggo节点的配置文件 -docker-compose.yaml
| 1 | # docker-compose.yaml | 
7.3.3 启动容器
- 启动容器 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10- docker-compose up -d 
 Creating network "testwork_default" with the default driver
 Creating peer0.orgGo.test.com ... done
 Creating cli ... done
 查看启动状态
 docker-compose ps
 Name Command State Ports
 -----------------------------------------------------------------------------------------------
 cli /bin/bash Up
 peer0.orgGo.test.com peer node start Up 0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp
7.3.4 对peer0.orggo节点的操作
- 进入到客户端容器中 - 1 - docker exec -it cli bash 
- 创建通道 - 1 
 2
 3- 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 
 ls
 channel-artifacts crypto `testchannel.block` --> 生成的通道块文件
- 将当前节点加入到通道中 - 1 - peer channel join -b testchannel.block 
- 安装链码 - 1 - peer chaincode install -n testcc -v 1.0 -l golang -p github.com/chaincode 
- 初始化链码 - 1 - 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 -v 1.0 -l golang -c '{"Args":["init","a","100","b","200"]}' -P "AND ('OrgGoMSP.member', 'OrgCppMSP.member')" 
- 查询 - 1 
 2- peer chaincode query -C testchannel -n testcc -c '{"Args":["query","a"]}' 
 peer chaincode query -C testchannel -n testcc -c '{"Args":["query","b"]}'
- 将生成的通道文件 - testchannel.block从cli容器拷贝到宿主机- 1 
 2
 3
 4- 从客户端容器退出到宿主机 
 exit
 拷贝操作要在宿主机中进行
 docker cp cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/testchannel.block ./
7.4 部署 peer0.orgcpp 节点
7.4.1 准备工作
- 切换到 - peer0.orgcpp主机 -- 192.168.247.131
- 进入到工作目录 - 1 - cd ~/testwork 
- 远程拷贝文件 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12- 从主机192.168.247.141的zoro用户下拷贝目录crypto-config到当前目录下 
 scp -r zoro@192.168.247.141:/home/zoro/testwork/crypto-config ./
 链码拷贝
 scp -r zoro@192.168.247.141:/home/zoro/testwork/chaincode ./
 从主机192.168.247.141的zoro用户下拷贝文件testchannel.block到当前目录下
 scp zoro@192.168.247.141:/home/zoro/testwork/testchannel.block ./
 查看结果
 tree ./ -L 1
 ./
 ├── chaincode
 ├── crypto-config
 └── testchannel.block
- 为了方便操作可以将 - 通道块文件放入到客户端容器挂载的目录中- 1 
 2
 3
 4- 创建目录 
 mkdir channel-artifacts
 移动
 mv testchannel.block channel-artifacts/
7.4.2 编写配置文件
编写启动
peer0.orgcpp节点的配置文件docker-compose.yaml
| 1 | # docker-compose.yaml | 
注意: 该配置文件中已经将` ` 映射删掉了
7.4.3 启动当前节点
- 启动客户端容器 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10- docker-compose up -d 
 Creating network "testwork_default" with the default driver
 Creating peer0.orgcpp.test.com ... done
 Creating cli ... done
 查看启动情况
 docker-compose ps
 Name Command State Ports
 ------------------------------------------------------------------------------------------------
 cli /bin/bash Up
 peer0.orgcpp.test.com peer node start Up 0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp
7.4.4 对peer0.orgcpp节点的操作
- 进入到操作该节点的客户端中 - 1 - docker exec -it cli bash 
- 加入到通道中 - 1 - peer channel join -b ./channel-artifacts/testchannel.block 
- 安装链码 - 1 - peer chaincode install -n testcc -v 1.0 -l golang -p github.com/chaincode 
- 查询 - 1 
 2- peer chaincode query -C testchannel -n testcc -c '{"Args":["query","a"]}' 
 peer chaincode query -C testchannel -n testcc -c '{"Args":["query","b"]}'
- 交易 - 1 
 2
 3
 4
 5- 转账 
 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"]}'
7.5. 其余节点的部署
关于其余节点的部署, 在此不再过多赘述, 部署方式请参考 第 7.4节内容, 步骤是完全一样的
7.6. 链码的打包
我们在进行多机多节点部署的时候, 所有的peer节点都需要安装链码, 有时候会出现链码安装失败的问题, 提示链码的指纹(哈希)不匹配,我们可以通过以下方法解决
- 通过客户端在第1个peer节点中安装好链码之后, 将链码打包 - 1 
 2
 3
 4
 5- peer chaincode package -n testcc -p github.com/chaincode -v 1.0 mycc.1.0.out 
 -n: 链码的名字
 -p: 链码的路径
 -v: 链码的版本号
 -mycc.1.0.out: 打包之后生成的文件
- 将打包之后的链码从容器中拷贝出来 - 1 - docker cp cli:/xxxx/mycc.1.0.out ./ 
- 将得到的打包之后的链码文件拷贝到其他的peer节点上 
- 通过客户端在其他peer节点上安装链码 - 1 - peer chaincode install mycc.1.0.out