我正在尝试使用Kafka。
所有配置都正确完成,但是当我尝试从控制台生成消息时,我不断收到以下错误
WARN Error while fetching metadata with correlation id 39 :
{4-3-16-topic1=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
卡夫卡版本: 2.11-0.9.0.0
2.2.0
在2019
我正在尝试使用Kafka。
所有配置都正确完成,但是当我尝试从控制台生成消息时,我不断收到以下错误
WARN Error while fetching metadata with correlation id 39 :
{4-3-16-topic1=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
卡夫卡版本: 2.11-0.9.0.0
2.2.0
在2019
Answers:
这可能与您advertised.host.name
设置中有关server.properties
。
什么可能发生的是,你的制作人试图找出谁是领导者对给定分区,从其数字advertised.host.name
和advertised.port
,并尝试连接。如果未正确配置这些设置,则可能会认为领导者不可用。
为我解决的是像这样设置侦听器:
advertised.listeners = PLAINTEXT://my.public.ip:9092
listeners = PLAINTEXT://0.0.0.0:9092
这使KAFKA经纪人可以监听所有接口。
我让kafka作为Docker容器运行,类似的消息泛滥成日志。
并KAFKA_ADVERTISED_HOST_NAME
设置为“ kafka”。
在我的情况下,出错的原因是/etc/hosts
“ kafka”容器本身中缺少“ kafka”记录。
因此,例如,ping kafka
在“ kafka”容器中运行会因ping: bad address 'kafka'
就Docker而言,此问题可通过指定hostname
容器来解决。
实现它的选项:
我正在使用kafka_2.12-0.10.2.1:
vi config/server.properties
添加以下行:
listeners=PLAINTEXT://localhost:9092
代理将向生产者和消费者通告的主机名和端口。如果未设置,
否则,它将使用从返回的值java.net.InetAddress.getCanonicalHostName()
。
停止卡夫卡经纪人:
bin/kafka-server-stop.sh
重新启动代理:
bin/kafka-server-start.sh -daemon config/server.properties
现在您应该看不到任何问题。
server.properties
直到我重新加载了代理的守护进程重新启动代理后,修改还不够。也许你应该知道,但可以肯定的帮助有它在这个答案指定
kafka 2.13
在与Kafka一起工作的过去两个星期中,我一直在目睹相同的问题,并且从那时起一直在阅读此Stackoverflow的帖子。
经过2周的分析,我得出结论,在我的情况下,试图产生不存在的话题的信息时就会发生这种情况。
在我的情况下,结果是Kafka发回错误消息,但同时创建了以前不存在的主题。因此,如果在此事件之后我尝试再次向该主题发出任何消息,则该错误将不再作为已创建的主题出现。
请注意:可能是我的特定Kafka安装配置为在不存在该主题时自动创建该主题。这应该可以解释为什么在我的情况下,重置主题后,每个主题只能看到一次该问题:您的配置可能有所不同,在这种情况下,您将一遍又一遍地收到相同的错误。
问候,
卢卡·坦佩里尼(Luca Tampellini)
当我们尝试订阅尚未创建的主题时,我们往往会收到此消息。通常,我们依靠主题在已部署的环境中创建优先级,但是我们有针对dockerized kafka实例运行的组件测试,该实例每次都会启动。
在这种情况下,我们在测试设置中使用AdminUtils来检查主题是否存在,如果不存在则创建它。有关设置AdminUtils的更多信息,请参见其他堆栈溢出。
此警告的另一个可能性(在0.10.2.1中)是,您尝试轮询刚刚创建的主题,并且该主题分区的负责人尚不可用,您正处于领导层选举中。
解决方案是在主题创建和轮询之间等待一秒钟。
对于试图在kubernetes上运行kafka并遇到此错误的任何人,这终于为我解决了它:
您必须:
hostname
到pod规范中,以这种方式kafka可以找到自己。要么
hostPort
,那么你需要hostNetwork: true
和dnsPolicy: ClusterFirstWithHostNet
原因是因为Kafka需要自言自语,并决定使用“公告的”侦听器/主机名来查找自身,而不是使用localhost。即使您有将播发的主机名指向窗格的服务,也无法从窗格中看到它。我真的不知道为什么会这样,但是至少有一种解决方法。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: zookeeper-cluster1
namespace: default
labels:
app: zookeeper-cluster1
spec:
replicas: 1
selector:
matchLabels:
app: zookeeper-cluster1
template:
metadata:
labels:
name: zookeeper-cluster1
app: zookeeper-cluster1
spec:
hostname: zookeeper-cluster1
containers:
- name: zookeeper-cluster1
image: wurstmeister/zookeeper:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 2181
- containerPort: 2888
- containerPort: 3888
---
apiVersion: v1
kind: Service
metadata:
name: zookeeper-cluster1
namespace: default
labels:
app: zookeeper-cluster1
spec:
type: NodePort
selector:
app: zookeeper-cluster1
ports:
- name: zookeeper-cluster1
protocol: TCP
port: 2181
targetPort: 2181
- name: zookeeper-follower-cluster1
protocol: TCP
port: 2888
targetPort: 2888
- name: zookeeper-leader-cluster1
protocol: TCP
port: 3888
targetPort: 3888
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: kafka-cluster
namespace: default
labels:
app: kafka-cluster
spec:
replicas: 1
selector:
matchLabels:
app: kafka-cluster
template:
metadata:
labels:
name: kafka-cluster
app: kafka-cluster
spec:
hostname: kafka-cluster
containers:
- name: kafka-cluster
image: wurstmeister/kafka:latest
imagePullPolicy: IfNotPresent
env:
- name: KAFKA_ADVERTISED_LISTENERS
value: PLAINTEXT://kafka-cluster:9092
- name: KAFKA_ZOOKEEPER_CONNECT
value: zookeeper-cluster1:2181
ports:
- containerPort: 9092
---
apiVersion: v1
kind: Service
metadata:
name: kafka-cluster
namespace: default
labels:
app: kafka-cluster
spec:
type: NodePort
selector:
app: kafka-cluster
ports:
- name: kafka-cluster
protocol: TCP
port: 9092
targetPort: 9092
添加此内容可能会帮助其他人。常见问题可能是的配置错误advertised.host.name
。使用docker-compose进行Docker设置时,KAFKA_ADVERTISED_HOST_NAME
除非您也设置了主机名,否则将无法在其中设置服务的名称。docker-compose.yml
例:
kafka:
image: wurstmeister/kafka
ports:
- "9092:9092"
hostname: kafka
environment:
KAFKA_ADVERTISED_HOST_NAME: kafka
KAFKA_CREATE_TOPICS: "test:1:1"
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
volumes:
- /var/run/docker.sock:/var/run/docker.sock
上面没有尝试连接时hostname: kafka
会发出一个LEADER_NOT_AVAILABLE
。您可以在此处找到有效docker-compose
配置的示例
如果在本地计算机上运行kafka,请尝试使用下面的行更新$ KAFKA_DIR / config / server.properties:
listeners=PLAINTEXT://localhost:9092
然后重新启动kafka。
由于我希望我的kafka经纪人与远程生产者和消费者建立联系,所以我不想advertised.listener
被评论。就我而言(在kubernetes上运行kafka),我发现我的kafka pod没有被分配任何集群IP。通过clusterIP: None
从services.yml中删除该行,kubernetes将一个内部IP分配给kafka pod。这解决了我的LEADER_NOT_AVAILABLE问题,也解决了kafka生产者/消费者的远程连接问题。
当引发LEADER_NOT_AVAILABLE错误时,只需重新启动kafka代理即可:
/bin/kafka-server-stop.sh
其次是
/bin/kafka-server-start.sh config/server.properties
(注意:Zookeeper此时必须正在运行,否则您将无法正常工作)
New leader is 0
。
对于所有努力使用Kafka ssl设置并看到此LEADER_NOT_AVAILABLE错误的用户。可能会损坏的原因之一是密钥库和信任库。在密钥库中,您需要具有服务器的私钥+签名的服务器证书。在客户端信任库中,您需要具有中间的CA证书,以便客户端可以对kafka服务器进行身份验证。如果要使用ssl进行代理间通信,则还需要在代理的server.properties中设置此信任库,以便它们可以彼此进行身份验证。
我错误地遗漏了最后一部分,这使我费了很多时间弄清楚这个LEADER_NOT_AVAILABLE错误的含义。希望这可以帮助某人。
对我而言,原因是使用了不属于Kafka软件包的特定Zookeeper。该Zookeeper已经安装在计算机上用于其他用途。显然,Kafka不适用于任何Zookeeper。切换到Kafka随附的Zookeeper为我解决了。为了不与现有的Zookeeper冲突,我不得不修改配置以使Zookeeper在其他端口上侦听:
[root@host /opt/kafka/config]# grep 2182 *
server.properties:zookeeper.connect=localhost:2182
zookeeper.properties:clientPort=2182
上面答案中提到的广告听众可能是原因之一。其他可能的原因是:
bin/kafka-topics --list --zookeeper <zookeeper_ip>:<zookeeper_port>
另外,请确保将播发的侦听器设置为,IP:9092
而不是localhost:9092
。后者意味着只能通过本地主机访问代理。
当我遇到该错误时,我记得曾经PLAINTEXT://<ip>:<PORT>
在引导服务器列表(或代理列表)中使用过它,但很奇怪。
bin/kafka-console-producer --topic sample --broker-list PLAINTEXT://<IP>:<PORT>