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
10docker-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
3peer 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
2peer 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
10docker-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
2peer 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
5peer 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