kafka外网转发

原创 kafka
半兽人 发表于: 2019-09-24   最后更新时间: 2019-11-16 12:34:35  
{{totalSubscript}} 订阅,9068 游览

很多人都因为配置kafka外网转发而困扰,我这里统一讲一下原理和原因。

场景假设

比如你有一个kafka集群,在阿里云上,该集群有2个broker,AB

kafka集群:

  • A内网:172.10.0.2 外网:10.0.21.1
  • B内网:172.10.0.1 外网:10.0.21.2

server.properties配置

config/server-1.properties: 
    broker.id=1 
    listeners=PLAINTEXT://172.10.0.1:9092

config/server-2.properties: 
    broker.id=2 
    listeners=PLAINTEXT://172.10.0.2:9092
  • 配置内网地址即可,就可以通过外网访问了(10.0.21.1:9092 和 10.0.21.2:9092 可以通,但是如果用kafka客户端连接会报超时)

你想通过你的电脑来访问kafka集群,也就想访问10.0.21.1:909210.0.21.2:9092

注意,我额外加一层场景,转发,复杂一点,但是原理相同。

路由转发,比如:

11.10.21.1  -> 10.0.21.1
11.10.21.2  -> 10.0.21.2
  • 11.10.21.x 为又加了一层转发ip

测试

这时,如果你通过11.10.21.1:909211.10.21.2端口都是通的,但是访问kafka发送或消费消息时,会报网络超时,这是为什么呢?

因为kafka客户端是主动发现集群地址的,当你通过11.10.21.1:9092确实是连接到kafka集群了,kafka集群返回给你的ip列表是你listeners配置的,也就是

172.10.0.1:9092
172.10.0.2:9092

你的ip转发和端口都没有用,这就是所有转发外网等等的本质原因。

解决

最简单的方式是客户端通过域名映射的方式。

修改kafka集群服务端的server.properties配置

config/server-1.properties: 
    broker.id=1 
    listeners=PLAINTEXT://kafka-1:9092

config/server-2.properties: 
    broker.id=2 
    listeners=PLAINTEXT://kafka2:9092

kafka集群的服务端,配置hosts

cat /etc/hosts
172.10.0.1 kafka-1
172.10.0.2 kafka-2

本机客户端,配置hosts

cat /etc/hosts
11.10.21.1 kafka-1
11.10.21.2 kafka-2

客户端访问kafka集群时,获取的是kafka-1:9092kafka-2:9092,通过客户端配置的hosts映射,都转成了对应的外网的ip,因此就可以访问了。

注意:端口要一致,hosts映射只转ip。



您需要解锁本帖隐藏内容请: 点击这里
本帖隐藏的内容


上一条: kafka实战kerberos(笔记)
下一条: kafka实战SSL

秦时明月 3天前

服务端有三台,其中一台172.17.16.3有外网ip,kafka配置文件如下

host.name=172.17.16.3
advertised.listeners=PLAINTEXT://105.54.73.176:11092

如何能让外网客户端能访问到kafka集群?内网kafka集群是可以正常访问的?
之前的配置文件有加过

listeners=PLAINTEXT://:11092

但是外网客户端连接报了如下错误:

[root@localhost kafka_2.12-2.0.1]# bin/kafka-console-consumer.sh --topic measure_quantum --from-beginning --bootstrap-server 105.54.73.176:11092
[2021-05-08 10:47:29,028] WARN [Consumer clientId=consumer-1, groupId=console-consumer-69132] Error while fetching metadata with correlation id 2 : {measure_quantum=INVALID_REPLICATION_FACTOR} (org.apache.kafka.clients.NetworkClient)
半兽人 -> 秦时明月 3天前
listeners=PLAINTEXT://{内网地址}:11092

单节点kafka,配置内网就可以了,外网默认就可以访问到了。
多节点就按照文章的来。

秦时明月 -> 半兽人 3天前

大佬,实际是三个节点的集群,但是现在只有一台机器又外网ip,想问问有什么解决方案

秦时明月 -> 半兽人 3天前

用的版本是kafka_2.12-2.8.0,不知道和版本是不是有关系

半兽人 -> 秦时明月 3天前

只有一个外网出口...这做不到额。
因为客户端要和kafka对应的节点做长连接。

服务端三个节点,可以只配置kafka单个节点A对外转发吗,能不能客户端访问集群的时候只通过这一个节点A(只有一个服务器的外网ip)进行访问。目前我在3个节点的服务器上配置了节点A的hosts:172.10.0.1 kafka-1。然后客户端配置了节点A的外网hosts映射:11.10.21.1 kafka-1,连接配置bootstrap-servers: kafka-1:9092。但客户端访问节点A的时候却是报错了

到问题区描述一下报什么错吧。

倾耳倾听 1年前

映射外网之后端口不一致,这个怎么解决

ip一样端口不一样就写成172.10.0.1 kafka-1 kafka2 11.10.21.1 kafka-1 kafka-2就好了

提问