Hyperledger Fabric 1.0 多机部署 4Peer+1Orderer架构

最近正在研究Fabric,闲暇时间记录一下搭建过程。

1.环境准

我们要部署4Peer+1Orderer架构,也是官方文档e2e_cli架构,那么就先准备5台虚拟机,保证五台网络畅通。


分别在每一台服务器上安装以下环境,我这里是安装了一台然后克隆出来的另外4台虚拟机。

下面以172.168.1.131为例。

1.1 关闭防火墙

这里为了方便直接采用了关闭防火墙的方式,小伙伴可以根据需要来开启端口。

我这里用的是CentOS7.4,防火墙用的是firewalld

关闭防火墙# systemctl stop firewalld
查看状态 # systemctl status firewalld
running 状态即防火墙已经开启
dead    状态即防火墙未开启

1.2 配置hosts

目的有两个,一个是github加速,一个是五台域名互相访问。

# vim /etc/hosts

增加以下配置

151.101.72.249 github.global.ssl.fastly.net
192.30.253.112 github.com

172.168.1.131 orderer.example.com
172.168.1.132 peer0.org1.example.com
172.168.1.133 peer1.org1.example.com
172.168.1.134 peer0.org2.example.com
172.168.1.135 peer1.org2.example.com

1.3 Go 安装

国外服务器下载非常慢,我们去Golang中国手动下载,然后上传至Linux。

我选择的当前最新版本go1.9.2.linux-amd64.tar.gz,大家可以根据系统选择性下载。

解压至/usr/local目录

tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz

配置环境变量

vim /etc/profile
增加以下配置
export PATH=$PATH:/usr/local/go/bin
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$HOME/go/bin
修改保存成功后
source profile
查看go版本
go version

1.4 Docker 安装

清理服务器上的docker

sudo yum remove docker \ 
                               docker-common \ 
                               docker-selinux \ 
                               docker-engine

安装

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

sudo yum-config-manager \
                --add-repo \
                https://download.docker.com/linux/centos/docker-ce.repo

sudo yum-config-manager --enable docker-ce-edge

sudo yum-config-manager --enable docker-ce-test

sudo yum-config-manager --disable docker-ce-edge

sudo yum makecache fast

sudo yum install docker-ce

查看版本,判断是否安装成功

docker --version

docker启动

service docker start

docker开机自启动:

chkconfig docker on

1.5 Docker Compose 安装

安装最新版Docker Compose ,目前最新版本是1.21.2

curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-composechmod +x /usr/local/bin/docker-compose

查看版本

docker-compose --version

如果出现:No such file or director,则需要以下操作

cp /usr/local/bin/docker-compose /usr/bin

复习一下docker常用指令

杀死所有正在运行的容器
docker rm -f $(docker ps -aq)

删除所有已经停止的容器
docker rm $(docker ps -a -q)

删除所有镜像
docker rmi $(docker images -q)

强制删除所有镜像
docker rmi -f $(docker images -q)

打开/关闭/重启docker服务:
service docker start
service docker stop
service docker restart

1.6 Fabric源码下载

如果1.1配置成功,且生效的话,这时候访问github下载已经很快了,可以使用以下指令下载。

或者使用我已经下载好的fabric-release-1.0.zip

go get github.com/hyperledger/fabric

这可能需要一段时间。

下载完成后执行以下指令,将版本切换至1.0.0

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

1.7 Fabric Docker 镜像下载

官方提供了批量下载脚本,很简单,不过包大概加起来有10G

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

2.单机运行官方e2e_cli

./network_setup.sh up

执行上述命令,可以自动在本机搭建4+1,并且运行官方Example02的chainCode进行转账操作。

看到出现END-E2E 则是运行成功。

如果在此时出现任何问题,应该是环境没有配对。

接下来关闭此单机网络。

./network_setup.sh down

3. 多机部署

接下来要紧了,跟紧每一步操作。

在172.168.1.131服务器(也就是上方一直用的这台)

3.1 生成公私钥 创始区块 证书 等

./generateArtifacts.sh mychannel

系统会创建channel-artifacts文件夹,里面包含了mychannel这个通道相关的文件,

另外还有一个crypto-config文件夹,里面包含了各个节点的公私钥和证书的信息

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

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

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

e2e_cli中提供了多个yaml文件,我们可以基于docker-compose-cli.yaml文件创建:
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:172.168.1.131"
同样,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:172.168.1.131" 
   - "peer0.org1.example.com:172.168.1.132" 
   - "peer1.org1.example.com:172.168.1.133" 
   - "peer0.org2.example.com:172.168.1.134" 
   - "peer1.org2.example.com:172.168.1.135"
在单击模式下,4个peer会映射主机不同的端口,但是我们在多机部署的时候是不需要映射不同端口的,所以需要修改base/docker-compose-base.yaml文件,将所有peer的端口映射都改为相同的:
ports: 
  - 7051:7051 
  - 7052:7052 
  - 7053:7053

3.4 分发配置文件


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

我先登录peer0.org1.example.com(172.168.1.132),将本地的e2e_cli文件夹删除:
rm e2e_cli –R

然后再登录到orderer服务器上,退回到examples文件夹,因为这样可以方便的把其下的e2e_cli文件夹整个传到peer0服务器上。
scp -r e2e_cli root@172.168.1.132:/root/go/src/github.com/hyperledger/fabric/examples/
我们在前面配置的就是peer0.org1.example.com(172.168.1.132)上的节点,所以复制过来后不需要做任何修改。

再次运行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:172.168.1.131" 
     - "peer0.org1.example.com:172.168.1.132"

  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:172.168.1.131" 
     - "peer0.org1.example.com:172.168.1.132" 
     - "peer1.org1.example.com:172.168.1.133" 
     - "peer0.org2.example.com:172.168.1.134" 
     - "peer1.org2.example.com:172.168.1.135"
接下来继续使用scp命令将orderer上的文件夹传送给peer0.org2.example.com和peer1.org2.example.com,然后也是修改一下docker-compose-peer.yaml文件,使得其启动对应的peer节点。

什么?从3.2 - 3.4 你压根没看明白?没关系,我这里准备好了配置文件,你只需要修改自己的IP然后放到对应的服务器即可。

4. 启动Fabric网络

4.1 启动orderer

切换到Orderer(172.168.1.131)服务器,执行

docker-compose -f docker-compose-orderer.yaml up -d
查看容器,有一个orderer服务即启动成功。
docker ps


4.2 启动peer

切换到每一个peer,分别执行以下指令,启动peer节点和cli

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

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



4.3 创建Channel并测试ChainCode

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

docker exec -it cli bash

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

root@69f17bccdb88:/opt/gopath/src/github.com/hyperledger/fabric/peer#

说明我们已经以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会创建一个容器:


5. 总结

其实官方给的脚本为我们做了很多事情,只要我们网络畅通,4+1部署还是很简单的。

接下来,还会写一个关于blockchain-explorer的搭建过程。

大家有什么问题可以留言,我看到了都会回复的。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值