2016-03-04 41 views
67

我正在嘗試使用卡夫卡。所有配置都正確完成,但是當我試圖從生產控制檯消息我不斷收到以下錯誤領導者無法在控制檯生產者中使用卡夫卡

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

任何人都可以請幫助,因爲我無法找到任何解決方案地方?

+0

您使用的是什麼版本的卡夫卡folowed?你怎麼知道所有的配置都是正確的?請嘗試添加更多信息 – Nautilus

+0

我使用的是2.11-0.9.0.0版本,我說所有的配置都是正確的,因爲它工作正常。 – Vishesh

+1

@VISHESH你能提供以下命令的結果嗎? ./bin/kafka-topics.sh --zookeeper localhost:2181 --describe --topic yourTopicName – avr

回答

1

今天我遇到了同樣的問題。我做了什麼來解決這個錯誤是使/etc/hosts文件中的細微修改:

行更改127.0.0.1 localhost localhost.localdomain10.0.11.12 localhost localhost.localdomain

(假設10.0.11.12是您的主機的IP地址(ES)卡夫卡服務器監聽之一)

47

它可能與advertised.host.name設置在您的server.properties

可能發生的情況是,您的製作人試圖找出誰是給定分區的領導者,計算出其advertised.host.nameadvertised.port並嘗試連接。 如果這些設置配置不正確,則可能認爲領導者不可用。

+0

這爲我修正了錯誤..但server.properties中的註釋說如果advertised.host.name未配置,它將使用host.name。 host.name在server.properties文件中配置。 –

+0

我得到了同樣的問題,這對我kafka 0.9 – minhas23

2

當我們嘗試訂閱尚未創建的主題時,我們傾向於收到此消息。我們通常依賴於在我們的部署環境中先驗創建的主題,但是我們有組件測試,這些組件測試是針對docker化的kafka實例運行的,該實例每次都會開始清理。

在這種情況下,我們在我們的測試設置中使用AdminUtils來檢查主題是否存在,如果不存在則創建它。有關設置AdminUtils的更多信息,請參閱此other堆棧溢出。

20

我把kafka作爲Docker容器運行,類似的消息氾濫到日誌中。
並且KAFKA_ADVERTISED_HOST_NAME被設置爲'kafka'。

在我的情況下,錯誤的原因是'kafka'容器中'kafka'的缺失/etc/hosts記錄。
因此,例如,運行ping kafka內「卡夫卡」集裝箱將失敗ping: bad address 'kafka'

在泊塢窗而言,這個問題變得由容器指定hostname解決。

選項來實現它:

+0

這並不是一個答案,但爲了將來的參考:當(或如果)[碼頭/碼頭#1143](https://github.com/docker/ docker/issues/1143)已解決,將有一個簡單的方法來引用容器的主機 - 無論使用哪個操作系統。 –

+0

對於讀者請確保您檢查KAFKA_ADVERTISED_PORT太 – Brice

+0

謝謝,docker-compose中的主機名提示使我的日子 –

34

我想在這裏列出的所有建議。什麼工作對我來說是去server.properties並添加:

port = 9092 
advertised.host.name = localhost 

離開listenersadvertised_listeners註釋掉。

+3

解決方案適用於我([vikas的解決方案鏈接](http://stackoverflow.com/a/40732119/3057986) ) 只想在MAC上加上'server.properties'文件位於'/ usr/local/etc/kafka /' –

+0

@EdisonQ非常感謝! –

+1

什麼對我有效這是 'advertised.listeners = PLAINTEXT://my.ip:9092'' –

2

此警告的另一種可能性(在0.10.2.1中)是您嘗試對剛剛創建的主題進行輪詢,並且此主題分區的負責人尚不可用,您處於領導層中間選舉。

在主題創建和輪詢之間等待一秒鐘是一種解決方法。

2

我正在使用docker-compose構建使用wurstmeister/kafka圖片的Kafka容器。將KAFKA_ADVERTISED_PORT: 9092屬性添加到我的docker-compose文件爲我解決了這個錯誤。

8

我使用kafka_2.12-0.10.2.1:

VI的config/server.properties

下面添加一行:

listeners=PLAINTEXT://localhost:9092 
  • 無需更換播發。聽衆,因爲它從std listener屬性中拾取值 。

經紀人的主機名和端口將通告給生產者和消費者。如果沒有設置,

  • 它使用值 「聽衆」 如果配置

。否則,它將使用從java.net.InetAddress.getCanonicalHostName()返回的值。

停止卡夫卡經紀人:

bin/kafka-server-stop.sh 

重啓券商:

bin/kafka-server-start.sh -daemon config/server.properties 

,現在你不會看到任何問題。

4

對於任何試圖在kubernetes運行卡夫卡和運行到這個錯誤,這是最終解決了這個問題對我來說:

您必須要麼:

  1. 添加hostname到POD規範,即方式卡夫卡可以找到自己。

使用 hostPort
  • 如果,那麼你需要hostNetwork: truednsPolicy: ClusterFirstWithHostNet
  • 這樣做的原因是因爲卡夫卡需要傾訴本身,它決定使用'廣告'偵聽器/主機名來查找自己,而不是使用本地主機。 即使您有一個將廣告主機名稱指向該容器的服務,也不能從該容器內看到該服務。我不知道爲什麼會這樣,但至少有一種解決方法。

    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 
    
    +1

    1.不起作用%ERROR:本地:主機解析失敗:kafka-cluster:9092/1001:無法解析'kafka-cluster:9092':節點名或服務器名已提供或未知 – Lu32

    6

    什麼解決了這個問題對我來說是設置監聽器,像這樣:

    advertised.listeners = PLAINTEXT://my.public.ip:9092 
    listeners = PLAINTEXT://0.0.0.0:9092 
    

    這使得KAFKA經紀人聽取所有接口。

    0

    對於所有與Kafka ssl設置相關的人而言,看到這個LEADER_NOT_AVAILABLE錯誤。可能被破壞的原因之一是密鑰庫和信任庫。在密鑰庫中,您需要擁有服務器的私鑰+簽名的服務器證書。在客戶端信任庫中,您需要具有intermedidate CA證書,以便客戶端可以對kafka服務器進行身份驗證。如果您將使用SSL來進行經紀人間通信,則需要在經紀人的server.properties中設置此信任庫,以便彼此進行身份驗證。

    最後一件我錯誤地失蹤了,並且讓我花了很多痛苦的時間找出這個LEADER_NOT_AVAILABLE錯誤可能意味着什麼。希望這可以幫助某人。

    1

    因爲我想讓我的卡夫卡經紀人與遠程生產者和消費者聯繫,所以我不希望advertised.listener被註釋掉。就我而言,(在kubernetes上運行kafka),我發現我的kafka pod沒有分配任何Cluster IP。通過從services.yml中刪除行clusterIP: None,kubernetes將內部IP分配給kafka pod。這解決了我的LEADER_NOT_AVAILABLE問題,也解決了卡夫卡生產者/消費者的遠程連接問題。

    1

    當LEADER_NOT_AVAILABLE錯誤拋出,只需重新啓動卡夫卡經紀人:

    /bin/kafka-server-stop.sh 
    

    通過

    /bin/kafka-server-start.sh config/server.properties 
    
    +0

    是。當卡夫卡首先啓動後,動物園管理員會發生這種情況。 – panchicore

    相關問題