【干货干货】Hyperledger Fabric 之 单机及多级环境部署安装

 

1,VirtualBox虚拟机环境安装

由于公司没有安装Ubuntu系统,所以我这里使用VirtualBox虚拟机。

 

这里不提供VirtualBox虚拟机具体安装说明。

 

2,Ubuntu16.04.2 X64 Server 安装

版本ubuntu-16.04.4-server-amd64.iso下载url:

https://www.ubuntu.com/download/server/thank-you?country=CN&version=16.04.4&architecture=amd64

在安装完Ubuntu后,需要保证apt source是国内的,不然如果是国外的话会很慢很慢的。具体做法是

sudo vi /etc/apt/sources.list

打开这个apt源列表,如果其中看到是http://us.xxxxxx之类的,那么就是外国的,如果看到是http://cn.xxxxx之类的,那么就不用换的。我的是美国的源,所以需要做一下批量的替换。在命令模式下,输入:

:%s/us./cn./g

就可以把所有的us.改为cn.了。然后输入:wq即可保存退出。

sudo apt-get update

更新一下源。

然后安装ssh,这样接下来就可以用putty或者SecureCRT之类的客户端远程连接Ubuntu了。

sudo apt-get install ssh

3,GOLang 安装

3.1,golang版本下载:https://www.golangtc.com/download  选择go1.9.2.linux-amd64.tar.gz下载

 

将下载好的压缩包上传到服务器自定义目录:/ root/zjlubuntu

执行一下命令,解压压缩包

sudo tar -C /usr/local -xzf go1.9.2linux-amd64.tar.gz
【注意:不要使用apt方式安装go,apt的go版本太低了!】

3.2接下来编辑当前用户的环境变量:

vi ~/.profile

添加以下内容:

export PATH=$PATH:/usr/local/go/bin

export GOROOT=/usr/local/go

export GOPATH=$HOME/go

export PATH=$PATH:$HOME/go/bin

3.3编辑保存并退出vi后,记得把这些环境载入:

source ~/.profile

3.4我们把go的目录GOPATH设置为当前用户的文件夹下,所以记得创建go文件夹

cd ~

mkdir go

4,Docker 安装

一种方案(我的机器没有连上安装成功,我这里使用了方案二):

我们可以使用阿里提供的镜像,安装也非常方便。通过以下命令来安装Docker

curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -

安装完成后需要修改当前用户(我使用的用户叫fabric)权限:

sudo usermod -aG docker fabric

注销并重新登录,然后添加阿里云的Docker Hub镜像:

不同的版本添加方法是不一样的,官方的文档如下:

https://cr.console.aliyun.com/#/accelerator

当然觉得阿里云镜像不好用,喜欢用DaoClound的也可以用DaoClound的镜像。

 

二种方案:

apt install docker.io

 

5,Docker-Compose的安装

一种方案(我的机器没有连上安装成功,我这里使用了方案二):

Docker-compose是支持通过模板脚本批量创建Docker容器的一个组件。在安装Docker-Compose之前,需要安装Python-pip,运行脚本:

sudo apt-get install python-pip

安装完成后,接下来从DaoClound安装Docker-compose,运行脚本:

curl -L https://get.daocloud.io/docker/compose/releases/download/1.10.1/docker-compose-`uname -s`-`uname -m` > ~/docker-compose 
sudo mv ~/docker-compose /usr/local/bin/docker-compose 
chmod +x /usr/local/bin/docker-compose

 

二种方案:

apt install docker-compose

6,Fabirc 源码下载

我们可以使用Git命令下载源码,也可以使用go get命令,偷懒一点,我们直接用go get命令获取最新的Fabric源码:
go get github.com/hyperledger/fabric

这个可能等的时间比较久,等完成后,我们可以在~/go/src/github.com/hyperledger/fabric中找到所有的最新的源代码。

由于Fabric一直在更新,所有我们并不需要最新最新的源码,需要切换到v1.0.0版本的源码即可:

cd ~/go/src/github.com/hyperledger/fabric
git checkout v1.0.0

7,Fabric Docker 镜像的下载

这个其实很简单,因为我们已经设置了Docker Hub镜像地址,所以下载也会很快。官方文件也提供了批量下载的脚本。我们直接运行:

cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli/
source download-dockerimages.sh -c x86_64-1.0.0 -f x86_64-1.0.0

这样就可以下载所有需要的Fabric Docker镜像了。由于我们设置了国内的镜像,所以下载应该是比较快的。

下载完毕后,我们运行以下命令检查下载的镜像列表:

docker images

得到的结果如下:

 

8,单机/多机部署

8.1 单机部署

我们仍然停留在e2e_cli文件夹,这里提供了启动、关闭Fabric网络的自动化脚本。我们要启动Fabric网络,并自动运行Example02 ChainCode的测试,执行一个命令:

./network_setup.sh up

这个做了以下操作:

1编译生成Fabric公私钥、证书的程序,程序在目录:fabric/release/linux-amd64/bin

2基于configtx.yaml生成创世区块和通道相关信息,并保存在channel-artifacts文件夹。

3基于crypto-config.yaml生成公私钥和证书信息,并保存在crypto-config文件夹中。

4基于docker-compose-cli.yaml启动1Orderer+4Peer+1CLI的Fabric容器。

5在CLI启动的时候,会运行scripts/script.sh文件,这个脚本文件包含了创建Channel,加入Channel,安装Example02,运行Example02等功能。

最后运行完毕,我们可以看到这样的界面:

 

如果您看到这个界面,这说明我们整个Fabric网络已经通了。

8.1.1手动测试一下Fabric网络

我们仍然是以现在安装好的Example02为例,在官方例子中,channel名字是mychannel,链码的名字是mycc。我们首先进入CLI,我们重新打开一个命令行窗口,输入:

docker exec -it cli bash

运行以下命令可以查询a账户的余额:

peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

可以看到余额是90:

 

然后,我们试一试把a账户的余额再转20元给b账户,运行命令:

peer chaincode invoke -o orderer.example.com:7050  --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem  -C mychannel -n mycc -c '{"Args":["invoke","a","b","20"]}'

运行结果为:

 

现在转账完毕, 我们试一试再查询一下a账户的余额,没问题的话,应该是只剩下70了。我们看看实际情况:

执行peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

 

果然,一切正常。最后我们要关闭Fabric网络,首先需要运行exit命令退出cli容器。关闭Fabric的命令与启动类似,命令为:

cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli
./network_setup.sh down

现在我们整个Fabric的环境已经测试完毕。一切正常

8.2 多机部署

做完单机验证后,没有问题。那么我们就可以基于这个基础上进行进一步的多机部署。

在Fabric的源码中,提供了单机部署4Peer+1Orderer的示例,在Example/e2e_cli文件夹中。我们可以在其中一台机器上运行单机的Fabric实例,确认无误后,在该机器上,生成公私钥,修改该机器中的Docker-compose配置文件,然后把这些文件分发给另外4台机器。我们就以orderer.example.com这台机器为例

准备另外四台机器,名称和ip需要对应,并将单机测试成功的系统,复制四台机器。以下为机器的名称和ip。

orderer.example.com

10.46.178.221

peer0.org1.example.com

10.46.178.222

peer1.org1.example.com

10.46.178.223

peer0.org2.example.com

10.46.178.224

peer1.org2.example.com

10.46.178.225

 

 

修改主机名称

例:sysctl kernel.hostname= orderer.example.com

8.2.1生成公私钥、证书、创世区块等

公私钥和证书是用于Server和Server之间的安全通信,另外要创建Channel并让其他节点加入Channel就需要创世区块,这些必备文件都可以一个命令生成,官方已经给出了脚本:

./generateArtifacts.sh mychannel

运行这个命令后,系统会创建channel-artifacts文件夹,里面包含了mychannel这个通道相关的文件,另外还有一个crypto-config文件夹,里面包含了各个节点的公私钥和证书的信息

8.2.2设置peer节点的docker-compose文件

e2e_cli中提供了多个yaml文件,我们可以基于docker-compose-cli.yaml文件创建:

cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli/
cp docker-compose-cli.yaml docker-compose-peer.yaml

然后修改docker-compose-peer.yaml,去掉orderer的配置,只保留一个peer和cli,因为我们要多级部署,节点与节点之前又是通过主机名通讯,所以需要修改容器中的host文件,也就是extra_hosts设置,修改后的peer配置如下:

peer0.org1.example.com:

  container_name: peer0.org1.example.com

  extends:

    file:  base/docker-compose-base.yaml

    service: peer0.org1.example.com

  extra_hosts:

   - "orderer.example.com:10.46.178.221"

同样,cli也需要能够和各个节点通讯,所以cli下面也需要添加extra_hosts设置,去掉无效的依赖,并且去掉command这一行,因为我们是每个peer都会有个对应的客户端,也就是cli,所以我只需要去手动执行一次命令,而不是自动运行。修改后的cli配置如下:

cli: 
  container_name: cli 
  image: hyperledger/fabric-tools 
  tty: true 
  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=true 
    - 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 
  volumes: 
      - /var/run/:/host/var/run/ 
      - ../chaincode/go/:/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go 
      - ./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 
  depends_on: 
    - peer0.org1.example.com 
  extra_hosts: 
   - "orderer.example.com:10.46.178.221" 
   - "peer0.org1.example.com:10.46.178.222" 
   - "peer1.org1.example.com:10.46.178.223" 
   - "peer0.org2.example.com:10.46.178.224" 
   - "peer1.org2.example.com:10.46.178.225"

 

 

在单击模式下,4个peer会映射主机不同的端口,但是我们在多机部署的时候是不需要映射不同端口的,所以需要修改base/docker-compose-base.yaml文件,将所有peer的端口映射都改为相同的:

ports: 
  - 7051:7051 
  - 7052:7052 
  - 7053:7053

 

 

8.2.3设置orderer节点的docker-compose文件

与创建peer的配置文件类似,我们也复制一个yaml文件出来进行修改:

cp docker-compose-cli.yaml docker-compose-orderer.yaml

orderer服务器上我们只需要保留order设置,其他peer和cli设置都可以删除。orderer可以不设置extra_hosts。

8.2.4分发配置文件

前面几步的操作,我们都是在orderer.example.com上完成的,接下来我们需要将这些文件分发到另外4台服务器上。Linux之间的文件传输,我们可以使用scp命令。

我门先分别登录peer0.org1.example.com、peer1.org1.example.com、peer0.org2.example.com、peer1.org2.example.com,将本地的e2e_cli文件夹删除:

rm e2e_cli –R

然后再登录到orderer.example.com服务器上,退回到examples文件夹,因为这样可以方便的把其下的e2e_cli文件夹整个传到其他四台peer服务器上。

scp -r e2e_cli root@10.46.178.222:/home/fabric/go/src/github.com/hyperledger/fabric/examples/

我们在前面配置的就是peer0.org1.example.com上的节点,所以复制过来后不需要做任何修改。

 

再次运行scp命令,复制到peer1.org1.example.com上,然后我们需要对docker-compose-peer.yaml做一个小小的修改,将启动的容器改为peer1.org1.example.com,并且添加peer0.org1.example.com的IP映射,对应的cli中也改成对peer1.org1.example.com的依赖。这是修改后的peer1.org1.example.com上的配置文件:

version: '2'
 
services:
 
  peer1.org1.example.com: 
    container_name: peer1.org1.example.com 
    extends: 
      file:  base/docker-compose-base.yaml 
      service: peer1.org1.example.com 
    extra_hosts: 
     - "orderer.example.com:10.46.178.221" 
     - "peer0.org1.example.com:10.46.178.222"
 
  cli: 
    container_name: cli 
    image: hyperledger/fabric-tools 
    tty: true 
    environment: 
      - GOPATH=/opt/gopath 
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock 
      - CORE_LOGGING_LEVEL=DEBUG 
      - CORE_PEER_ID=cli 
      - CORE_PEER_ADDRESS=peer1.org1.example.com:7051 
      - CORE_PEER_LOCALMSPID=Org1MSP 
      - CORE_PEER_TLS_ENABLED=true 
      - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer1.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/peer1.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/peer1.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 
    volumes: 
        - /var/run/:/host/var/run/ 
        - ../chaincode/go/:/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go 
         - ./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 
    depends_on: 
      - peer1.org1.example.com 
    extra_hosts: 
     - "orderer.example.com:10.46.178.221" 
     - "peer0.org1.example.com:10.46.178.222" 
     - "peer1.org1.example.com:10.46.178.223" 
     - "peer0.org2.example.com:10.46.178.224" 
     - "peer1.org2.example.com:10.46.178.225"

 

 

上述红色标记的字体,都是需要注意修改的。以及修改后一地要注意文本格式。否则会有问题。

 

接下来继续使用scp命令将orderer上的文件夹传送给peer0.org2.example.com和peer1.org2.example.com,然后也是修改一下docker-compose-peer.yaml文件,使得其启动对应的peer节点。

8.3.启动Fabric

现在所有文件都已经准备完毕,我们可以启动我们的Fabric网络了。

8.3.1启动orderer

让我们首先来启动orderer节点,在orderer服务器上运行:

docker-compose -f docker-compose-orderer.yaml up -d

 

运行完毕后我们可以使用docker ps看到运行了一个名字为orderer.example.com的节点。

8.3.2启动peer

然后我们切换到peer0.org1.example.com服务器,启动本服务器的peer节点和cli,命令为:

docker-compose -f docker-compose-peer.yaml up -d

 

运行完毕后我们使用docker ps应该可以看到2个正在运行的容器。

 

接下来依次在另外3台服务器运行启动peer节点容器的命令:

docker-compose -f docker-compose-peer.yaml up -d

现在我们整个Fabric4+1服务器网络已经成型,接下来是创建channel和运行ChainCode。

8.3.3创建Channel测试ChainCode

我们切换到peer0.org1.example.com服务器上,使用该服务器上的cli来运行创建Channel和运行ChainCode的操作。首先进入cli容器:

docker exec -it cli bash

进入容器后我们可以看到命令提示变为:

 

说明我们已经以root的身份进入到cli容器内部。官方已经提供了完整的创建Channel和测试ChainCode的脚本,并且已经映射到cli容器内部,所以我们只需要在cli内运行如下命令:

./scripts/script.sh mychannel

那么该脚本就可以一步一步的完成创建通道,将其他节点加入通道,更新锚节点,创建ChainCode,初始化账户,查询,转账,再次查询等链上代码的各个操作都可以自动化实现。直到最后,系统提示:

 

 

说明我们的4+1的Fabric多级部署成功了。我们现在是在peer0.org1.example.com的cli容器内,我们也可以切换到peer0.org2.example.com服务器,运行docker ps命令,可以看到本来是2个容器的,现在已经变成了3个容器,因为ChainCode会创建一个容器:

 

验证:

1, 查询a账户的金额

peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

 

2,查询b账户的金额

peer chaincode query -C mychannel -n mycc -c '{"Args":["query","b"]}'

 

3,转账试试

peer chaincode invoke -o orderer.example.com:7050  --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem  -C mychannel -n mycc -c '{"Args":["invoke","b","a","50"]}'

 

 

在查询一下a,b的账户金额看看

Ok,数据转账一切正常。导出fabri多级部署正常。

9,安装过程遇到的问题

9.1 启动order服务时候异常

这个问题是因为docker-compose -f docker-compose-orderer.yaml up –d中的“–d”输入不正确,应该为英文输入状态下的“-d”.需要仔细发现才能发现’-’是不一样的

9.2 Must be a mapping not an array

 

 

这个是因为编辑文件的格式不正确,可以将服务器文件拉去到本地,进行修改后在上传

10 备注

安装参考资料:http://www.cnblogs.com/studyzy/p/7237287.html      

 

posted @ 2018-05-08 10:59  慕斯~long  阅读(489)  评论(0)    收藏  举报