2017-02-23 106 views
1

前幾天我試圖與泊塢窗撰寫和端口映射配置卡夫卡泊塢窗容器,發現有趣的行爲,我不完全理解:爲什麼卡夫卡經紀人連接到自己?

卡夫卡經紀人似乎連接到其自身。爲什麼?

我的設立是:

  • 的Ubuntu 14.04,多克爾1.13.1,多克爾 - 撰寫端口9092 1.5.2
  • 卡夫卡0.10監聽,這個端口是由容器暴露。
  • 在泊塢撰寫我從集裝箱港口9092到本地端口端口映射4005
  • 我advertised.listeners(docker-host:4005),配置爲從撰寫我的泊塢窗主機和本地端口的主機名,因爲經紀人應該從我看到公司網絡。

這一套,當我嘗試發送/讀取數據到/從卡夫卡,所有企圖結束:

Topic metadata fetch included errors: {topic_name=LEADER_NOT_AVAILABLE}

advertised.listeners試圖端口和主機名的各種組合後,我發現唯一的工作組合是localhost:9092。任何嘗試更改主機名或端口都會導致上述錯誤。
這讓我覺得卡夫卡試圖連接到配置爲advertised.listeners的地址,這與主題元數據有某種關係。

那麼多克容器內我做:

  • 將流量重定向到「泊塢窗 - 主機」環回
    echo "127.0.0.1 $ADVERTISED_HOST" >> /etc/hosts
  • 配置卡夫卡監聽所有接口和端口(確切像宣傳的那樣)
    sed -r -i "s/#(listeners)=(.*)/\1=PLAINTEXT:\/\/0.0.0.0:4005/g" $KAFKA_HOME/config/server.properties
  • advertise「docker-host」and external port
    sed -r -i "s/#(advertised.listeners)=(.*)/\1=PLAINTEXT:\/\/$ADVERTISED_HOST:4005/g" $KAFKA_HOME/config/server.properties

現在它就像一個魅力。

不過我還是不明白:

  1. 爲什麼卡夫卡經紀人可能需要通過在advertised.listeners配置的地址連接到它?
  2. 有沒有一種方法可以禁用此功能,或至少將其配置爲使用'listeners'屬性中的地址(使用默認的Kafka端口)?

UPD 值得一提的,下面的設置不起作用:卡夫卡上0.0.0.0:9092聽,標榜偵聽器配置爲docker-host:4005
在這種情況下,只要消費者或生產者連接到kafka,它就會收到LEADER_NOT_AVAILABLE。 在狀態SYN_SENT中,也存在由netstat(容器內)到docker-host:4005的連接。

UPD 2 看起來有類似的問題,與卡夫卡但內部AWS描述here
不同的是,在我的情況下,我想使用不同的Kafka端口。

UPD 3 好了,爲什麼設置在第一UPD款不起作用提到的原因是 - UFW,爲此,通過主機從泊塢窗容器變爲自身的一些原因,堵塞交通。

回答

0

爲什麼卡夫卡經紀人可能需要通過在advertised.listeners中配置的地址 連接到自己?

當一個卡夫卡經紀人第一次被客戶端連接時,它會回覆它希望客戶將來使用的地址與經紀人通話。這就是advertised.listeners屬性中設置的內容。如果您沒有設置此屬性,則將使用聽衆的值代替(這會回答您的第二個問題)。

因此,您的「問題」是,遠程客戶端連接到您的主機:9092,因爲您轉發了端口,因此代理會以「您可以在localhost:9092聯繫到我」和客戶端它發送下一個數據包,它只是連接回自己。 這裏的元數據並不真正相關,它只是第一個被請求的請求。 您的解決方案對於此設置是正確的,我認爲,Kafka會監聽本地接口並將advertised.listeners設置爲您公司網絡中的某個人將連接到的主機。 我不會100%知道經紀商是否需要連接自己,很確定那不是那種情況。我認爲你的設置也可以在你的/ etc/hosts文件中沒有輸入外部主機名的情況下工作。

有沒有一種方法來禁用此或至少其配置爲使用來自「聽衆」財產地址 (默認端口卡夫卡)?

見上

+0

嗨Sönke,感謝您的回答,你的權利就「監聽器」和「advertised.listener」的意思,但是當我配置不同的地址和端口(請參閱我的更新問題),它仍然不起作用。 – Grigory

相關問題