Hyperledger Fabric 1.0 快速搭建 -------- 多机部署 核心共识节点Orderer

前言

在这里我推荐两位大神的博客,可以参考或者直接跟着这两位大神学习,我是阅读这两位大神的博客和《深度探索区块链Hyperledger技术与应用》一书部署的

《深度探索区块链Hyperledger技术与应用》作者:张增骏、董宁、朱轩彤、陈剑雄  著。

深蓝大大:https://www.cnblogs.com/studyzy/category/1024666.html

Aberic大神:https://www.cnblogs.com/aberic/category/1148898.html

上一篇文章中我们配置并生成了区块链系统所需要的MSP证书和排序服务创世区块,这篇文章介绍如何配置核心共识节点并且部署,如果有不对的地方,请告诉我,一定改正。

下一篇:Hyperledger Fabric 1.0 快速搭建 -------- 多机部署 peer节点

开始

1.1简介

核心共识节点由Orderer、Kafka、Zookeeper组成,基于Zookeeper和Kafka的集群方案,启动顺序主要跟随依赖,先启动Zookeeper集群,随后启动Kafka集群,最后启动Orderer集群。在上一篇文章生成排序服务创世区块的配置文件中也具体配置了kafka,OrdererType: kafka。

使用kafka集群配置的原因也很简单,为orderer共识及排序服务提供足够的容错空间,当我们向peer节点提交Transaction的时候,peer节点会得到或返回(基于SDK)一个读写集结果,该结果会发送给orderer节点进行共识和排序,此时如果orderer节点突然down掉,致使请求服务失效而引发的数据丢失等问题,且目前的sdk对orderer发送的Transaction的回调会占用极长的时间,当大批量数据导入的时候该回调可认为不可用。

固此,在部署生产环境时,需要对orderer进行容错处理,而所谓的容错即搭建一个orderer节点集群,该集群会依赖于kafka和zookeeper

1.2配置host.yaml文件

在配置这三个文件之前,我们先配置一个host.yaml文件   以及要修改   /etc/hosts文件,这个在我们部署z、k、o的时候用的到,下面的IP地址是node1-node5的内网地址,要在每一个机器上修改。

[root@node1 /]# mkdir -p /u01/chainConfig/configfile/  //创建configfile存放我们配置文件

[root@node1 /]# cd /u01/chainConfig/configfile/    //进入这个文件夹下

[root@node1 configfile]# vi hosts.yaml   //创建host文件写入以下配置

version: '2'
services:
 myYwhHost:
    restart: always
    extra_hosts:
      - "orderer0.ywhExample.com:172.31.145.199"
      - "orderer1.ywhExample.com:172.31.145.200"
      - "orderer2.ywhExample.com:172.31.145.197"
      - "orderer3.ywhExample.com:172.31.145.196"
      - "orderer4.ywhExample.com:172.31.145.198"
 
      - "kafka1.ywhExample.com:172.31.145.199"
      - "kafka2.ywhExample.com:172.31.145.200"
      - "kafka3.ywhExample.com:172.31.145.197"
      - "kafka4.ywhExample.com:172.31.145.196"
      - "kafka5.ywhExample.com:172.31.145.198"
 
      - "zookeeper1.ywhExample.com:172.31.145.199"
      - "zookeeper2.ywhExample.com:172.31.145.200"
      - "zookeeper3.ywhExample.com:172.31.145.197"
      - "zookeeper4.ywhExample.com:172.31.145.196"
      - "zookeeper5.ywhExample.com:172.31.145.198"
 
      - "peer0.ywhOrg1.example.com:172.31.145.199"
      - "peer0.ywhOrg2.example.com:172.31.145.200"
      - "peer0.ywhOrg3.example.com:172.31.145.197"
      - "peer0.ywhOrg4.example.com:172.31.145.196"
      - "peer0.ywhOrg5.example.com:172.31.145.198"

//退出并保存

[root@node1 /]# vi /etc/hosts   //写入以下配置

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

172.31.145.199 zookeeper1.ywhExample.com
172.31.145.200 zookeeper2.ywhExample.com
172.31.145.197 zookeeper3.ywhExample.com
172.31.145.196 zookeeper4.ywhExample.com
172.31.145.198 zookeeper5.ywhExample.com

172.31.145.199 kafka1.ywhExample.com
172.31.145.200 kafka2.ywhExample.com
172.31.145.197 kafka3.ywhExample.com
172.31.145.196 kafka4.ywhExample.com
172.31.145.198 kafka5.ywhExample.com

172.31.145.199 orderer0.ywhExample.com
172.31.145.200 orderer1.ywhExample.com
172.31.145.197 orderer2.ywhExample.com
172.31.145.196 orderer3.ywhExample.com
172.31.145.198 orderer4.ywhExample.com

172.31.145.199 peer0.ywhOrg1.example.com
172.31.145.200 peer0.ywhOrg2.example.com
172.31.145.197 peer0.ywhOrg3.example.com
172.31.145.196 peer0.ywhOrg4.example.com
172.31.145.198 peer0.ywhOrg5.example.com

1.3Zokeeper

zookeeper选择3、5、7个节点都可以,选择奇数个节点可以选择避免脑裂,一个节点会存在单点问题,7个以上就太多了。

# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
# 
# ZooKeeper的基本运转流程:
# 1、选举Leader。
# 2、同步数据。
# 3、选举Leader过程中算法有很多,但要达到的选举标准是一致的。
# 4、Leader要具有最高的执行ID,类似root权限。
# 5、集群中大多数的机器得到响应并follow选出的Leader。
#
[root@node1 zookeeper]# mkdir -p /u01/chainConfig/configfile/zookeeper

[root@node1 zookeeper]# cd /u01/chainConfig/configfile/zookeeper

[root@node1 zookeeper]# vim zookeeper1.yaml

version: '2'

services:
  zooleeper1:
    image: hyperledger/fabric-zookeeper:x86_64-1.0.1 //启动镜像的版本
    extends:
      file: ../hosts.yaml  //host配置文件
      service: myYwhHost   //host配置文件中的名字
    ports:
      - 2181:2181      //zookeeper中三个端口   1、2181:对cline端提供服务   2、13888:选举leader使用    3、12888:集群内机器通讯使用(Leader监听此端口)(在不被占用的前提下可以改变)
      - 12888:12888
      - 13888:13888
    environment:       //相当于环境变量
      - ZOO_MY_ID=1    //每一个zookeeper的id,(这里每一个zookeeper是不一样的)
      //下面这句,在哪个zookeeper配置文件中,那个就是0.0.0.0:12888:13888 
      //例如在zookeeper2.yaml文件中:- ZOO_SERVERS=server.1=zookeeper1.ywhExample.com:12888:13888 server.2=0.0.0.0:12888:13888 server.3=zookeeper3.ywhExample.com:12888:13888 server.4=zookeeper4.ywhExample.com:12888:13888 server.5=zookeeper5.ywhExample.com:12888:13888
      - ZOO_SERVERS=server.1=0.0.0.0:12888:13888 server.2=zookeeper2.ywhExample.com:12888:13888 server.3=zookeeper3.ywhExample.com:12888:13888 server.4=zookeeper4.ywhExample.com:12888:13888 server.5=zookeeper5.ywhExample.com:12888:13888
    volumes:      //映射的文件地址,:右侧是内部使用的路径,:左侧是宿主机上的文件路径
      - /u01/zookeeper/data:/data
      - /u01/zookeeper/datalog:/datalog

配置好zookeeper.yaml文件以后部署zookeeper,创建映射的文件路径以及使用zookeeper.yaml文件部署

[root@node1 ~]# mkdir -p /u01/zookeeper/data

[root@node1 ~]# mkdir -p /u01/zookeeper/datalog

[root@node1 ~]# cd /u01/chainConfig/configfile

[root@node1 configfile]# docker-compose -f zookeeper/zookeeper1.yaml up -d

//在五个共识节点上相同的路径下全部配置好以后启动,可以在一台机器上配置好发送到其他机器上

在启动Zookeeper以后,一定要确认一下日志信息,是否五个Zookeeper可以通信,查看日志命令为:docker -logs -f 【容器名字】 ,可以把五个Zookeeper的日志全部打开,然后停掉一个zookeeper,停掉容器的命令为:docker stop 【容器id】,看其他zookeeper是否有反应,如果没有反应就是没有通讯,要查看一下错误信息。

1.4Kafka

Kafka最少需要4个节点,才可以在一个节点宕机以后还能继续提交交易和排序,并且创建新的通道。在上一篇的文章中的configtx.yaml文件中设置了Orderer.OredererType设置为Kafka,以及其他的配置

创建Kafka配置文件路径以及Kafka.yaml文件

[root@node1 ~]# mkdir -p /u01/chainConfig/configfile/kafka

[root@node1 ~]# cd /u01/chainConfig/configfile/kafka

[root@node1 ~]# cd /u01/chainConfig/configfile/kafka

[root@node1 ~]# vi kafka.yaml

#copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#

version: '2'

services:
  kafka:
    image: hyperledger/fabric-kafka:x86_64-1.0.1
    extends:
      file:  ../hosts.yaml
      service: myYwhHost
    ports:
      - 9092:9092
    environment:
      - KAFKA_MESSAGE_MAX_BYTES=103809024 # 99 * 1024 * 1024 B   //message.max.bytes 代表提交给kafka节点消息的最大字节数,需要满足Orderer.AbsoluteMaxBytes < message.max.bytes,否则会导致消息提交失败,Orderer.AbsoluteMaxBytes是在配置configtx.yaml中设置的区块最大字节数
      - KAFKA_REPLICA_FETCH_MAX_BYTES=103809024 # 99 * 1024 * 1024 B   //replica.fatech.max.bytes代表从kafka节点中获取消息的最大字节数,需要满足message.max.bytes <=replica.fatech.max.bytes,否则会数据复制同步失败 
      - KAFKA_UNCLEAN_LEADER_ELECTION_ENABLE=false //表示是否允许不在副本同步集合中的节点选举为主节点,主节点负责消息的读写
      - KAFKA_BROKER_ID=${kafkanum} //环境变量 总共五个 从1-5
      - KAFKA_MIN_INSYNC_REPLICAS=2 //  这个拿m表示    代表最小可写入副本数的个数,大于最小值,一个消息才被确认写入成功,可考虑的最小值为2,不过写1应该也可以  
      - KAFKA_DEFAULT_REPLICATION_FACTOR=3  // 这个拿n表示   代表创建主题时保存的副本数,也是新消息提交同步的节点数,即创建新通道时需要至少n个节点同步完成数据才能创建成功  需要满足1 < m < n < k(kakfa的个数),这个可以考虑的数就是3   所以kafka的个数最少是4个

      - KAFKA_ZOOKEEPER_CONNECT=zookeeper1.ywhExample.com:2181,zookeeper2.ywhExample.com:2181,zookeeper3.ywhExample.com:2181,zookeeper4.ywhExample.com:2181,zookeeper5.ywhExample.com:2181
      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka${kafkanum}.ywhExample.com:9092
      - KAFKA_ADVERTISED_JDHSTAR-DOCKER01=kafka${kafkanum}.ywhExample.com
    volumes:   //映射文件
      - /u01/kafka:/tmp

配置好Kafka文件以后,创建映射文件并部署kafka

[root@node1 ~]# mkdir -p /u01/kafka

[root@node1 ~]# export kafkanum=1  // 从1-5 设置环境变量,这个命令设置的环境变量只在当前页面有效,如果在xshell中把你这台机器的标签页关闭掉在打开的时候需要重新设置。

[root@node1 ~]# docker-compose -f /u01/chainConfig/configfile/kafka/kafka.yaml up -d

//在一台机器上把5个kafka的配置文件都配置好以后发送个每一给机器按照以上步骤在相同的路径下部署kafka

1.5Orderer

[root@node1 ~]# mkdir -p /u01/chainConfig/configfile/orderer

[root@node1 ~]# cd /u01/chainConfig/configfile/orderer

[root@node1 orderer]# vi orderer.yaml

#copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0

version: '2'

services:

  orderer.testchain.club:
    container_name: order
    image: hyperledger/fabric-orderer:x86_64-1.0.1
    extends:
      file:  ../hosts.yaml
      service: myYwhHost
    environment:
      - ORDERER_GENERAL_LOGLEVEL=info
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_GENESISMETHOD=file
      - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/genesis.block
      - ORDERER_GENERAL_LOCALMSPID=OrdererMSP
      - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
      # enabled TLS
      - ORDERER_GENERAL_TLS_ENABLED=true
      - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
      - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
      - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
      # kafka config
      - GRPC_TRACE=all=true
      - GRPC_VERBOSITY=debug
      - CONFIGTX_ORDERER_ORDERERTYPE=kafka
      - CONFIGTX_ORDERER_KAFKA_BROKERS=[kafka1.ywhExample.com:9092,kafka2.ywhExample.com:9092,kafka3.ywhExample.com:9092,kafka4.ywhExample.com:9092,kafka5.ywhExample.com:9092]
      - ORDERER_KAFKA_RETRY_SHORTINTERVAL=1s
      - ORDERER_KAFAK_RETRY_SHORTTOTAL=30s
      - ORDERER_KAFKA_VERBOSE=true

    working_dir: /opt/gopath/src/github.com/hyperledger/fabric
    command: orderer
    volumes:
    - /u01/chainConfig/channel-artifacts/:/var/hyperledger/orderer/
    - /u01/chainConfig/crypto-config/ordererOrganizations/ywhExample.com/orderers/${orderernum}.ywhExample.com/msp:/var/hyperledger/orderer/msp
    - /u01/chainConfig/crypto-config/ordererOrganizations/ywhExample.com/orderers/${orderernum}.ywhExample.com/tls/:/var/hyperledger/orderer/tls
    - /u01/data/orderer/${orderernum}/:/var/hyperledger/
    ports:
      - 7050:7050

配置好orderer.yaml文件以后,创建映射文件目录和部署orderer

[root@node1 ~]# export orderernum=orderer0 //设置环境变量,每一台机器上这个环境变量都不一样,注意一下,从0-4

[root@node1 ~]# mkdir -p /u01/data/orderer/${orderernum}

[root@node1 ~]# docker-compose -f /u01/chainConfig/configfile/orderer/orderer.yaml up -d

//在一台机器上把5个orderer.yaml文件配置好以后,发送到每一个机器上部署 

把这三个都启动以后可以在某一台机器上通过  docker  ps  命令查看启动的容器

[root@node1 ~]# docker ps
CONTAINER ID        IMAGE                                       COMMAND                  CREATED             STATUS              PORTS                                                                                            NAMES
721a15534ad2        hyperledger/fabric-orderer:x86_64-1.0.1     "orderer"                8 days ago          Up 8 days           0.0.0.0:7050->7050/tcp                                                                           order
6b393d78f9ee        hyperledger/fabric-kafka:x86_64-1.0.1       "/docker-entrypoint.…"   8 days ago          Up 8 days           0.0.0.0:9092->9092/tcp, 9093/tcp                                                                 kafka_kafka_1
68def5411279        hyperledger/fabric-zookeeper:x86_64-1.0.1   "/docker-entrypoint.…"   8 days ago          Up 8 days           2888/tcp, 0.0.0.0:2181->2181/tcp, 0.0.0.0:12888->12888/tcp, 0.0.0.0:13888->13888/tcp, 3888/tcp   zookeeper_zooleeper1_1
[root@node1 ~]# 可以通过  docker  logs -f 6b393d78f9ee(容器id) 查看日志,如果日志有错误代表没有通信成功,根据具体的错误信息更改配置并重新部署

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值