kafka的advertised.host.name參數 外網訪問配置


kafka的server.properties文件

```host.name```開始只綁定在了內部IP上,對外網卡無法訪問。

把值設置為空的話會kafka監聽端口在所有的網卡上綁定。但是在外網訪問時,客戶端又遇到了```java.nio.channels.ClosedChannelException```異常信息,server端用tcpdump分析的時候發現客戶端有傳遞kafka所在機器的機器名過來。在client里斷點跟蹤一下發現是findLeader的時候返回的元信息是機器名而不是IP。客戶端無法解析這個機器名所以出現了前面的異常。

在server.properties 里還有另一個參數是解決這個問題的, advertised.host.name參數用來配置返回的host.name值,把這個參數配置為外網IP地址即可。

這個參數默認沒有啟用,默認是返回的java.net.InetAddress.getCanonicalHostName的值,在我的mac上這個值並不等於hostname的值而是返回IP,但在linux上這個值就是hostname的值。

除了IP之外,還有PORT,外網對應的PORT也需要修改。以下是server.properties文件對應位置。

# Hostname the broker will advertise to producers and consumers. If not set, it uses the
# value for "host.name" if configured. Otherwise, it will use the value returned from
# java.net.InetAddress.getCanonicalHostName().
#advertised.host.name=<hostname routable by clients>
 
# The port to publish to ZooKeeper for clients to use. If this is not set,
# it will publish the same port that the broker binds to.
#advertised.port=<port accessible by clients>

 


 

當Kafka broker啟動時,它會在ZK上注冊自己的IP和端口號,客戶端就通過這個IP和端口號來連接。

在AWS這種IaaS環境下,由於java.net.InetAddress.getCanonicalHostName調用拿到的HostName是類似ip-172-31-10-199這樣的只有內網才能訪問到的主機名,所以默認注冊到ZK上的IP是內網才能訪問的內網IP。

此時就需要顯示指定 advertised.host.nameadvertised.listeners參數,讓注冊到ZK上的IP是外網IP。

例如對於 59.64.11.22 IP對應的broker,需要在 server.properties 配置文件里增加如下三個配置:

 

新版配置
advertised.listeners=PLAINTEXT: //59.64.11.22:9092

 

估計讀者們也會跟我一樣犯迷糊,為什么需要三個參數來配置IP和端口號呢,用一個advertised.listeners不就搞定了嗎?

后來發現最新版本0.10.x broker配置棄用了advertised.host.name 和 advertised.port 這兩個個配置項,就配置advertised.listeners就可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM