超級帳本HyperLedger:Fabric使用kafka進行區塊排序(共識,附視頻講解)

做者: 李佶澳   轉載請保留:原文地址   發佈時間:2018/07/28 23:17:00html

說明

這是」網易雲課堂IT技術快速入門學院使用的素材。java

操做和講解視頻位於《HyperLedger Fabric手把手入門》第四章中。node

在Fabric1.2以及以前的版本中,使用kafka進行排序是比較貼近生產的。Fabric支持 的三種共識機制:solo(單臺orderer至關於沒有共識)、kafka、pbft(還在開發中)apache

Bringing up a Kafka-based Ordering Service中介紹了使用kafka進行排序時須要注意的事項。bootstrap

什麼是kafka,爲何能用來作排序(共識)?

Kafka is a distributed streaming platform,也就是咱們一般將的「消息隊列」。安全

生產者能夠經過kafka將消息傳遞給消費者,kafka保證消息的順序以及不丟失:socket

kafka usage

kafka consumer-groups

須要注意的是,kafka雖然是一個分佈式系統,但它自己是被中心化管理,而且依賴zookeeper。分佈式

Fabric使用kafka的時候,爲了安全,應當配置tls加密和認證,特別是通過公網的時候。爲了演示不過於繁瑣,下面 沒有配置認證和tls加密,能夠仔細研讀Generate SSL key and certificate for each Kafka broker,進行嘗試。ide

部署kafka

首先要有一個kafka集羣,kafka自己是一個分佈式系統,部署配置略複雜。測試

這裏的重點是Fabric,所以只部署了單節點的kafk,參考kafka quick start

下載kafka,下載地址

wget http://mirror.bit.edu.cn/apache/kafka/1.1.1/kafka_2.12-1.1.1.tgz
tar -xvf kafka_2.12-1.1.1.tgz
cd kafka_2.12-1.1.1/

安裝java,運行kafka須要java:

$ yum install -y java-1.8.0-openjdk
$ java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)

啓動kafka自帶的zookeeper:

./bin/zookeeper-server-start.sh config/zookeeper.properties

根據HyperLedger Fabric對kafka的需求修改kafka的配置文件,能夠到這裏查看kafka的全部配置項):

# 默認爲false
unclean.leader.election.enable = false     

# 根據kafka的節點數設置,須要小於備份數
# 意思完成了「指定數量」的備份後,寫入才返回成功
min.insync.replicas = 1                    

# 數據備份數
default.replication.factor = 1             

# 須要大於創世塊中設置的 Orderer.AbsoluteMaxBytes
# 注意不要超過 socket.request.max.bytes(100M)
# 這裏設置的是10M
message.max.bytes = 10000120                
                                           
# 須要大於創世塊中設置的 Orderer.AbsoluteMaxBytes
# 注意不要超過 socket.request.max.bytes(100M)
# 這裏設置的是10M
replica.fetch.max.bytes = 10485760

                                           
# 當前orderer不支持kafka log,須要關閉這個功能
# @2018-07-29 08:19:32
log.retention.ms = -1

將上面的配置添加到config/server.properties中,而後啓動kafka:

bin/kafka-server-start.sh config/server.properties

注意,你可能須要根據本身的實際狀況配置advertised.listeners,使用kafka的機器須要可以經過 下面配置的hostname訪問對應的節點,默認獲取當前hostname,若是不配置hostname,能夠修改成主機的對外IP。

#advertised.listeners=PLAINTEXT://your.host.name:9092

若是要進行多節點部署,在另外一臺機器上用一樣方式部署:

注意更改server.properties中的zk地址,全部節點要使用同一個zk
其它節點不須要再啓動zookeeper

zookeeper也能夠進行多節點部署,這裏就不展開了,參考zookeeper的資料

部署啓動後,測試一下kafka:

# 建立名爲`test`的topic
$ bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

# 查看topic
$ bin/kafka-topics.sh --list --zookeeper localhost:2181
test

# 啓動生產者,並輸入任意字符
$ bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
>This is a message
>This is another message

# 啓動消費者,接收到生產者的輸入
$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
This is a message
This is another message

生成創世區塊 & 從新部署Fabric

須要注意如今(@2018-07-29 08:20:48)Fabric不支持切換共識機制!一旦選定了共識機制後,沒法修改,除非清空全部數據,從新部署。

修改configtx.yamlOrderer部分的內容,將共識機制修改成kafka,並填入kafka節點的地址:

101 Orderer: &OrdererDefaults
102     OrdererType: kafka
103     Addresses:
104         - orderer0.member1.example.com:7050
105     BatchTimeout: 2s
106     BatchSize:
107         MaxMessageCount: 10
108         AbsoluteMaxBytes: 8 MB         # 注意要小於kafka中設置的10M
109         PreferredMaxBytes: 512 KB
110     MaxChannels: 0
111     Kafka:
112         Brokers:
113             - 192.168.88.11:9092       # 能夠填入多個kafka節點的地址

若是kafka配置了tls加密,還要修改修改每一個orderer的配置文件orderer.yaml中的Kakfa部分的內容,並上傳證書。

從新生成創世塊,從新部署Fabric,便可。

./prepare.sh example 
ansible-playbook -i inventories/example.com/hosts -u root  playbooks/manage_destroy.yml
ansible-playbook -i inventories/example.com/hosts -u root  deploy_nodes.yml
ansible-playbook -i inventories/example.com/hosts -u root  deploy_cli.yml
ansible-playbook -i inventories/example.com/hosts -u root  deploy_cli_local.yml

建立Channel & 觀察kafka中的topic

Fabric從新部署啓動後,能夠看到kafka中多了一個名爲genesis的topic,genesis是咱們這裏使用的創世區塊的channel的名稱:

$ bin/kafka-topics.sh --list --zookeeper localhost:2181
__consumer_offsets
genesis
test

建立了名爲mychannel的channel以後,kafka中多出了一個同名的topic:

$bin/kafka-topics.sh --list --zookeeper localhost:2181
__consumer_offsets
genesis
mychannel
test

ZooKeeper和Kafka數據的清空

若是要從新部署,清空zk和kafka的數據:

rm -rf /tmp/zookeeper/
rm -rf /tmp/kafka-logs/

參考

  1. Bringing up a Kafka-based Ordering Service
  2. kafka
  3. kafka quick start
  4. Generate SSL key and certificate for each Kafka broker
  5. kafka download
  6. Kafka Broker Configs
  7. Kafka steps
  8. Kafka is a distributed streaming platform.
  9. Welcome to Apache ZooKeeper

限時活動,每邀請一人即返回25元!

相關文章
相關標籤/搜索