做者: 李佶澳 转载请保留:原文地址 发布时间: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/