2017-01-19 68 views
3

我開始使用Confluent Kafka,它需要運行Zookeeper(zookeeper-server-start /etc/kafka/zookeeper.properties),然後是Kafka(kafka-server-start /etc/kafka/server.properties)。我正在編寫一個應該運行Kafka和Zookeeper的Upstart腳本。問題是卡夫卡應該阻塞,直到Zookeeper準備好(因爲它依賴於它),但我找不到一個可靠的方法來知道什麼時候Zookeeper準備好了。這裏有一些嘗試以僞代碼運行動物園管理員服務器啓動後:如何啓動Zookeeper,然後是Kafka?

  1. 使用硬編碼塊

    sleep 5 
    

    不能在較慢的計算機上可靠地工作和/或等待時間超過需要。

  2. 檢查時的東西(希望動物園管理員)在端口2181

    wait until $(echo stat | nc localhost ${port}) is not none 
    

    此運行似乎沒有工作,因爲它不等待足夠長的動物園管理員接受卡夫卡連接。

  3. 檢查日誌

    wait until specific string in zookeeper log is found 
    

    這是簡略,竟然沒有不能也錯誤地發現了太多的字符串(如「綁定到端口[...]」)。

有沒有一種可靠的方法來了解Zookeeper何時可以接受Kafka連接?否則,我將不得不求助於從您的評論的1和2

+0

我會期望技術#2足夠。你可以在嘗試技術#2時添加關於啓動失敗的更多細節嗎? –

+1

@ChrisNauroth我在技術#2中獲得的Kafka確切的錯誤如下:「致命[Kafka Server 0],在KafkaServer啓動過程中致命錯誤。準備關閉(kafka.server.KafkaServer) java.lang.RuntimeException :代理已經在路徑/ brokers/ids/0上註冊,這可能表明您已經配置了一個已經在使用的brokerid,或者您已經關閉了該代理,並且以比zookeeper超時更快的速度重新啓動它,重新註冊「。 - 如果我在此之後添加延遲,這很好。 – nico

回答

3

卡夫卡錯誤消息的組合肯定是相關的:

FATAL [卡夫卡服務器0],致命錯誤KafkaServer啓動過程中。準備關閉(kafka.server.KafkaServer)java.lang.RuntimeException:代理已經在路徑/ brokers/ids/0上註冊。這可能表明您要麼配置了一個已經在使用的brokerid,要麼就關閉了這個broker,並以比動物園管理員超時更快的速度重新啓動它,這似乎是重新註冊的。

這表明ZooKeeper已啓動並正在運行,並且Kafka能夠連接到它。正如我所料,技術#2足以驗證ZooKeeper已準備好接受連接。

相反,問題似乎在卡夫卡方面。它已經註冊了一個ZooKeeper ephemeral node來代表最初的卡夫卡經紀人。當客戶端的ZooKeeper會話過期時,會自動刪除一個短暫節點(例如,該進程終止,因此停止對ZooKeeper進行心跳檢測)。但是,這是基於超時的。如果Kafka代理快速重新啓動,那麼在重新啓動後,它會看到代表該代理的znode已經存在。對於新流程的開始,這看起來好像已經有一個經紀人在該路徑上啓動並註冊。由於券商預計會有唯一的ID,因此會中止投資。

等待一段時間過去ZooKeeper會話過期是對這個問題的適當迴應。如有必要,您可以按照ZooKeeper Administrator's Guide中的討論,調整會話過期的速度。 (參見tickTime,minSessionTimeoutmaxSessionTimeout的討論。)但是,將會話過期調整爲過快可能會導致客戶端在正常操作期間遇到虛假的會話過期。

我對卡夫卡的知識較少,但也許卡夫卡方面也可以做些什麼。我知道像Apache Ambari這樣的管理工具會採取措施來保證在配置時向每個代理分配唯一的ID。

+2

卡夫卡本身爲其經紀商提供了一個唯一的ID。該功能由Hortonworks員工提供,因此Ambari可能正在使用此功能? –

相關問題