我试着用卡夫卡。 所有配置都正确完成,但当我试图从控制台产生消息时,我一直得到以下错误
WARN Error while fetching metadata with correlation id 39 :
{4-3-16-topic1=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
Kafka版本:2.11-0.9.0.0
我试着用卡夫卡。 所有配置都正确完成,但当我试图从控制台产生消息时,我一直得到以下错误
WARN Error while fetching metadata with correlation id 39 :
{4-3-16-topic1=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
Kafka版本:2.11-0.9.0.0
当前回答
我让kafka作为Docker容器运行,类似的消息充斥在日志中。 KAFKA_ADVERTISED_HOST_NAME被设置为'kafka'。
在我的例子中,错误的原因是在“kafka”容器本身中缺少“kafka”的/etc/hosts记录。 因此,例如,在'kafka'容器中运行ping kafka将失败,使用ping: bad address 'kafka'
在Docker中,这个问题可以通过指定容器的主机名来解决。
实现它的选项:
Docker run——hostname… Docker运行-add-host… docker-compose中的主机名 AWS EC2任务定义中的主机名
其他回答
这可能与server.properties中的advertised.host.name设置有关。
可能发生的情况是,您的生产者试图找出谁是给定分区的领导者,找出它的advertised.host.name和advertised。端口并尝试连接。 如果这些设置没有正确配置,那么可能会认为领导者不可用。
当我们试图订阅一个尚未创建的主题时,我们往往会收到这条消息。我们通常依赖于在部署环境中预先创建的主题,但我们有针对dockerized kafka实例运行的组件测试,每次都干净启动。
在这种情况下,我们在测试设置中使用AdminUtils来检查主题是否存在,如果不存在就创建它。有关设置AdminUtils的更多信息,请参阅另一个堆栈溢出。
对于任何试图在kubernetes上运行kafka并遇到这个错误的人来说,这是最终为我解决的问题:
你必须:
将主机名添加到pod规范中,这样kafka就可以找到自己。
or
如果使用hostPort,则需要hostNetwork: true和dnsPolicy: ClusterFirstWithHostNet
这样做的原因是因为Kafka需要与自身对话,它决定使用“广告”侦听器/主机名来找到自己,而不是使用localhost。 即使您有一个将所广告的主机名指向pod的Service,它在pod中也不可见。我真的不知道为什么会这样,但至少有一个变通办法。
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
对于我来说,我没有为Kafka实例指定代理id。 当它在Docker环境中重启时,有时会从zookeeper获取一个新的id。 如果您的代理id大于1000,只需指定环境变量KAFKA_BROKER_ID。
使用它可以查看代理、主题和分区。
brew install kafkacat
kafkacat -b [kafka_ip]:[kafka_poot] -L
对我来说,原因是使用了一个特定的Zookeeper,这不是Kafka包的一部分。该Zookeeper已经安装在机器上用于其他目的。显然卡夫卡不会和任何一个动物园管理员合作。切换到卡夫卡附带的Zookeeper为我解决了这个问题。为了不与现有的Zookeeper发生冲突,我不得不修改我的配置,让Zookeeper监听不同的端口:
[root@host /opt/kafka/config]# grep 2182 *
server.properties:zookeeper.connect=localhost:2182
zookeeper.properties:clientPort=2182