做者: 李佶澳 轉載請保留:原文地址 發佈時間: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 is a distributed streaming platform,也就是咱們一般將的「消息隊列」。安全
生產者能夠經過kafka將消息傳遞給消費者,kafka保證消息的順序以及不丟失:socket
須要注意的是,kafka雖然是一個分佈式系統,但它自己是被中心化管理,而且依賴zookeeper。分佈式
Fabric使用kafka的時候,爲了安全,應當配置tls加密和認證,特別是通過公網的時候。爲了演示不過於繁瑣,下面 沒有配置認證和tls加密,能夠仔細研讀Generate SSL key and certificate for each Kafka broker,進行嘗試。ide
首先要有一個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
須要注意如今(@2018-07-29 08:20:48)Fabric不支持切換共識機制!一旦選定了共識機制後,沒法修改,除非清空全部數據,從新部署。
修改configtx.yaml
中Orderer
部分的內容,將共識機制修改成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
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
若是要從新部署,清空zk和kafka的數據:
rm -rf /tmp/zookeeper/
rm -rf /tmp/kafka-logs/