kafka入门看这篇就够了


前言

本文是基于3.0之前的kafka版本,所以还会依赖zookeeper。


一、kafka是什么?

Kafka是最初由 Linkedin 公司开发,是一个分布式支持分区的(partition)多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。


二、kafka食用场景

  1. 日志收集:一个公司可以用Kafka收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer客户端,例如hadoop、Hbase、Solr等。
  2. 消息系统:解耦生产者和消费者、缓存消息,削峰等。
  3. 用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。
  4. 运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。

三、kafka基本概念

kafka是一个分布式的,分区的消息(官方称之为commit log)服务。它提供一个消息系统应该具备的功能,但是确有着独特的设计。
可以这样来说:Kafka借鉴了JMS规范的思想,但是确并没有完全遵循JMS规范。
首先,让我们来看一下基础的消息(Message)相关术语:

名称解释
Brokerkafka的服务节点,一个broker就是一个Kafka节点,一个或者多个Broker可以组成一个Kafka集群
TopicKafka根据topic对消息进行归类,发布到Kafka集群的每条消息都需要指定一个topic
Producerkafka的消息生产者,向Broker发送消息的客户端
Consumerkafka的消息消费者,从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. 环境准备

  1. 操作系统:CentOS Linux release 6.0 (Final)。
  2. JDK:由于Kafka是用Scala语言开发的,运行在JVM上,因此在安装Kafka之前需要先安装JDK。这个比较简单,读者可以自行安装。
  3. 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的相关博文,欢迎点赞收藏关注(●’◡’●)!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值