fabric-示例集群化操作

介绍fabric示例中的集群化操作

fabric给出的cc样例都是跑在docker-compose上,这里介绍利用已有的docker-compose.yaml如何集群化运行。

准备样例CC

以官方fabric-samples项目里的balance-transfer为例,准备拆分运行在4个虚机里。

git clone https://github.com/hyperledger/fabric-samples.git
cd fabric-samples/balance-transfer

本CC的示例,主要由3个部分组成:

  • 2 CAs
  • 1 SOLO orderer
  • 4 peers (2 peers per Org)

其中artifacts目录里放置了:

  • cryptogen 工具生成的证书信息,后面运行时需要挂载到各自的peer节点里
  • configtxgen 工具生成的初始块 genesis.block 和 channel配置信息mychannell.tx

准备集群

根据上面的情况,下面准备四个虚机来集群化操作, 虚机规划信息如下:

  • air13, 192.168.10.78, 运行ca1,ca2, 这是我的本机
  • node0, 192.168.10.110, 运行orderer
  • node1, 192.168.10.114, 运行org1的peer0、peer1
  • node2, 192.168.10.115, 运行org2的peer0、peer1

每个虚机都预先安装docker和docker-compose

修改artifacts/docker-compose.yaml文件,在每个service下添加如下信息:

    extra_hosts:
      - "ca.org1.example.com:192.168.10.78"
      - "ca.org2.example.com:192.168.10.78"
      - "orderer.example.com:192.168.10.110"
      - "peer0.org1.example.com:192.168.10.114"
      - "peer1.org1.example.com:192.168.10.114"
      - "peer0.org2.example.com:192.168.10.115"
      - "peer1.org2.example.com:192.168.10.115"

此举的作用是在每个容器的/etc/hosts文件里,添加上面的映射,最终docker-compose.yaml文件放置gist上了.

最后一步,因为此CC样例运行时,需要挂载本地目录里一些提前生成好的证书,我们还需要把这么需要挂载的东西,同步到每个虚机里,如下操作:

rsync -az balance-transfer root@192.168.10.110:~/
rsync -az balance-transfer root@192.168.10.114:~/
rsync -az balance-transfer root@192.168.10.115:~/

集群化运行

ssh进入虚机,按照规划启动各自的服务

# 进入air13虚机
cd balance-transfer/artifacts/
docker-compose up --no-deps ca.org1.example.com ca.org2.example.com

# ssh进入node0虚机
cd balance-transfer/artifacts/
docker-compose up --no-deps orderer.example.com

# ssh进入node1虚机
cd balance-transfer/artifacts/
docker-compose up --no-deps peer0.org1.example.com peer1.org1.example.com

# ssh进入node2虚机
cd balance-transfer/artifacts/
docker-compose up --no-deps peer0.org2.example.com peer1.org2.example.com

如上fabric的区块链网络已经集群化运行了

运行APP并测试CC

在虚机air13上运行我们的前端APP,并测试在网络集群化后的的CC,

此外由于此APP样例的特殊性,还需要修改其他的地方

  • config.json文件里的orderer地址改为"grpcs://192.168.10.110:7050"
  • app/network-config.json里指定地址的地方需要改成这样

进入balance-transfer目录,如下执行:

$ npm isntall
$ PORT=4000 node app

这样前端APP就运行起来了,接下来利用测试脚本testAPIs.sh测试下我们的CC,运行前,还需要修改下脚本里的peer地址,修改后的文件在这里

运行脚本:

./testAPIs.sh
POST request Enroll on Org1  ...

{"success":true,"secret":"DbzvtdmATgve","message":"Jim2 enrolled Successfully","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MDE4NzQ5MjUsInVzZXJuYW1lIjoiSmltMiIsIm9yZ05hbWUiOiJvcmcxIiwiaWF0IjoxNTAxODM4OTI1fQ.LUmfEstviquaD5k5oBMd9KUFaKF1s6ZMY8iO67dKiH0"}

。
。
。

GET query Installed chaincodes

["name: mycc, version: v0, path: github.com/example_cc"]

GET query Instantiated chaincodes

["name: mycc, version: v0, path: github.com/example_cc"]

GET query Channels

{"channels":[{"channel_id":"mychannel"}]}

Total execution time : 13 secs ...

本样例修改后的完整地址在这里

总结

目前集群化后网络里的peers ledger和orderer的数据还是存储在容器里,是否要考虑挂载出来,不然容器挂了再启动后,数据是否会乱了,后续研究下。

后续还会继续搞下CA,MSP和动态添加节点以及合约迭代升级等问题。