Kafka內外網訪問


本文介紹了Kafka內外網訪問的設置。

kafka的兩個配置listeners和advertised.listeners

listeners

kafka監聽的網卡的ip,假設你機器上有兩張網卡,內網192.168.0.213和外網101.89.163.1 如下配置

listeners=PLAINTEXT://192.168.0.213:9092

那么kafka只監聽內網網卡,即只接收內網網卡的數據,如果你不能把外網網卡流量轉發到內網網卡(為什么要強調這一點,下面說),那么kafka就接收不到外網網卡數據。如果配置成外網ip同理。當然你可以配置成0.0.0.0,監聽所有網卡。

advertised.listeners

我們觀察kafka的配置文件server.properties,會發現里面記錄了zookeeper集群的各個節點的訪問地址,但是並沒有記錄kafka兄弟節點的地址。kafka節點啟動后,會向zookeeper注冊自己,同時從zookeeper中獲取兄弟節點的地址,以便與兄弟節點通信。
同樣,我們使用客戶端連接kafka后,kafka返回給客戶端的是集群各節點的訪問地址,這個地址也是上面說的從zookeeper中獲得的地址。
這個地址哪里來,就是kafka節點向zookeeper注冊時提供的advertised.listeners。如果沒有,就會使用listeners

三種情景,搭配使用這兩個配置

只需要內網訪問kafka

listeners=PLAINTEXT://192.168.0.213:9092

只需要內網訪問kafka

你肯定想到了最簡單的一個方法,listeners使用外網ip

listeners=PLAINTEXT://101.89.163.1:9092

需要外網訪問

如果宿主機有外網網卡,這么配當然沒問題。如果沒有(ifconfig看不到外網ip的網卡,基本上就不存在這個外網網卡),很可能和我使用的的宿主機一樣是通過NAT映射或者啥辦法搞出來的外網ip,此時kafka無法監聽這個外網ip(因為不存在,啟動就會報錯)。
這時候就是advertised.listeners真正發揮作用的時候了。使用如下配置:

listeners=PLAINTEXT://192.168.0.213:9092
advertised.listeners=PLAINTEXT://101.89.163.1:9092

此時一個完整的kafka客戶端訪問服務端的流程:

  • 客戶端訪問101.89.163.1:9092,被kafka宿主機所在環境映射到內網192.168.0.213:9092,訪問到了kafka節點,請求獲得kafka服務端的訪問地址
  • kafka從zookeeper拿到自己和其他兄弟節點通過advertised.listeners注冊到zookeeper的101.89.163.1:9092等外網地址,作為kafka的服務端訪問地址返回給客戶端
  • 客戶端拿這些地址訪問kafka集群,被kafka宿主機所在環境映射到各kafka節點的內網ip,訪問到了kafka服務端......完美循環

你可能會問已經配置了訪問地址,為什么還要在第一次訪問的時候請求獲得kafka的訪問地址。因為如果是kafka集群,你可以選擇只給客戶端配置一個kafka節點的地址(這樣是不推薦的),但是客戶端必須要訪問集群中的每一個節點,所以必須通過這個節點獲得集群中每一個節點的訪問地址。
如果不配置advertised.listeners=PLAINTEXT://101.89.163.1:9092,你會發現雖然你給kafka客戶端配置的訪問地址是101.89.163.1:9092,但是kafka客戶端訪問時報錯,報錯原因是Connection to node -1[192.168.0.213:9092] could not be established. Broker may not be available.。這就是因為不配置advertised.listenersadvertised.listeners默認使用listeners配置的地址,客戶端拿到的就是listeners配置的內網地址

內外網分流

上面說的有外網ip的情況,直接配置外網ip有沒有問題呢?
如果既要內網訪問,又要外網訪問,本來可以走內網的流量都走外網網卡,顯然不合適;而且有的環境可能被配置成這些kafka宿主機是沒有外網訪問權限的,即雖然他可以訪問自己的外網ip,但是訪問不了兄弟節點的外網ip。這時候就要配置內外網。
配置1:
{{< codes 配置1 配置2>}}
{{}}

listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
listeners=INTERNAL://192.168.0.213:9092,EXTERNAL://192.168.0.213:19092
advertised.listeners=INTERNAL://192.168.0.213:9092,EXTERNAL://101.89.163.9:19092
inter.broker.listener.name=INTERNAL

{{}}
{{}}

listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
listeners=INTERNAL://192.168.0.213:9092,EXTERNAL://101.89.163.9:19092
advertised.listeners=INTERNAL://192.168.0.213:9092,EXTERNAL://101.89.163.9:19092
inter.broker.listener.name=INTERNAL

{{}}
{{}}
注意這兩的區別是listenersEXTERNAL使用的ip不一樣,一個使用內網ip,一個使用外網ip。

  • 如果你的kafka宿主機有外網網卡,只能用外網ip,若使用配置1,kafka通過listeners監聽的兩個端口都是內網網卡的數據,無法接收到外網網卡數據;
  • 如果你的kafka宿主機外網ip是映射來的,只能使用內網ip,原因也是上面說過的,不存在外網網卡,kafka啟動監聽就會報錯,而使用內網ip有環境配置好的轉發,可以接收到外網ip的數據。

轉自cdops運維博客


免責聲明!

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



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