kafka入门看这篇就够了
前言
本文是基于3.0之前的kafka版本,所以还会依赖zookeeper。
一、kafka是什么?
Kafka是最初由 Linkedin 公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。
二、kafka食用场景
- 日志收集:一个公司可以用Kafka收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer客户端,例如hadoop、Hbase、Solr等。
- 消息系统:解耦生产者和消费者、缓存消息,削峰等。
- 用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。
- 运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
三、kafka基本概念
kafka是一个分布式的,分区的消息(官方称之为commit log)服务。它提供一个消息系统应该具备的功能,但是确有着独特的设计。
可以这样来说:Kafka借鉴了JMS规范的思想,但是确并没有完全遵循JMS规范。
首先,让我们来看一下基础的消息(Message)相关术语:
名称 | 解释 |
---|---|
Broker | kafka的服务节点,一个broker就是一个Kafka节点,一个或者多个Broker可以组成一个Kafka集群 |
Topic | Kafka根据topic对消息进行归类,发布到Kafka集群的每条消息都需要指定一个topic |
Producer | kafka的消息生产者,向Broker发送消息的客户端 |
Consumer | kafka的消息消费者,从Broker读取消息的客户端 |
ConsumerGroup | 每个Consumer属于一个特定的Consumer Group,一条消息可以被多个不同的Consumer Group消费,但是一个Consumer Group中只能有一个Consumer能够消费该消息 |
Partition | 物理上的概念,一个topic可以分为多个partition,每个partition内部消息是有序的 |
Replication-factor | 用来设置主题的副本数。每个主题可以有多个副本,副本位于集群中不同的broker上,也就是说副本的数量不能超过broker的数量 ,否则创建主题时会失败。 |
三、kafka结构图
从大的结构来看,整个消息消费的流程中包括四个部分:Zookeeper,kafka的集群,producer客户端,consumer客户端。
producer客户端向kafka的集群推送
消息,kafka的集群对消息做一定的处理以后,consumer客户端从kafka拉取
消息。我们这里先了解一个基本的流程,至于具体的细节我们后续章节后继续详细解读,欢迎持续关注。
四、基本食用步骤
1. 环境准备
- 操作系统:CentOS Linux release 6.0 (Final)。
- JDK:由于Kafka是用Scala语言开发的,运行在JVM上,因此在安装Kafka之前需要先安装JDK。这个比较简单,读者可以自行安装。
- zookeeper:kafka依赖zookeeper,所以需要先安装zookeeper。
# 在线下载zookeeper
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.5.8/apache-zookeeper-3.5.8-bin.tar.gz
# 解压 zookeeper
tar -zxvf apache-zookeeper-3.5.8-bin.tar.gz
# 进入解压后的zookeeper目录
cd apache-zookeeper-3.5.8-bin
# 重命名 zoo_sample.cfg 配置文件
cp conf/zoo_sample.cfg conf/zoo.cfg
# 启动 zookeeper 服务
bin/zkServer.sh start
# 启动 zookeeper 客户端
bin/zkCli.sh
# 查看zk的根目录相关节点
ls /
2. kafka的安装
接下来是kafka的安装:
# 在线下载kafka,2.11是scala的版本,2.4.1是kafka的版本
wget https://archive.apache.org/dist/kafka/2.4.1/kafka_2.11-2.4.1.tgz
# 解压 kafka
tar -zxvf kafka_2.11-2.4.1.tgz
# 进入 kafka 目录
cd kafka_2.11-2.4.1/
3.kafka修改配置
修改配置文件:config/server.properties,本文假定安装的服务器IP地址为:192.168.11.11,读者需要根据自己的实际IP进行替换
# broker.id属性在kafka集群中必须要是唯一
broker.id=0
# kafka部署的机器ip和提供服务的端口号
listeners=PLAINTEXT://192.168.11.11:9092
# kafka的消息存储文件
log.dir=/usr/local/data/kafka-logs
# kafka连接zookeeper的地址
zookeeper.connect=192.168.11.11:2181
4. 启动kafka服务
启动脚本语法:kafka-server-start.sh [-daemon] server.properties
可以看到,server.properties 的配置路径是一个强制的参数,-daemon
表示以后台进程运行,否则 ssh 客户端退出后,就会停止服务
# 启动kafka,运行日志在logs目录的server.log文件里
#后台启动,不会打印日志到控制台
bin/kafka-server-start.sh -daemon config/server.properties
# 或者用
bin/kafka-server-start.sh config/server.properties &
# 我们进入 zookeeper 目录通过 zookeeper 客户端查看下 zookeeper 的目录树
bin/zkCli.sh
# 查看 zookeeper 的根目录 kafka 相关节点
ls /
# 查看 kafka 节点
ls /brokers/ids
5. 创建主题
现在我们来创建一个名字为“test_topic”的Topic,这个topic只有一个partition,并且副本数也设置为1:
bin/kafka-topics.sh --create --zookeeper 192.168.11.11:2181 --replication-factor 1 --partitions 1 --topic test_topic
我们可以通过以下命令来查看 kafka 中目前存在的topic:
bin/kafka-topics.sh --list --zookeeper 192.168.11.11:2181
除了我们通过手工的方式创建 Topic,默认情况下,当 producer 发布一个消息到某个指定的 Topic,这个 Topic 如果不存在,就自动创建。
6. 生产消息
kafka自带了一个 producer 客户端,可以从本地文件中读取内容,或者我们也可以以命令行中直接输入内容,并将这些内容以消息的形式发送到 kafka 集群中。在默认情况下,每一行会被当做成一个独立的消息
。
首先我们要运行发布消息的脚本,然后在命令中输入要发送的消息的内容:
# 执行 producer 客户端脚本
bin/kafka-console-producer.sh --broker-list 192.168.11.11:9092 --topic test_topic
>this is a msg
>this is a another msg
7. 消费消息
同样的对于消费者,kafka 同样也自带了一个 consumer 客户端,会将获取到内容在命令中进行输出,默认是消费最新的消息:
bin/kafka-console-consumer.sh --bootstrap-server 192.168.11.11:9092 --topic test_topic
如果想要消费之前的消息可以通过添加 --from-beginning
参数指定:
bin/kafka-console-consumer.sh --bootstrap-server 192.168.11.11:9092 --from-beginning --topic test_topic
由于kafka的一条消息只能被一个消费者组的一个消费者消费,也就是说消息是按消费者组为单位消费的。
所以就衍生出两种消费模式:
7.1 单播消费
一条消息只能被某一个消费者消费的模式,类似queue模式,只需让所有消费者在同一个消费组里即可。分别在两个客户端执行如下消费命令(注意设置成同一个消费者组名:testGroup),然后往主题 test_topic 里发送消息,结果只有一个客户端能收到消息:
bin/kafka-console-consumer.sh --bootstrap-server 192.168.11.11:9092 --consumer-property group.id=testGroup --topic test_topic
7.2 多播消费
一条消息能被多个消费者消费的模式,类似 publish-subscribe 模式费。针对 Kafka 同一条消息只能被同一个消费组下的某一个消费者消费的特性,要实现多播只要保证这些消费者属于不同的消费组即可。
我们再增加一个消费者,该消费者属于 testGroup-2 消费组,结果两个客户端都能收到消息:
bin/kafka-console-consumer.sh --bootstrap-server 192.168.11.11:9092 --consumer-property group.id=testGroup-2 --topic test_topic
7.3 查看消费者组的消费信息
bin/kafka-consumer-groups.sh --bootstrap-server 192.168.11.11:9092 --describe --group testGroup
8. 停止kafka服务
# 停止 kafka 服务
bin/kafka-server-stop.sh
总结
以上就是今天要讲的内容,限于笔者水平有限,如果文中有纰漏欢迎评论指正。
本文仅仅简单介绍了kafka安装和使用,后面会更加深入地介绍和使用kafka的相关博文,欢迎点赞收藏关注(●’◡’●)!