领袖在控制台制作人中没有可用的Kafka
我正在尝试使用卡夫卡。 所有configuration都正确完成,但是当我试图从控制台产生消息时,我不断收到以下错误
WARN Error while fetching metadata with correlation id 39 : {4-3-16-topic1=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
任何人都可以请帮助,因为我无法find任何地方的解决scheme?
这可能与server.properties
advertised.host.name
设置有关。
可能发生的事情是,你的制作人试图找出谁是给定分区的领导者,找出它的advertised.host.name
和advertised.port
并尝试连接。 如果这些设置configuration不正确,则可能认为领导者不可用。
我尝试了这里列出的所有build议。 什么对我来说是去server.properties
并添加:
port = 9092 advertised.host.name = localhost
留下listeners
和advertised_listeners
注释。
我有kafka作为Docker容器运行,类似的消息泛滥到日志。
KAFKA_ADVERTISED_HOST_NAME
被设置为“kafka”。
在我的情况下,错误的原因是'kafka'容器中'kafka'丢失的/etc/hosts
logging。
所以,例如,在'kafka'容器中运行ping kafka
将会失败,并且ping: bad address 'kafka'
在Docker方面,通过指定容器的hostname
来解决这个问题。
实现它的选项:
-
docker run --hostname ...
-
docker run -it --add-host ...
- docker-compose中的
hostname
- AWS EC2任务定义中的
hostname
我正在使用kafka_2.12-0.10.2.1:
vi config / server.properties
添加下面的行:
listeners=PLAINTEXT://localhost:9092
- 不需要更改advertised.listeners,因为它从std listener属性中获取值。
经纪人的主机名和港口将向生产者和消费者宣传。 如果没有设置,
- 它使用“侦听器”的值,如果configuration
。 否则,它将使用从java.net.InetAddress.getCanonicalHostName()返回的值。
停止卡夫卡经纪人:
bin/kafka-server-stop.sh
重新启动经纪人:
bin/kafka-server-start.sh -daemon config/server.properties
现在你不应该看到任何问题。
对于任何试图在kubernetes上运行kafka并遇到这个错误的人来说,终于为我解决了这个问题:
你必须:
- 将
hostname
添加到pod规范,这样kafka可以find它自己。
要么
- 如果使用
hostPort
,则需要hostNetwork: true
和dnsPolicy: ClusterFirstWithHostNet
原因是因为Kafka需要与自己交谈,并决定使用“广告”的侦听器/主机名来查找自己,而不是使用本地主机。 即使您拥有一个指向广告主机名称的服务,也不能从广告联盟中看到该服务。 我不知道为什么是这样,但至less有一个解决方法。
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.listeners = PLAINTEXT://my.public.ip:9092 listeners = PLAINTEXT://0.0.0.0:9092
这使得KAFKA经纪人听所有的接口。
当我们尝试订阅尚未创build的主题时,我们倾向于收到此消息。 我们通常依赖于在我们的部署环境中先验创build的主题,但是我们有组件testing,针对一个docker化的kafka实例运行,每次开始清理。
在这种情况下,我们在testing设置中使用AdminUtils来检查主题是否存在,如果不存在则创build它。 有关设置AdminUtils的更多信息,请参阅其他堆栈溢出。
我今天遇到同样的问题。 我所做的解决此错误的方法是在/etc/hosts
文件中进行微妙的修改:
将行127.0.0.1 localhost localhost.localdomain
更改为10.0.11.12 localhost localhost.localdomain
(假设10.0.11.12
是Kafka服务器监听的主机的一个IP地址)
此警告的另一种可能性(在0.10.2.1中)是,您尝试对刚刚创build的主题进行轮询,并且此主题分区的负责人尚未提供,则您正处于领导层选举中。
在主题创build和轮询之间等待一秒钟是一种解决方法。
我正在使用wurstmeister/kafka
-compose来构build使用wurstmeister/kafka
图像的Kafka容器。 将KAFKA_ADVERTISED_PORT: 9092
属性添加到我的KAFKA_ADVERTISED_PORT: 9092
docker-compose
文件中为我解决了这个错误。
对于所有那些与Kafka SSL设置挣扎,看到这个LEADER_NOT_AVAILABLE错误。 其中一个可能被破坏的原因是密钥库和信任库。 在密钥库中,您需要拥有服务器的私钥+签名的服务器证书。 在客户端信任库中,您需要有中间的CA证书,以便客户端可以validationkafka服务器。 如果您将使用SSL进行经纪人间通信,则需要在经纪人的server.properties中设置此信任库,以便彼此进行身份validation。
最后一块,我错误地失踪,并导致我很多痛苦的小时,找出这个LEADER_NOT_AVAILABLE错误可能意味着什么。 希望这可以帮助别人。