Hi,大家好,我是一个爱冒泡的程序猿,
天爷啊,这鬼疫情什么时候才能结束,好想出去玩o(╥﹏╥)o
kafka第一讲:kafka要点入门
目录
1、启动zookeeper(在根目录执行此下命令):
zookeeper-server-start.bat ../../config/zookeeper.properties
2、启动kafka(在根目录执行此命令):
kafka-server-start.bat ../../config/server.properties
3、定义好的分区只能加不能减少
D:\kafka_2.12-2.8.0\bin\windows>kafka-topics.bat --alter --zookeeper localhost:2181 --topic topic-02 --partitions 1
WARNING: If partitions are increased for a topic that has a key, the partition logic or ordering of the messages will be affected
Error while executing topic command : The number of partitions for a topic can only be increased. Topic topic-02 currently has 2 partitions, 1 would not be an increase.
[2022-04-07 13:18:20,883] ERROR org.apache.kafka.common.errors.InvalidPartitionsException: The number of partitions for a topic can only be increased. Topic topic-02 currently has 2 partitions, 1 would not be an increase.
(kafka.admin.TopicCommand$)
D:\kafka_2.12-2.8.0\bin\windows>kafka-topics.bat --alter --zookeeper localhost:2181 --topic topic-02 --partitions 3
WARNING: If partitions are increased for a topic that has a key, the partition logic or ordering of the messages will be affected
Adding partitions succeeded!
4、replication-factor 副本因子不允许更改,所以在创建topic时就要定义好
5、发送消息和接收消息报错:
(id: -1 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)
因为命令行中kafka端口号应该是9092
生产者:
kafka-console-producer.bat --bootstrap-server 172.17.2.47:9092 --topic topic-02
消费者:
kafka-console-consumer.bat --bootstrap-server 172.17.2.47:9092 --topic topic-02
6、windows下,执行kafka-console-producer.bat 收到中文消息是乱码
是因为windows cmd控制台字符集不是utf-8,解决方法
7、简单的压力测试-批量生产topic数据
kafka-producer-perf-test.bat --topic topic-01 --num-records 1000 --record-size 1 --throughput 200 --producer-props bootstrap.servers=localhost:9092
8、配置单机伪分布式
单机伪分布式,复制三份server.properites,但需要修改端口、broker.id、log.dirs。
server.properties
# Kafka broker节点唯一标识
borker.id=0
# 端口号(伪分布式不能冲突)
port=9092
# 对客户端提供的服务器地址和端口
advertised.listener=PLAINTEXT://192.168.56.105:9092
# Kafka日志存分路径
log.dirs=/home/hadoop/kafka/broker-0
server1.properties
# Kafka broker节点唯一标识
borker.id=1
# 端口号(伪分布式不能冲突)
port=9093
# 对客户端提供的服务器地址和端口
advertised.listener=PLAINTEXT://192.168.56.105:9093
# Kafka日志存分路径
log.dirs=/home/hadoop/kafka/broker-1
server2.properties
# Kafka broker节点唯一标识
borker.id=2
# 端口号(伪分布式不能冲突)
port=9094
# 对客户端提供的服务器地址和端口
advertised.listener=PLAINTEXT://192.168.56.105:9094
# Kafka日志存分路径
log.dirs=/home/hadoop/kafka/broker-2
9、基本命令使用
创建
# 创建一个拥有1个分区3个副本的topic
$ kafka-topics.sh --create --zookeeper master:2181 --replication-factor 3 --partitions 1 --topic my-replicated-topic
修改
# 修改topic
$ kafka-topics.sh --alter --zookeeper master:2181 --topic my-replicated-topic --partitions 2
删除
# 删除topic
$ kafka-topics.sh -delete --zookeeper master:2181 -topic my-replicated-topic
查看
# 查看topic信息
$ kafka-topics.sh --describe --zookeeper master:2181 --topic my-replicated-topic
查看主题列表
$ kafka-topics.sh --list --zookeeper master:2181
$ kafka-topics.sh --list --zookeeper master:2181,master:2182,master:2183
生产消息
# 命令方式
$ kafka-console-producer.sh --broker-list master:9092 --topic my-replicated-topic
# 调用工具类方式
$ kafka-run-class.sh kafka.tools.ConsoleProducer --broker-list master:9092,master:9093,master94 --topic my-replicated-topic
消息批量生成
$ kafka-producer-perf-test.sh --topic test --num-records 100 --record-size 1 --throughput 100 --producer-props bootstrap.servers=localhost:9092
消费消息
# 命令方式
$ kafka-console-consumer.sh --bootstrap-server 192.168.56.105:9092 --from-beginning -topic mytopic-02
# 调用工具类方式
$ kafka-run-class.sh kafka.tools.SimpleConsumerShell --broker-list master:9092,master:9093,master:9094 --topic my-replicated-topic
10、在启用多broker时,其中有节点报错,导致不可用
① 报错一:disconnected before the response was read
Error in response for fetch request (type=FetchRequest, replicaId=0, maxWait=500, minBytes=1, maxBytes=10485760, fetchData={topic-jn-2=PartitionData(fetchOffset=0, logStartOffset=0, maxBytes=1048576, currentLeaderEpoch=Optional[0], lastFetchedEpoch=Optional.empty)}, isolationLevel=READ_UNCOMMITTED, toForget=, metadata=(sessionId=INVALID, epoch=INITIAL), rackId=) (kafka.server.ReplicaFetcherThread)
java.io.IOException: Connection to 1 was disconnected before the response was read
解决方案
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=3
② 报错二:分区ISR列表出现频繁Expanding, Shinking,导致broker不可用
Kafka的集群中有节点日志出现大量的ISR列表频繁Expanding, Shinking问题造成当前节点不可用问题,该问题出现的原因为:Kafka的每个topic有若干个分区partition,每个partiton可能有多个备份,这样就单个分区而言,多个备份中有leader和follower两种角色,follower会定时从leader同步数据,每个分区都有一个ISR列表,该列表表征了分区的多个备份是否在同步中,若follower挂掉或者网络抖动,则被移除ISR列表,若恢复正常,则加入到ISR列表。
若出现ISR频繁的Expanding和 Shinking表明可能是单个分区的数据量过大导致部分分区的follower无法及时备份,或者follower无法及时同步足够的消息已满足ISR判定条件,从而被Shinking清除出ISR列表,瞬间又追上复制速度,从而Expanding加入到ISR列表。
解决方法
修改kafka的配置文件,增加单个broker的复制数据的线程数,降低ISR列表判定条件(时长+条数)。
11、kafka常见问题及解决方案
12、本地springBoot集成kafka
发送消息时报错:org.apache.kafka.common.errors.TimeoutException
本地hosts需要打开配置:127.0.0.1 localhost
听说有一对小情侣买彩票中了800万,咱不做那个梦(祈祷:保佑我赶紧暴富),毕竟是中奖绝缘体(梦想还是要有的)