遇到的問題:
在本機或者其他機器telnet IP 9092,通,使用域名也通,telnet 127.0.0.1 9092不通
host.name
:按配置文件說明,是Kafka綁定的interface。其實這個說明有點誤導,下面會見到。
advertised.host.name
:是注冊到zookeeper,client要訪問的broker地址。(可能producer也是拿這個值,沒有驗證)
如果advertised.host.name沒有設,會用host.name的值注冊到zookeeper,如果host.name也沒有設,則會使用JVM拿到的本機hostname注冊到zk。
這里有兩個坑要注意:
-
如果advertised.host.name沒有設,host.name不能設為0.0.0.0,否則client通過zk拿到的broker地址就是0.0.0.0。
如果指定要bind到所有interface,host.name不設就可以。 -
如果host.name和advertised.host.name都不設,client通過zk拿到的就是JVM返回的本機hostname,如果這個hostname是client無法訪問到的,client就會連不上broker。
所以如果要bind到所有interface,client又能訪問,解決的辦法是host.name不設或設置0.0.0.0,advertised.host.name一定要設置為一個client可以訪問的地址,如直接設IP地址。
如果不需要bind到所有interface,也可以只在host.name設置IP地址。
簡單的檢查broker是否可以被client訪問到的辦法,就是在zookeeper中看broker信息,上面顯示的hostname是否是client可以訪問到的地址。
在zkCli中執行get /brokers/<id>
advertised.listeners=PLAINTEXT://docp1:9092 設了這個值就不用advertised.host.name 和 host.name選項了