將kafka集群端口映射到公網(wǎng)訪問

場(chǎng)景假設(shè)
比如你有一個(gè)kafka集群,在同一個(gè)vpc(私有網(wǎng)絡(luò))里面也即是在一個(gè)內(nèi)網(wǎng)環(huán)境里,該kafka集群有3個(gè)broker,broker1、broker2和broker3。
kafka集群信息如下:
broker1 IP: 192.168.xxx.1
broker2 IP: 192.168.xxx.2
broker3 IP: 192.168.xxx.3
kafka集群各個(gè)節(jié)點(diǎn) server.properties配置
config/server-1.properties:
broker.id=1
listeners=PLAINTEXT://192.168.xxx.1:19092
config/server-2.properties:
broker.id=2
listeners=PLAINTEXT://192.168.xxx.2:19092
config/server-3.properties:
broker.id=3
listeners=PLAINTEXT://192.168.xxx.3:19092
現(xiàn)在希望通過配置vpc公網(wǎng)ip做端口轉(zhuǎn)發(fā)(也可以通過nginx做端口轉(zhuǎn)發(fā)),就可以通過外網(wǎng)訪問了(但是實(shí)際用kafka客戶端連接會(huì)報(bào)超時(shí))
想通過vpc外的機(jī)器來訪問kafka集群,也就想訪問192.168.xxx.1:19092,192.168.xxx.2:19092,192.168.xxx.3:19092
在vpc上做端口轉(zhuǎn)發(fā),vpc公網(wǎng)ip為192.168.xxx.xx,并在相應(yīng)防火墻打開對(duì)應(yīng)端口(19092、19093、19093),比如:
192.168.xxx.xx:19092 -> 192.168.xxx.1:19092
192.168.xxx.xx:19093 -> 192.168.xxx.2:19092
192.168.xxx.xx:19094 -> 192.168.xxx.2:19092
測(cè)試
這時(shí),如果你通過vpc的公網(wǎng)ip和對(duì)應(yīng)端口連接私有網(wǎng)絡(luò)(內(nèi)網(wǎng))內(nèi)的kafka集群,192.168.xxx.xx:19092、192.168.xxx.xx:19093、192.168.xxx.xx:19094端口都是通的,但是訪問kafka發(fā)送或消費(fèi)消息時(shí),會(huì)報(bào)網(wǎng)絡(luò)超時(shí),這是為什么呢?
kafka producer端(客戶端)和server之間有個(gè)類似協(xié)商的階段, server會(huì)把lkafka配置文件里listeners這里的地址直接返給producer,producer再發(fā)數(shù)據(jù)給這個(gè)listeners地址。
因?yàn)閗afka客戶端是主動(dòng)發(fā)現(xiàn)集群地址的,當(dāng)你通過192.168.xxx.xx:19092、192.168.xxx.xx:19093、192.168.xxx.xx:19094確實(shí)是連接到kafka集群了,kafka集群返回給你的ip列表是你listeners配置的,也就是
192.168.xxx.1:19092
192.168.xxx.2:19092
192.168.xxx.3:19092
客戶端producer 在vpc這個(gè)私有網(wǎng)絡(luò)以外,producer 端通過ip轉(zhuǎn)發(fā)和端口都沒有用,producer 和vpc對(duì)應(yīng)的公網(wǎng)ip是通的,但是與vpc內(nèi)私有網(wǎng)絡(luò)不通,這就是訪問kafka發(fā)送或消費(fèi)消息時(shí)會(huì)報(bào)網(wǎng)絡(luò)超時(shí)等等的本質(zhì)原因。
解決
一種解決方式是客戶端通過域名映射的方式。
1.kafka配置:
修改kafka集群服務(wù)端各個(gè)節(jié)點(diǎn)的server.properties配置,注意listeners之后的ip和端口配置
config/server-1.properties:
broker.id=1
listeners=PLAINTEXT://kafka-1:19092
config/server-2.properties:
broker.id=2
listeners=PLAINTEXT://kafka-2:19093
config/server-3.properties:
broker.id=3
listeners=PLAINTEXT://kafka-3:19094
kafka集群的各個(gè)節(jié)點(diǎn)在服務(wù)端配置hosts
cat /etc/hosts
192.168.xxx.1 kafka-1
192.168.xxx.2 kafka-2
192.168.xxx.3 kafka-3
2.vpc做端口映射
kafka-1 映射至 192.168.xxx.1:19092
kafka-2 映射至 192.168.xxx.2:19093
kafka-3 映射至 192.168.xxx.3:19094
3.客戶端配置:
客戶端在host文件中把kafka01、kafka02、kafka03都映射到公網(wǎng)地址。這個(gè)很關(guān)鍵,上面提到過客戶端會(huì)獲取到kafka配置的元數(shù)據(jù) ,客戶端會(huì)獲取到 kafka-1、kafka-2、kafka-3 這3個(gè)hostname,之后生產(chǎn)或消費(fèi)數(shù)據(jù)會(huì)直接通過這個(gè)地址訪問。如果不把這三個(gè)hostname重新映射到公網(wǎng)IP,就不能成功生產(chǎn)或者消費(fèi)數(shù)據(jù)。
#/etc/hosts
192.168.xxx.xx kafka01 kafka02 kafka03
客戶端訪問kafka集群時(shí),獲取的是kafka-1:19092,kafka-2:19093,kafka-3:19094,通過客戶端配置的hosts映射,都轉(zhuǎn)成了對(duì)應(yīng)的外網(wǎng)的ip,因此就可以訪問了。
注意:端口要一致,hosts映射只轉(zhuǎn)ip。