学习Kafka原理需要通过实践与原理相辅相成提高自己的认知能力 ,该篇前半部分为集群搭建,后半部分为实践的Java代码,后续会通过学习Kafka原理来升级Java代码。
Kafka集群搭建
Kafka版本选择
-
Kafka3.0开始弃用Java8
-
Kafka2.8.0 使用自我管理的元数据仲裁替代Zookeeper
-
忽视Java支持,可直接使用最新的;
-
需要使用去Zookeeper版本则使用2.8.1
-
需要使用自带Zookeeper版本则使用2.7.2
-
本文使用的2.7.2进行搭建集群(涉及Zookeeper集群搭建)
自带Zookeeper集群搭建
- 配置文件修改
修改 kafkaxxx/config/zookeeper.properties
增加以下集群配置(集群的ip,端口号按自己实际修改)
dataDir=/kafkaxxx/zookeeper/data
#心跳间隔(ms)
tickTime=2000
#Follower初始化连接Leader的心跳数量,超过了initLimit*tickTime则连接失败
initLimit=10
#Leader超过对应的syncLimit*tickTime时间没有收到follower心跳,则移除该Follower
syncLimit=5
#集群数量(ip:集群通信端口:leader选举端口)
server.0=127.0.0.1:12888:13888
server.1=127.0.0.1:22888:23888
server.2=127.0.0.1:32888:33888
#在其数据目录/kafkaxxx/zookeeper/data下,新建myid文件,写入对应server的id[上述配置的id是 0,1,2, 共三台集群配置]
- 启动zookeeper
# windows启动
.\zookeeper-server-start.bat ..\..\config\zookeeper.properties
# linux 启动
.\zookeeper-server-start.sh ..\config\zookeeper.properties
Kafka集群搭建
- 配置server.properties
# 集群的kafka id需要不同;
broker.id=0
# 修改zookeeper地址 (如果需要指定 根目录节点,后面需要加 /根目录)
zookeeper.connect=127.0.0.1:12000,127.0.0.1:12001,127.0.0.1:12002/kafka
#配置 listener
listeners=PLAINTEXT://0.0.0.0:9092
#配置 advertised.listeners
advertised.listeners=PLAINTEXT://192.168.0.106:9092
#设置内部topic副本数量(__consumer_offsets,__transaction_state),最好设置为broker数量
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
- 关于listeners 与advertised.listeners 配置
可参考 深入理解listeners配置 - __consumer_offsets 内置topic的相关参数配置
__consumer_offsets是kafka内置创建的topic,当kafka的首个消费进行提交offset时由kafka根据broker参数配置创建对应分区数量以及副本数量的__consumer_offsets;
offsets.topic.replication.factor:__consumer_offsets的副本数量,默认值为1,存在消费者单点故障问题
offsets.topic.num.partitions: __consumer_offsets分区数量,默认值为50
思考:为什么kafka的 __consumer_offsets topic 默认的副本数量是1??
个人见解:在kafka包的默认配置,是需要考虑用户单机部署的,如果副本数量默认不是1,而是大于1,那么会出现单机部署的kafka无法进行消费,因为 __consumer_offsets topic由于副本数量设置超过broker数量 无法被创建,而导致消费者无法提交 __consumer_offsets。
- 启动kafka
#windows
bin/windows/kafka-server-start.bat config/server.properties
#linux
./bin/kafka-server-start.sh config/server.properties
单机伪集群
topic创建
#windows、linux 一样的参数,
kafka-topics.bat --create --zookeeper 127.0.0.1:12000,127.0.0.1:12001,127.0.0.1:12002/kafka --topic kafka-lls --replication-factor 2 --partitions 8
#--topic 指定创建topic名
#--replication-factor 分区的副本数量(副本数量不能超过当前可用broker数量。)
#--partitions topic的分区数量
查看topic分区状态
#查看所有的topic分区状态
kafka-topics.bat --describe --zookeeper 127.0.0.1:12000/kafka
#查看所有的topic列表
kafka-topics.bat --list --zookeeper 127.0.0.1:12000/kafka
#查询指定topic分区状态
kafka-topics.bat --topic kafka-lls --describe -zookeeper 127.0.0.1:12000/kafka
Kafka代码实战
Kafka生产者代码
maven 引入pom依赖(对应版本的kafka-clients)
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.7.2</version>
</dependency>
Kafka生产者
kafka发送消息是异步的,返回Future获取结果时是阻塞的,因此代码在获取结果
package com.ieen.kafka.demo.producer;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka