Kafka的監(jiān)聽地址配置實例詳解
有時我們會碰到網(wǎng)絡(luò)是通暢的,但卻連不上Kafka,特別是在多網(wǎng)卡環(huán)境或者云環(huán)境上很容易出現(xiàn),這個其實和Kafka的監(jiān)聽配置有關(guān)系。本文介紹監(jiān)聽相關(guān)的配置,目前監(jiān)聽相關(guān)的參數(shù)主要有下面幾個:
- listeners
- advertised.listeners
- listener.security.protocol.map
- inter.broker.listener.name
- security.inter.broker.protocol
advertised.host.name(歷史遺留,已廢棄,勿使用)advertised.port(歷史遺留,已廢棄,勿使用)host.name(歷史遺留,已廢棄,勿使用)
其中最重要的就是listeners和advertised.listeners:集群啟動時監(jiān)聽listeners配置的地址,并將advertised.listeners配置的地址寫到Zookeeper里面,作為集群元數(shù)據(jù)的一部分。我們可以將客戶端(生產(chǎn)者/消費者)連接Kafka集群進(jìn)行操作的過程分成2步:
- 通過listeners配置的連接信息(ip/host)連接到某個Broker(broker會定期獲取并緩存zk中的元數(shù)據(jù)信息),獲取元數(shù)據(jù)中advertised.listeners配置的地址信息。
- 通過第1步獲取的advertised.listeners連接信息和Kafka集群通信(讀/寫)。
所以在存在內(nèi)外網(wǎng)隔離的虛擬化環(huán)境中(比如Docker、公有云),外部客戶端經(jīng)常會出現(xiàn)可以連接到Kafka(第1步),但發(fā)送/消費數(shù)據(jù)時報連接超時(第2步),就是因為listeners配置的是外網(wǎng)地址,而advertised.listeners配置的卻是內(nèi)網(wǎng)地址。那這幾個參數(shù)該如何配置呢?
先看連接信息的配置格式:{listener名字}://{HOST/IP}:{PORT}
。HOST/IP、PORT很清楚,主要是這個“listener名字”字段。要理解這個得了解listener.security.protocol.map
這個配置項:它的用途是配置listener名字和協(xié)議的映射(所以它是一個key-value的map),key是“listener名字”,value是“協(xié)議名稱”,其默認(rèn)值是“listener名字”和“協(xié)議名稱”一樣。有點繞,舉個例子,比如:PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL,冒號前面是key,即協(xié)議名字;后面是value,即協(xié)議名稱。listener名字我們可以隨便起,而協(xié)議名稱則是固定可枚舉的一個范圍。所以如果我們自定義了listener名字,那就需要顯式的設(shè)置其對應(yīng)的協(xié)議名。
inter.broker.listener.name和security.inter.broker.protocol都是用于配置Broker之間通信的,前者配置名稱(即listener.security.protocol.map中的key),后者配置協(xié)議(即listener.security.protocol.map中的value),默認(rèn)值是PLAINTEXT。這兩個配置項同時只能配置一個。
為什么一個連接要搞這么復(fù)雜呢?主要是為了各種不同的場景需求。下面舉一個復(fù)雜一點的應(yīng)用場景進(jìn)行說明。比如我們在一個公有云上面部署了一個Kafka集群,該環(huán)境有一個外網(wǎng)地址external_hostname和一個內(nèi)網(wǎng)地址internal_hostname;且在內(nèi)部中是無法獲取外網(wǎng)地址的(公有云大多都是這樣的)。然后想實現(xiàn)內(nèi)部客戶端訪問集群時走內(nèi)部地址,且不需要加密;而外部客戶端訪問時則走外部地址,且需要加密。要實現(xiàn)這個需求,可以對集群進(jìn)行如下配置:
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:SSL listeners=INTERNAL://0.0.0.0:19092,EXTERNAL://0.0.0.0:9092 advertised.listeners=INTERNAL://{internal_hostname}:19092,EXTERNAL://{external_hostname}:9092 inter.broker.listener.name=INTERNALlistener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:SSL
其實更進(jìn)一步,我們還可以通過可選的control.plane.listener.name參數(shù)單獨定制集群Controller節(jié)點與其他Broker節(jié)點的連接,那配置信息就變?yōu)椋?/p>
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:SSL,CONTROL:SSL listeners=INTERNAL://0.0.0.0:19092,EXTERNAL://0.0.0.0:9092 advertised.listeners=INTERNAL://{internal_hostname}:19092,EXTERNAL://{external_hostname}:9092,CONTROL://{control_ip}:9094 inter.broker.listener.name=INTERNAL control.plane.listener.name=CONTROL
最后給出這些配置項的默認(rèn)值和一些注意事項:
- listeners如果不顯式的配置,那會監(jiān)聽所有網(wǎng)卡,相當(dāng)于配置了0.0.0.0。該配置項里面listeners名字和端口都必須是唯一的,不能重復(fù)。
- advertised.listeners如果不配置,默認(rèn)使用listeners配置的值。如果listeners也沒有顯式配置,則使用java.net.InetAddress.getCanonicalHostName()獲取的IP地址。如果listeners配置的是0.0.0.0,則必須顯式的配置advertised.listeners,因為這個配置項必須是一個具體的地址,不允許是0.0.0.0(因為客戶端無法根據(jù)這個地址連接到Broker)。另外,advertised.listeners中的端口允許重復(fù)。
- 對于listeners和advertised.listeners,有多個地址的時候,每一個地址都必須按照{(diào)listener名字}://{HOST/IP}:{PORT}格式進(jìn)行配置,多個地址用英文逗號分隔。
- 如果集群所有節(jié)點的hostname在客戶端和服務(wù)端各節(jié)點之間可以正確解析,優(yōu)先使用hostname,而不是IP。因為代碼里面使用了java.net.InetAddress.getCanonicalHostName(),有時使用IP會出現(xiàn)訪問不通的情況。
總結(jié):
listeners地址是用于首次連接的;advertised.listeners的地址是會寫到zk里面,客戶端通過listeners地址建立連接獲取該地址信息,然后通過該地址和集群交互。所以對于客戶端,這2個地址必須都是可以訪問的才可以。
到此這篇關(guān)于Kafka監(jiān)聽地址配置的文章就介紹到這了,更多相關(guān)Kafka監(jiān)聽地址配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot整合mybatis的超詳細(xì)過程(配置模式+注解模式)
這篇文章主要介紹了springboot整合mybatis的詳細(xì)過程(配置模式+注解模式),這里我使用的是配置模式+注解模式所以需要配置全局文件,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04Java中BufferedReader類獲取輸入輸入字符串實例
這篇文章主要介紹了Java中BufferedReader類獲取輸入輸入字符串實例,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-02-02MyBatis-Plus中MetaObjectHandler沒生效完美解決
在進(jìn)行測試時發(fā)現(xiàn)配置的MyMetaObjectHandler并沒有生效,本文主要介紹了MyBatis-Plus中MetaObjectHandler沒生效完美解決,具有一定的參考價值,感興趣的可以了解一下2023-11-11Apache Commons Math3探索之快速傅立葉變換代碼示例
這篇文章主要介紹了Apache Commons Math3探索之快速傅立葉變換代碼示例,具有一定參考價值,需要的朋友可以了解下。2017-10-10springboot2.x實現(xiàn)oauth2授權(quán)碼登陸的方法
這篇文章主要介紹了springboot2.x實現(xiàn)oauth2授權(quán)碼登陸的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08SpringBoot @FixMethodOrder 如何調(diào)整單元測試順序
這篇文章主要介紹了SpringBoot @FixMethodOrder 調(diào)整單元測試順序方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09