目前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工具進行部署。