kafka 实战

kafka 介绍

kafka 是一款基于发布订阅的消息系统,Kafka的最大的特点就是高吞吐量以及可水平扩展, Kafka擅长处理数据量庞大的业务,例如使用Kafka做日志分析、数据计算等。 <!--more-->

kafka 概念角色介绍

  • Broker:kafka 中 broker概念和rabbitMQ的broker概念类似,一个独立的 Kafka 服务器被称为broker,接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存;
  • Topic:Topic为主题,也就是相当于消息系统中的队列(queue),一个Topic中存在多个Partition;注意,这里区别于 rabbitMQ 的 Topic;
  • Partition:Partition为分区,是构成Kafka存储结构的最小单位;
  • Group:消费者组,一组消费者构成消费者组
  • Message:消息

kafka 安装及使用

kafka 的运行依赖于 zookeeper,它的安装相对于 rabbitMQ来说比较简单。下面介绍Windows下 kafka的安装及其使用。

kafka是依赖于zookeeper的,所以我们先要安装zookeeper ,当然kafka的二进制包里面,包含了zookeeper 的安装包,我们不需要单独的再去下载ZK的安装包;

在 kafka 官网下载 二进制的 tgz 压缩包: http://kafka.apache.org/downloads.html,解压后它的 bin/windows下有 zk的启动脚本和kafka的启动脚本, zk的配置文件和kafka的配置文件在 config文件夹下,分别对应 zookeeper.properties和server.properties。 由于本人对zk使用的频率也比较高,因此我是单独安装的zk。

下面我们对kafka进行配置及启动,配置文件说明:

 # 对外暴露的服务端口
advertised.listeners=PLAINTEXT://ip:9092
# 机器的标识
broker.id=1
# kafka日志存储的位置
log.dirs=c:xxx
# zk的地址
zookeeper.connect=localhost:2181

启动脚本:

.\\bin\\windows\\kafka-server-start.bat .\\config\\server.properties

接下来我们做一下简单的测试。

执行脚本

.\\bin\\windows\\kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

该操作创建了一个 名为 test 的 kafka 主题,接下来我们可以在主题中写入消息并消费消息了。

执行脚本

.\\bin\\windows\\kafka-console-producer.bat --broker-list 127.0.0.1:9092 --topic test 
xxx
xxx

该操作创建了一个消息生产者,并发送消息 "xxx"

执行脚本,消费消息:

kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test --from-beginning
​

kafka 原理

消息队列一般包含两种模式,一种是点对点的模式,一种是发布订阅的模式。前文提到过 kafka 是一款基于发布订阅的消息队列。 那么kafka是怎么去发布消息,怎么去保存消息,订阅消息的呢?首先我们从kafka的发布订阅模型开始分析。 <!--more--> 下图为kafka的发布订阅模型:

kafka 运行流程

kafka 总体流程可以粗略的归纳为: Producer 生产一个消息并指定消息的主题 Topic -> producer 将生产的消息投递给 kafka cluster -> kafka cluster 将消息根据 Topic 拆分成多个partition 存储到各个 broker 中 -> 消费者组订阅主题,负载均衡的消费消息。 接下来我们分析 kafka 的数据分区保存和记录消息消费与生产的方式。

partition(分区)

kafka 对于 topic 有一个分区的默认值,通过config/server.properties中通过配置项num.partitions来指定新建Topic的默认Partition数量, 同时也可在创建Topic时通过参数指定或者在Topic创建之后通过Kafka提供的工具修改。生产者将数据写入到kafka主题后, kafka通过不同的策略将数据分配到不同分区中,常见的有三种策略,轮询策略,随机策略,和按键保存策略。

在消费者这一端,一个consumer可以消费一个或多个partition,1个partition只能被同组的一个consumer消费, 但是可以被不同组的多个 consumer 消费。如果一个consumer group中的consumer个数多于topic中的partition的个数, 多出来的consumer会闲置。

分区本身会有多个副本,这多个副本中只有一个是leader,而其他的都是follower。仅有leader副本可以对外提供服务。 通常follower不和leader在同一个broker中,这样当leader 挂掉 follower 不会跟着挂, 而是从众多follower中选一个出来作为leader继续提供服务。

offset

每个分区中还会维护一个 offset (偏移量),这是一个很重要的数据,消息的存取都依赖它。 现在我们可以先简单的理解为往每个分区中写一条数据就会加一个偏移量,而消费一条数据就会减一个偏移量,就好像队列的游标一样。 后文会具体分析它的工作原理。下图为 offset 示意图:

通常由如下几种 Kafka Offset 的管理方式:

  • Spark Checkpoint:在 Spark Streaming 执行Checkpoint 操作时,将 Kafka Offset 一并保存到 HDFS 中。
  • HBASE、Redis 等外部 NOSQL 数据库:这一方式可以支持大吞吐量的 Offset 更新。
  • ZOOKEEPER:老版本的位移offset是提交到zookeeper中的,目录结构是 :/consumers/<group.id>/offsets/ <topic>/<partitionId> ,当存在频繁的 Offset 更新时,ZOOKEEPER 集群本身可能成为瓶颈。
  • KAFKA:存入自身的一个特殊 Topic中,这种方式支持大吞吐量的Offset 更新,又不需要手动编写 Offset 管理程序或者维护一套额外的集群。

后文我们会介绍关于 kafka 的 partition 与 offset 的一些机制,如数据存储与同步,分区原则,分区策略,可靠性保证,高效读写原理等。

本站文章资源均来源自网络,除非特别声明,否则均不代表站方观点,并仅供查阅,不作为任何参考依据!
如有侵权请及时跟我们联系,本站将及时删除!
如遇版权问题,请查看 本站版权声明
THE END
分享
二维码
海报
kafka 实战
kafka 是一款基于发布订阅的消息系统,Kafka的最大的特点就是高吞吐量以及可水平扩展, Kafka擅长处理数据量庞大的业务,例如使用Kafka做日志分析、...
<<上一篇
下一篇>>