超级帐本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元!

相关文章
相关标签/搜索