目前fabric1.0将广播服务从peer节点中分离出来,形成orderer节点,orderer节点提供原子通信保证(Atomic Communication Guarantee),也叫做有序广播(total-order broadcast)、原子广播(atomic broadcast), 共识(consensus)。即将peer节点发送过来的交易进行排序、打包为区块,然后将区块广播各个组织的peer节点。
fabric-1.0的orderer提供solo、kafka和bft三种模式,分别可以认为是中心化、半中心化和去中心化。其中solo模式指整个fabric网络依赖于一个orderer节点,而kafka模式依赖于一个kafka集群,bft模式则是去中心化的orderer集群,但目前bft模式并没有在fabric-1.0中实现。
本文则介绍fabric-1.0的kafka模式搭建。fabric-1.0环境配置请参考这里。
配置Java环境
下载并解压JDK
从http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html中下载jdk-8u131-linux-x64.tar.gz包并存放在任意目录
将jdk包解压到指定目录
$ sudo mkdir -p /opt/java
$ sudo tar -zxvf jdk-8u131-linux-x64.tar.gz -C /opt/java
配置环境变量
编辑/etc/profile,添加
export JAVA_HOME=/opt/java/jdk1.8.0_131
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
导入环境变量
$ source /etc/profile
测试
配置Zookeeper
zookeeper集群至少3个节点
下载并解压zookeeper
从http://zookeeper.apache.org/releases.html#download下载 zookeeper-3.4.10.tar.gz,并解压
$ tar -zxvf zookeeper-3.4.10.tar.gz -C /home/hyperledger/opt/
修改配置文件
$ cd /home/hyperledger/opt/zookeeper-3.4.10/conf
$ cp zoo_sample.cfg zoo.cfg
$ vim zoo.cfg
配置以下参数
创建myid文件
在$dataDir中创建myid
$ mkdir -p /home/hyperledger/data/zookeeper
$ vim /home/hyperledger/data/zookeeper myid
在文件中写入1
其他节点相应写入2和3
启动zookeeper服务
在各个节点上启动zkServer,确保相应端口的防火墙权限打开
$ bin/zkServer.sh start
配置kafka集群
下载并解压kafka包
在http://kafka.apache.org/downloads下载 kafka_2.11-0.10.2.0.tgz,解压文件
$ tar -zxvf kafka_2.11-0.10.2.0.tgz -C /home/hyperledger/opt/
修改配置文件
$ vim /home/hyperledger/opt/kafka_2.11-0.10.2.0/config/server.properties
修改broke.id为0,其他节点对应1,2
添加default.replication.factor,建议为broker节点的个数
添加message.max.bytes和replica.fetch.max.bytes,为了避免传输数据了较大的chaincode出现错误
配置zookeeper集群
启动kafka服务
后台启动kafka服务
$ bin/kafka-server-start.sh -daemon config/server.properties
查看日志
$ tailf logs/server.log
测试
创建topic
$ bin/kafka-topics.sh --create --zookeeper 192.168.12.10:2181 --replication-factor 3 --partitions 3 --topic cluster-test
#--zookeeper是集群列表,可以指定所有节点,也可以指定为部分列表
#--replication-factor 为复制数目,数据会自动同步到其他broker上,防止某个broker宕机数据丢失
#--partitions 一个topic可以切分成多个partition,一个消费者可以消费多个partition,但一个partition只能被一个消费者消费
查看topic详情
$ bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic cluster-test
启动生产者
$ bin/kafka-console-producer.sh --broker-list localhost:9092 --topic cluster-test
启动消费者
$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic cluster-test --from-beginning
在生产者console输入消息进行发送
在消费者console就可以看到消息了
修改fabric的configtx.yaml配置文件
修改fabric/common/configtx/tool/configtx.yaml
配置OrdererType为kafka,并配置broker列表
重新生成创世区块文件,重启orderer即可。
另外zookeeper和kafak集群也可以利用fabric-zookeeper和fabric-kafka镜像,用docker-compose工具进行部署。