目前fabric1.0將廣播服務(wù)從peer節(jié)點中分離出來,形成orderer節(jié)點,orderer節(jié)點提供原子通信保證(Atomic Communication Guarantee),也叫做有序廣播(total-order broadcast)、原子廣播(atomic broadcast), 共識(consensus)。即將peer節(jié)點發(fā)送過來的交易進行排序、打包為區(qū)塊,然后將區(qū)塊廣播各個組織的peer節(jié)點。
fabric-1.0的orderer提供solo、kafka和bft三種模式,分別可以認(rèn)為是中心化、半中心化和去中心化。其中solo模式指整個fabric網(wǎng)絡(luò)依賴于一個orderer節(jié)點,而kafka模式依賴于一個kafka集群,bft模式則是去中心化的orderer集群,但目前bft模式并沒有在fabric-1.0中實現(xiàn)。

本文則介紹fabric-1.0的kafka模式搭建。fabric-1.0環(huán)境配置請參考這里。
配置Java環(huán)境
下載并解壓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
配置環(huán)境變量
編輯/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
導(dǎo)入環(huán)境變量
$ source /etc/profile
測試

配置Zookeeper
zookeeper集群至少3個節(jié)點
下載并解壓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
配置以下參數(shù)

創(chuàng)建myid文件
在$dataDir中創(chuàng)建myid
$ mkdir -p /home/hyperledger/data/zookeeper
$ vim /home/hyperledger/data/zookeeper myid
在文件中寫入1
其他節(jié)點相應(yīng)寫入2和3
啟動zookeeper服務(wù)
在各個節(jié)點上啟動zkServer,確保相應(yīng)端口的防火墻權(quán)限打開
$ 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,其他節(jié)點對應(yīng)1,2

添加default.replication.factor,建議為broker節(jié)點的個數(shù)
添加message.max.bytes和replica.fetch.max.bytes,為了避免傳輸數(shù)據(jù)了較大的chaincode出現(xiàn)錯誤

配置zookeeper集群

啟動kafka服務(wù)
后臺啟動kafka服務(wù)
$ bin/kafka-server-start.sh -daemon config/server.properties
查看日志
$ tailf logs/server.log
測試
創(chuàng)建topic
$ bin/kafka-topics.sh --create --zookeeper 192.168.12.10:2181 --replication-factor 3 --partitions 3 --topic cluster-test
#--zookeeper是集群列表,可以指定所有節(jié)點,也可以指定為部分列表
#--replication-factor 為復(fù)制數(shù)目,數(shù)據(jù)會自動同步到其他broker上,防止某個broker宕機數(shù)據(jù)丟失
#--partitions 一個topic可以切分成多個partition,一個消費者可以消費多個partition,但一個partition只能被一個消費者消費
查看topic詳情
$ bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic cluster-test
啟動生產(chǎn)者
$ 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
在生產(chǎn)者console輸入消息進行發(fā)送
在消費者console就可以看到消息了
修改fabric的configtx.yaml配置文件
修改fabric/common/configtx/tool/configtx.yaml
配置OrdererType為kafka,并配置broker列表

重新生成創(chuàng)世區(qū)塊文件,重啟orderer即可。
另外zookeeper和kafak集群也可以利用fabric-zookeeper和fabric-kafka鏡像,用docker-compose工具進行部署。