Kafka的安装和使用
目录
安装、使用Kafka
- 共分为下载、安装和配置、启动、测试,四个步骤
一、下载Kafka和相关依赖
-
虽然Kafka也可以在windows上使用,但是其基本上是运行在linux服务器上,因此本文也使用linux来进行演示
-
在下载之前,我们需要知道的是:Kafka的安装需要依赖于jdk和zookeeper。(kafka 2.11-1.1.0版本才与JDK1.7兼容,更高版本需要JDK1.8)不过kafka好像已经宣布了即将弃用对java8的支持,所以在未来版本,肯定也就不能安装java8版本了。
- 需要说明的是,kafka的安装依赖于Zookeeper,所以运行kafka需要先启动Zookeeper。2.8之前版本的Kafka还需要zookeeper,2.8及之后的Kafka已经内置了一个zookeeper环境,(所以注意下自己下载的版本)。我们可以直接使用。在Kafka安装路径的bin目录下,文件名称为
zookeeper-server-start.sh
- 需要说明的是,kafka的安装依赖于Zookeeper,所以运行kafka需要先启动Zookeeper。2.8之前版本的Kafka还需要zookeeper,2.8及之后的Kafka已经内置了一个zookeeper环境,(所以注意下自己下载的版本)。我们可以直接使用。在Kafka安装路径的bin目录下,文件名称为
-
所以总结下来就是,我们需要下载的有:Kafka安装包和 jdk
-
Kafka安装包:可以在Kafka官网:下载到最新的kafka安装包,选择下载二进制版本的tgz文件,根据网络状态可能需要fq,这里我们选择的版本是kafka_2.13-3.1.1
-
jdk安装包:可以在jdk官方下载
- windows和Linux上下载jdk教程,请查看这里jdk下载安装
-
虽然我们不需要下载zookeeper,这里还是附上zookeeper官方下载地址
-
下面是Kafka官方下页面
二、安装和配置Kafka
- 首先确保你的机器上安装了jdk(kafka需要java运行环境)
2.1 安装Kafka
- 然后将下载下来的安装包直接解压到一个路径下即可完成kafka的安装,这里统一将kafka安装到/usr/local目录下
1. 下载并解压kafka部署包至/usr/local/目录
tar -zxvf kafka_2.13-3.1.1.tgz -C /usr/local/
# 修改配置文件
vim config/zookeeper.properties
vim config/server.properties
# 重点配置参数说明:
broker.id=0 # 唯一标识,集群里每个broker的id需不同
listeners=PLAINTEXT://192.168.121.132:9092 # 暴露服务,否则连接超时。申明此kafka服务器需要监听的端口号,如果是在本机上跑虚拟机运行可以不用配置本项,默认会使用localhost的地址,如果是在远程服务器上运行则必须配置,例如:listeners=PLAINTEXT://192.168.180.128:9092。并确保服务器的9092端口能够访问
log.dirs=/data/kafka # 日志路径,路径需提前创建好,且必须有读写权限
zookeeper.connect=localhost:2181 # 设置zk的连接地址及端口。申明kafka所连接的zookeeper的地址 ,需配置为zookeeper的地址,由于本次使用的是kafka高版本中自带zookeeper,使用默认配置即可
注意:
当我们有多个应用,在不同的应用中都使用zookeer,都使用默认的zk端口的话就会2181端口冲突,我们可以设置Kafka自己的端口号,在config文件夹下zookeeper.properties文件中修改为
clientPort=2185
也就是zk开放接口为2185.
同时修改kafka的接入端口,server.properties文件中修改为
zookeeper.connect=localhost:2185
2.2 Kafka的配置
- Kafka的配置文件,在kafka解压目录下下有一个config的文件夹,里面放置的是我们的配置文件
- consumer.properites :消费者配置,这个配置文件用于配置于上一篇Kafka基础文章中的消费者,此处我们使用默认的即可
- producer.properties :生产者配置,这个配置文件用于配置于上一篇Kafka基础文章中的生产者,此处我们使用默认的即可
- server.properties :kafka服务器的配置,此配置文件用来配置kafka服务器
- zookeeper.properties :zookeeper配置,建设Kafka集群或者zookeeper的端口冲突时需要设置。(在下一篇Kafka集群部署中有设置)
2.2.1 kafka服务配置server.properties
- 详解配置文件,核心设置为基础设置、socket设置、log设置、zookeeper设置三大部分
- 必须要修改的有:
broker.id、delete.topic.enable、listeners=PLAINTEXT、log.dirs、num.partitions、zookeeper.connect
- 根据自己的业务需要修改的有:
auto.create.topics.enable、queued.max.requests、num.network.threads、num.io.threads、socket.send.buffer.bytes、zookeeper.connection.timeout.ms
*******************************基础设置***********************************
broker.id=1 # 每一个broker在集群中的唯一表示,要求是正数。当该服务器的IP地址发生改变时,broker.id没有变化,则不会影响consumers的消息情况
auto.create.topics.enable=true # 这个参数用于设置是否自动创建topic,如果请求一个topic时发现还没有创建, kafka会在broker上自动创建一个topic,如果需要严格的控制topic的创建,那么可以设置auto.create.topics.enable为false,禁止自动创建topic,看自己需求
delete.topic.enable=true # 在0.8.2版本之后,Kafka提供了删除topic的功能,但是默认并不会直接将topic数据物理删除。如果要从物理上删除(即删除topic后,数据文件也会一同删除),就需要设置此配置项为true
queued.max.requests = 5000 # 等待IO线程处理的请求队列最大数,按自己业务需求设置
*******************************socket设置*********************************
listeners=PLAINTEXT://127.0.0.1:9092 # 设置kafka的监听地址与端口,可以将监听地址设置为主机名或IP地址,这里将监听地址设置为IP地址。要确保指定的端口能够访问
num.network.threads=13 # 这个是borker进行网络处理的线程数,按自己业务需求设置
num.io.threads=48 # 这个是borker进行I/O处理的线程数,按自己业务需求和服务器配置设置
socket.send.buffer.bytes=102400 # 发送缓冲区buffer大小,数据不是一下子就发送的,先会存储到缓冲区到达一定的大小后在发送,能提高性能
socket.receive.buffer.bytes=102400 # kafka接收缓冲区大小,当数据到达一定大小后在序列化到磁盘
socket.request.max.bytes=104857600 # 这个参数是向kafka请求消息或者向kafka发送消息的请求的最大数,这个值不能超过java的堆栈大
*******************************log设置*************************************
log.dirs=/usr/local/kafka/logs # 这个参数用于配置kafka保存数据的位置,kafka中所有的消息都会存在这个目录下。可以通过逗号来指定多个路径, kafka会根据最少被使用的原则选择目录分配新的parition。需要注意的是,kafka在分配parition的时候选择的规则不是按照磁盘的空间大小来定的,而是根据分配的 parition的个数多小而定
num.partitions=6 # 默认的分区数,一个topic默认1个分区数。这个参数用于设置新创建的topic有多少个分区,可以根据消费者实际情况配置,配置过小会影响消费性能。一般分区数 >= 1个消费组中消费者数,这里配置6个分区
num.recovery.threads.per.data.dir=1 # 每个数据目录用来日志恢复的线程数目
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168 # 这个参数用于配置kafka中消息保存的时间,还支持log.retention.minutes和 log.retention.ms配置项。这三个参数都会控制删除过期数据的时间,推荐使用log.retention.ms。如果多个同时设置,那么会选择最小的那个。
log.segment.bytes=1073741824 # 配置partition中每个segment数据文件的大小,默认是1GB,超过这个大小会自动创建一个新的segment file
log.retention.check.interval.ms=300000 # 每隔300000毫秒去检查上面配置的log失效时间
log.cleaner.enable=false # 是否启用log压缩,一般不用启用,启用的话可以提高性能,但是不方便查看
# 实在担心消息丢失,则可以设置这两个参数:log.flush.interval.messages和log.flush.interval.ms
log.flush.interval.messages=10000 # 每当producer写入10000条消息时,刷数据到磁盘
log.flush.interval.ms=1000 # 每间隔1秒钟时间,刷数据到磁盘
# 设置 log.flush.interval.messages, 默认值Long.MAX_VALUE。log.flush.interval.ms(默认null) 两个参数的值,提高消息刷新到磁盘的速度。但是不建议设置这两个参数,刷盘任务应该交由操作系统调配
*******************************zookeeper设置***********************************
zookeeper.connect=localhost:2181 # 设置zookeeper的连接端口,这个值可以通过逗号设置多个值(集群的时候就写多个值)。不是集群的话,默认localhost:2181即可
# 每个值的格式均为:hostname:port/path,每个部分的含义如下:
# hostname:表示zookeeper服务器的主机名或者IP地址,这里设置为IP地址。
# port: 表示是zookeeper服务器监听连接的端口号。
# /path:表示kafka在zookeeper上的根目录。如果不设置,会使用根目录
zookeeper.connection.timeout.ms=18000 # 设置zookeeper的连接超时时间
group.initial.rebalance.delay.ms=0
-
注意:
-
当我们有多个应用,在不同的应用中都使用zookeer,都使用默认的zk端口的话就会2181端口冲突,我们可以设置自己的端口号,在config文件夹下zookeeper.properties文件中修改为clientPort=2185,也就是zk开放接口为2185.
-
同时修改kafka的接入端口,server.properties文件中修改为 zookeeper.connect=localhost:2185
-
2.2.2 消费者配置consumer.properites
- 最为核心的配置是group.id、zookeeper.connect,其他默认即可
## Consumer归属的组ID,broker是根据group.id来判断是点对点模式还是发布订阅模式,一般要设置(名字任意,如group.id=test_group)。设置了就是发布订阅模式(这样在下面使用命令创建消费者时,不指定group就会默认为配置文件的groupid) ./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic mytest --from-beginning --group testgroup
group.id
## 消费者的ID,若是没有设置的话,会自增
consumer.id
## 一个用于跟踪调查的ID ,最好同group.id相同
client.id = group id value
## 当为zookeeper集群时,就要写多个 hostname1:port1,hostname2:port2,hostname3:port3 。必须和server.properties中的zookeeper.connect使用同样的zk配置
zookeeper.connect=localhost:2182
## zookeeper的心跳超时时间,超过这个时间就认为是dead消费者
zookeeper.session.timeout.ms =6000
## zookeeper的等待连接时间
zookeeper.connection.timeout.ms =6000
## zookeeper的follower同leader的同步时间
zookeeper.sync.time.ms =2000
## 当zookeeper中没有初始的offset时候的处理方式 。smallest :重置为最小值 largest:重置为最大值 anythingelse:抛出异常
auto.offset.reset = largest
## socket的超时时间,实际的超时时间是:max.fetch.wait + socket.timeout.ms.
socket.timeout.ms=30*1000
## socket的接受缓存空间大小
socket.receive.buffer.bytes=64*1024
##从每个分区获取的消息大小限制
fetch.message.max.bytes =1024*1024
## 是否在消费消息后将offset同步到zookeeper,当Consumer失败后就能从zookeeper获取最新的offset
auto.commit.enable =true
## 自动提交的时间间隔
auto.commit.interval.ms =60*1000
## 用来处理消费消息的块,每个块可以等同于fetch.message.max.bytes中数值
queued.max.message.chunks =10
## 当有新的consumer加入到group时,将会reblance,此后将会有partitions的消费端迁移到新
## 的consumer上,如果一个consumer获得了某个partition的消费权限,那么它将会向zk注册
##"Partition Owner registry"节点信息,但是有可能此时旧的consumer尚没有释放此节点,
## 此值用于控制,注册节点的重试次数.
rebalance.max.retries =4
## 每次再平衡的时间间隔
rebalance.backoff.ms =2000
## 每次重新选举leader的时间
refresh.leader.backoff.ms
## server发送到消费端的最小数据,若是不满足这个数值则会等待,知道满足数值要求
fetch.min.bytes =1
## 若是不满足最小大小(fetch.min.bytes)的话,等待消费端请求的最长等待时间
fetch.wait.max.ms =100
## 指定时间内没有消息到达就抛出异常,一般不需要改
consumer.timeout.ms = -1
2.2.3 生产者配置producer.properties
- 比较核心的配置:metadata.broker.list、request.required.acks、producer.type、serializer.class,其他默认即可
## 消费者获取消息元信息(topics, partitions and replicas)的地址,配置格式是:host1:port1,host2:port2,也可以在外面设置一个vip
metadata.broker.list
##消息的确认模式
##0:不保证消息的到达确认,只管发送,低延迟但是会出现消息的丢失,在某个server失败的情况下,有点像TCP
##1:发送消息,并会等待leader 收到确认后,一定的可靠性
## -1:发送消息,等待leader收到确认,并进行复制操作后,才返回,最高的可靠性
request.required.acks =0
## 消息发送的最长等待时间
request.timeout.ms =10000
## socket的缓存大小
send.buffer.bytes=100*1024
## key的序列化方式,若是没有设置,同serializer.class
key.serializer.class
## 分区的策略,默认是取模
partitioner.class=kafka.producer.DefaultPartitioner
## 消息的压缩模式,默认是none,可以有gzip和snappy
compression.codec = none
## 可以针对默写特定的topic进行压缩
compressed.topics=null
## 消息发送失败后的重试次数
message.send.max.retries =3
## 每次失败后的间隔时间
retry.backoff.ms =100
## 生产者定时更新topic元信息的时间间隔 ,若是设置为0,那么会在每个消息发送后都去更新数据
topic.metadata.refresh.interval.ms =600*1000
## 用户随意指定,但是不能重复,主要用于跟踪记录消息
client.id=""
------------------------------------------- 消息模式 相关 -------------------------------------------
## 生产者的类型 async:异步执行消息的发送 sync:同步执行消息的发送
producer.type=sync
## 异步模式下,那么就会在设置的时间缓存消息,并一次性发送
queue.buffering.max.ms =5000
## 异步的模式下 最长等待的消息数
queue.buffering.max.messages =10000
## 异步模式下,进入队列的等待时间 若是设置为0,那么要么进入队列,要么直接抛弃
queue.enqueue.timeout.ms = -1
## 异步模式下,每次发送的最大消息数,前提是触发了queue.buffering.max.messages或是queue.buffering.max.ms的限制
batch.num.messages=200
## 消息体的系列化处理类 ,转化为字节流进行传输
serializer.class= kafka.serializer.DefaultEncoder
三、启动Kafka
- 首先启动zookeeper服务
cd进入kafka安装目录
bin/zookeeper-server-start.sh -daemon config/zookeeper.properties # -daemon 为后台启动
# 或者
nohup bin/zookeeper-server-start.sh config/zookeeper.properties &
- 前台成功启动zookeeper服务后如下图
- 其次启动Kafka
cd进入kafka安装目录
bin/kafka-server-start.sh -daemon config/server.properties # -daemon 为后台启动
# 或者
nohup bin/kafka-server-start.sh config/server.properties &
- 前台成功启动Kafka后如下图
四、验证Kafka是否成功启动
4.1 简单验证
- 验证Kafka是否启动成功,在所有服务器上执行
jps
命令:
jps # jps命令是java提供的一个显示当前所有java进程pid的命令,适合在linux/unix平台上简单察看当前java进程的一些简单情况
# 输出如下,有Kafka,表示启动成功
11027 QuorumPeerMain
12263 Kafka
12347 Jps
4.2 生产消费验证
- 注意:创建topic时,官方推荐如果kafka版本大于等于2.2使用–bootstrap-server替代–zookeeper (2.2以上也兼容–zookeeper)
首先需要说明的是,topic相关操作的命令,都有两种写法,如果当前用的不行,就用另外一种
(1) [使用zk] --zookeeper localhost:2181 # localhost:2181 为上面配置文件server.properties中的zookeeper.connect的值
(2) [使用内置] --bootstrap-server localhost:9092 # localhost:9092 为上面配置文件server.properties中的listeners=PLAINTEXT://的值
1. 创建topic
# replication-factor指定副本因子。注意:指定副本因子的时候,不能大于broker实例个数,否则报错
# ./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic mytest # 旧版本创建方式,新版本只有--bootstrap-server 一种创建topic的方式
./bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic mytest
2. 查询topic详情
./bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic mytest
3. 查询所有topic
./bin/kafka-topics.sh --bootstrap-server localhost:9092 --list
4. 修改topic参数配置
# 注意:partition个数count,只能增加,不能减少
./bin/kafka-topics.sh --bootstrap-server localhost:9092 --alter --topic mytest --parti-tions count
5. 删除topic
./bin/kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic mytest
5.1 如果kafaka启动时加载的配置文件中server.properties没有配置delete.topic.enable=true,那么此时的删除并不是真正的删除,而是把topic标记为:marked for deletion
输入如下命令查看:
./bin/kafka-topics --zookeeper 【zookeeper server】 --list 来查看所有topic
此时你若想真正删除它,可以如下操作:
(1)登录zookeeper客户端:命令:./bin/zookeeper-client
(2)找到topic所在的目录:ls /brokers/topics
(3)找到要删除的topic,执行命令:rm -r /brokers/topics/【topic name】即可,此时topic被彻底删除。
另外被标记为marked for deletion的topic你可以在zookeeper客户端中通过命令获得:ls /admin/delete_topics/【topic name】,如果你删除了此处的topic,那么marked for deletion 标记消失
6. 创建消费者(有非必须参数,分区与consumer之间的关系:一个分区不能分给两个consumer,但是两个分区可以分给一个consumer)
# 下面的命令可以创建一个用于消费topic为mytest的消费者
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic mytest --from-beginning --group testgroup
6.1 从尾部开始取数据,必需要指定分区(指定分区)
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic mytest --offset latest --partition 0
6.2 从尾部开始取数据,必需要指定分区(取指定个数)
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic mytest --offset latest --partition 0 --max-messages 1
7. 创建生产者
# 新起一个终端,进入kafka解压目录后,输入如下命令。在执行完毕后会进入的编辑器页面,此时任意编辑一个消息之后,消费者那边的终端可以看到,终端中已经打印出了我们刚才发送的消息
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic mytest