kafka 操作与故障记录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012266559/article/details/82837818

术语

消息由producer产生,消息按照topic归类,并发送到broker中,broker中保存了一个或多个topic的消息,consumer通过订阅一组topic的消息,通过持续的poll操作从broker获取消息,并进行后续的消息处理。

broker
一个kafka集群包含一个或多个服务器,这些服务器称为broker,保存producer发送的消息

topic
每条发送到broker的消息都有一个类别,这个类别称为topic

partition
一个topic的消息实际上由多个队列存储的,一个队列在kafka上称为一个分区

producer
负责发送指定topic的消息到broker

consumer
消息读取客户端,通过订阅一组topic的消息从broker拉取消息

consumer group
每隔consumer术语一个消费者组,具有相同的group.id的消费客户端术语同一个消费者。通过设置一个消息消费者group.id是否相同可以分为单播消费(集群消费)或广播消费
假如一个消费者组有两个消费者,订阅了一个具有4个分区的topic的消息,那么这个消费者组的每一个消费者都会消费两个分区的消息。
消费者组的成员是动态维护的,如果新增或者减少了消费者组中的消费者,那么每隔消费者消费的分区的消息也会动态变化。比如原来一个消费者有两个消费者,其中一个消费者因为故障而不能继续消费消息了,那么剩下一个消费者将会消费全部4个分区的消息。

offset
偏移量。kafka为每条在分区的消息保存一个偏移量offset,这也是消费者在分区的位置。比如一个偏移量是5的消费者,表示已经消费了从0-4偏移量的消息,下一个要消费的消息的偏移量是5

在这里插入图片描述

命令操作

// server
// 需要先启动 zookeeper
./kafka-server-start.sh config/server-3.properties &

// topic
// zookeeper port 2181
// topic副本数不能大于 broker数量
./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 2 --partitions 1 --topic test
./kafka-topics.sh --list --zookeeper localhost:2181
./kafka-topics.sh --describe --zookeeper localhost:2181

// 生产者,消费者
// 指定本地 broker 信息,端口信息
./kafka-console-producer.sh --broker-list localhost:9092 --topic test
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning

消费者消费不到信息

指定错误的 broker

./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning

kafka-console-consumer.sh 并不会对 server进行验证,即使是错误的地址也不会报错。

客户端版本与服务端不一致

来自blog

解决:
我这里服务端使用的是:kafka_2.10-0.8.2.1.tgz,客户端原来使用的是0.8.1,需要改为:

<dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka_2.9.2</artifactId>
        <version>0.8.2.1</version>
</dependency>

使用kafka的时候要注意,kafka客户端(kafka-client)的版本要和kafka服务器的版本一一对应,否则,消息发送会失败。

advertised.listeners or listeners

# The address the socket server listens on. It will get the value returned from 
# java.net.InetAddress.getCanonicalHostName() if not configured.
#   FORMAT:
#     listeners = listener_name://host_name:port
#   EXAMPLE:
#     listeners = PLAINTEXT://your.host.name:9092
listeners=PLAINTEXT://:9092

# Hostname and port the broker will advertise to producers and consumers. If not set, 
# it uses the value for "listeners" if configured.  Otherwise, it will use the value
# returned from java.net.InetAddress.getCanonicalHostName().
#advertised.listeners=PLAINTEXT://your.host.name:9092

kafka server端口由
listeners=PLAINTEXT://:9092 advertised.listeners=PLAINTEXT://your.host.name:9092
进行设置。两者都设置时候首先使用 advertised.listeners。如果都没设置,就采用 java.net.InetAddress.getCanonicalHostName() 的返回值(测试是 localhost:9092)。

kafka(java客户端)消费者取不到消息,生产者消息也没发送成功
描述在命令工具可以正常但是 java 消费不了的情况。
解决方案:

将kafka/config/server.properties文件中advertised.listeners改为如下属性。192.168.75.137是我虚拟机的IP。改完后重启,OK了。Java端的代码终于能通信了
advertised.listeners=PLAINTEXT://192.168.75.137:9092

springboot kafka消费者获取不到信息

来自博客:https://blog.csdn.net/qq_36752632/article/details/79267390
本地单机部署kafka,测试时发现生产者可以正常生成,但是消费者不能接收到信息:
我的问题是在kafka有一个配置文件consumer.properties,里面有group-id的配置,默认只有一个test-consume-group,如果不配置的话,只有该组的消费者才能接受消息,所以我测试时无法接受到信息。增加后即可正常消费 。

topic leader -1

来自博客:https://blog.csdn.net/LG772EF/article/details/65633359

  1. broker shutdown的时候,partition的leader在此broker上,controller选主没有成功,移除此broker后,对应的partition的leader就被赋值成-1了。
  2. 给此broker发送stopReplicaRequest
    调用controller.removeReplicaFromIsr,从zk读取当前partition的状态,从isr中移除此broker,并更新zk信息(如果leader为此broker,则新leader被置为-1,代表没有leader,为什么没有选择isr中其他broker为leader?)
    发送leaderAndIsrRequest到此partition的leader,发送updateMetaRequest给所有broker
    更新ReplicaStateMachine中replicaState的状态。
问题原因:

公司部署的kafka有三台机器组成了一个集群,这个topic只建立了一个分区, 对应分区挂掉后,leader变成了-1,无法进行消息处理? 重启这台机器后也不行?
据运维同事反应,早上有一台kafka挂掉了,然后重启了。

待验证的猜想: kafka集群中,某个topic只有一个分区,对应分区机器挂掉后重启,Leader仍无法恢复?

自己本机验证的时候,创建topic只有一个分区,对应leader的kafka关掉后,消息发送异常,leader为-1, 再启动此kafka,其他的kafka不重启,消息可以正常通讯

解决思路

修改默认topic创建的分区数,可以是集群机器的整数倍。
对已有topic调整。
1:重新部署kafka,修改配置。 此时原有消息内容全部丢失;
2:针对具体topic来修改分区数

猜你喜欢

转载自blog.csdn.net/u012266559/article/details/82837818